diff --git a/.gn b/.gn index d3d33b3e..7b9768eb 100644 --- a/.gn +++ b/.gn
@@ -68,11 +68,10 @@ # their includes checked for proper dependencies when you run either # "gn check" or "gn gen --check". no_check_targets = [ - "//headless:headless_non_renderer", # 9 errors - "//headless:headless_renderer", # 13 errors - "//headless:headless_shared_sources", # 4 errors - "//headless:headless_shell_browser_lib", # 10 errors - "//headless:headless_shell_lib", # 10 errors + "//headless:headless_non_renderer", # 2 errors + "//headless:headless_renderer", # 12 errors + "//headless:headless_shared_sources", # 2 errors + "//headless:headless_shell_browser_lib", # 1 errors # //v8, https://crbug.com/v8/7330 "//v8/src/inspector:inspector", # 20 errors
diff --git a/AUTHORS b/AUTHORS index fc7008f3..dec1468 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -1441,6 +1441,7 @@ Whist Technologies <*@whist.com> Xperi Corporation <*@xperi.com> Yandex LLC <*@yandex-team.ru> +Zhou Jun <zhoujun@uniontech.com> Zuckjet <zuckjet@gmail.com> # Please DO NOT APPEND here. See comments at the top of the file. # END organizations section.
diff --git a/BUILD.gn b/BUILD.gn index 0a7527e..9b2822c 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -1598,7 +1598,6 @@ "//third_party/catapult/devil/", "//third_party/catapult/dependency_manager/", "//third_party/catapult/third_party/typ/", - "//third_party/depot_tools/pylint", "//third_party/depot_tools/pylint-1.5", "//third_party/depot_tools/pylint_main.py", "//third_party/depot_tools/pylintrc",
diff --git a/DEPS b/DEPS index eee042e8..cf4c6ce2 100644 --- a/DEPS +++ b/DEPS
@@ -297,15 +297,15 @@ # 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': '505175112b9c33c99c26cc2e43fe05364f3a0916', + 'skia_revision': '7525ca09971982717161466016c07fabf9f267ed', # 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': '0b5366d9178b6334b7de044a22a8c5ebe9cf097b', + 'v8_revision': '1104a81a2a08c3b25b400d2ddf283573e14eb9e5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'bf3955820005b6b5c4d5ee13e2e9dcb28a72e72c', + 'angle_revision': 'c554b92b1751761abd2b2163571d8769c5d26a9d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -348,7 +348,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '90e1e39f50f9431e41fc3fb21b8d8f75fd5b4b9c', + 'freetype_revision': '7cd3f19f21cc9d600e3b765ef2058474d20233e2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -368,7 +368,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '1c7fc8f4bdb81fa561152ab0ecb2a5647cb08f8b', + 'catapult_revision': 'dd7b9e9e263ee40147814bbf38d7d2e2e0a914ba', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -376,7 +376,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': '7d8e56b11f9532e3b94d8bf5fee6477addd57209', + 'devtools_frontend_revision': '823a5cd09ca5871968a355b564b8bb106582dd48', # 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. @@ -460,7 +460,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. - 'libunwind_revision': '47974e9376bba4f11a790f134160813debbd9da5', + 'libunwind_revision': 'c38cbd4028118906853431635e8dbb74a90ad0a2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -483,7 +483,7 @@ 'libcxx_revision': '75bbec9f6d4f06c91eaf94aadafe9ad6520b1b20', # GN CIPD package version. - 'gn_version': 'git_revision:c8c63300ac8ecb66d8126af5407257209ae59044', + 'gn_version': 'git_revision:3d773bba0927e67eae8fdaee5e28b0f6203d3bee', } # Only these hosts are allowed for dependencies in this DEPS file. @@ -873,7 +873,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'b4o6CQ43wSB0wLS10qO2wit1ldcDktPcQLDMjE5BQGUC', + 'version': 'vCxCwgx-9hJnxnER3a54J6f_HKKzZ87B5XTvSq2LPugC', }, ], 'dep_type': 'cipd', @@ -1184,7 +1184,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2cd48234f1fdef2e61a06a7a43479fe8407baaf0', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '647cfe6bf10efa3e171bed867a455347567007c7', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1398,7 +1398,7 @@ Var('chromium_git') + '/external/libaddressinput.git' + '@' + 'df35d6c42da4fa2759e4cfb592afe33817993b89', 'src/third_party/libaom/source/libaom': - Var('aomedia_git') + '/aom.git' + '@' + '60e4e24a410da59c233fbe7dbc4fb8651e0b61d2', + Var('aomedia_git') + '/aom.git' + '@' + '121f3851459d5ee2ca1b5b23c6187bda79984eb2', 'src/third_party/libavif/src': Var('chromium_git') + '/external/github.com/AOMediaCodec/libavif.git' + '@' + Var('libavif_revision'), @@ -1732,7 +1732,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '05b229fc27194034b3f408b59943085f48093f35', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'b0a57d8e616213a6b8aa1efdd8681343acf12848', + Var('webrtc_git') + '/src.git' + '@' + '9801a93b08ae52a4f3043812a36f3b375181ac1b', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1805,7 +1805,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@dfca36d6bffa25679453e1ad9f237bdb3008dfe6', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@92d3d7bf199265d15441ce41f1291e598ef7fc44', 'condition': 'checkout_src_internal', }, @@ -1846,7 +1846,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'DrwWzDsMunQXK3bxOaiH0MAJegL3fWX1QdRvooPIZe0C', + 'version': 'pTtXmCT6pCQDy2Z0lHJNTWGGH5n-fjbP9MSHP2JQ62YC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/cookie_manager.cc b/android_webview/browser/cookie_manager.cc index 3b8f56e..f38f231f 100644 --- a/android_webview/browser/cookie_manager.cc +++ b/android_webview/browser/cookie_manager.cc
@@ -508,6 +508,25 @@ env, net::CanonicalCookie::BuildCookieLine(cookie_list)); } +ScopedJavaLocalRef<jobjectArray> CookieManager::GetCookieInfo( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const JavaParamRef<jstring>& url) { + GURL host(ConvertJavaStringToUTF16(env, url)); + + net::CookieList cookie_list; + ExecCookieTaskSync(base::BindOnce(&CookieManager::GetCookieListAsyncHelper, + base::Unretained(this), host, + &cookie_list)); + std::vector<std::string> cookie_attributes; + for (net::CanonicalCookie cookie : cookie_list) { + cookie_attributes.push_back( + net::CanonicalCookie::BuildCookieAttributesLine(cookie)); + } + return base::android::ToJavaArrayOfStrings( + env, base::span<const std::string>(cookie_attributes)); +} + void CookieManager::GetCookieListAsyncHelper(const GURL& host, net::CookieList* result, base::OnceClosure complete) {
diff --git a/android_webview/browser/cookie_manager.h b/android_webview/browser/cookie_manager.h index 6f1287ca..5dc2eb5 100644 --- a/android_webview/browser/cookie_manager.h +++ b/android_webview/browser/cookie_manager.h
@@ -8,6 +8,7 @@ #include <memory> #include <vector> +#include "base/android/jni_array.h" #include "base/android/scoped_java_ref.h" #include "base/containers/circular_deque.h" #include "base/files/file_path.h" @@ -126,6 +127,11 @@ const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jstring>& url); + base::android::ScopedJavaLocalRef<jobjectArray> GetCookieInfo( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jstring>& url); + void RemoveAllCookies( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj,
diff --git a/android_webview/java/src/org/chromium/android_webview/AwCookieManager.java b/android_webview/java/src/org/chromium/android_webview/AwCookieManager.java index bae4840..47640fd 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwCookieManager.java +++ b/android_webview/java/src/org/chromium/android_webview/AwCookieManager.java
@@ -15,6 +15,9 @@ import org.chromium.base.annotations.NativeMethods; import org.chromium.base.library_loader.LibraryLoader; +import java.util.Arrays; +import java.util.List; + /** * AwCookieManager manages cookies according to RFC2109 spec. * @@ -108,6 +111,17 @@ } /** + * Get the attributes of any cookie(s) for a given url. + * @param url The url for which the cookies are set. + * @return The cookies as a list of Strings formatted like http set cookie headers. + */ + public List<String> getCookieInfo(final String url) { + String[] cookies = AwCookieManagerJni.get().getCookieInfo( + mNativeCookieManager, AwCookieManager.this, url); + return Arrays.asList(cookies); + } + + /** * Remove all session cookies, the cookies without an expiration date. * The value of the callback is true iff at least one cookie was removed. * @param callback A callback called after the cookies (if any) are removed. @@ -268,6 +282,7 @@ void setCookieSync( long nativeCookieManager, AwCookieManager caller, String url, String value); String getCookie(long nativeCookieManager, AwCookieManager caller, String url); + String[] getCookieInfo(long nativeCookieManager, AwCookieManager caller, String url); void removeSessionCookies( long nativeCookieManager, AwCookieManager caller, CookieCallback callback); void removeSessionCookiesSync(long nativeCookieManager, AwCookieManager caller);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java index 957f3bb..1fd8438b 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
@@ -39,11 +39,15 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.TimeZone; /** * Tests for the CookieManager. @@ -308,6 +312,69 @@ @Test @MediumTest @Feature({"AndroidWebView", "Privacy"}) + public void testGetCookieInfo_singleCookie() { + final String url = "http://www.example.com"; + final String formattedDate = getHttpCookieExpiryDate(); + + final String cookieString = + "cookie=test; Domain=.example.com; Path=/; Expires=" + formattedDate; + final String expected = + "cookie=test; domain=.example.com; path=/; expires=" + formattedDate; + + allowThirdPartyCookies(mAwContents); + mCookieManager.setCookie(url, cookieString); + List<String> cookieInfo = mCookieManager.getCookieInfo(url); + + Assert.assertNotNull(cookieInfo); + Assert.assertEquals(expected, cookieInfo.get(0)); + } + + @Test + @MediumTest + @Feature({"AndroidWebView", "Privacy"}) + public void testGetCookieInfo_twoCookies() { + final String url = "http://www.example.com"; + final String formattedDate = getHttpCookieExpiryDate(); + + final String cookie1String = + "cookie1=test1; Domain=example.com; Path=/; Expires=" + formattedDate; + final String cookie2String = + "cookie2=test2; SameSite=Lax; HttpOnly; Expires=" + formattedDate; + final String expected1 = + "cookie1=test1; domain=.example.com; path=/; expires=" + formattedDate; + final String expected2 = "cookie2=test2; domain=www.example.com; path=/; expires=" + + formattedDate + "; httponly; samesite=lax"; + + allowThirdPartyCookies(mAwContents); + mCookieManager.setCookie(url, cookie1String); + mCookieManager.setCookie(url, cookie2String); + List<String> cookieInfo = mCookieManager.getCookieInfo(url); + + Assert.assertNotNull(cookieInfo); + Assert.assertEquals(expected1, cookieInfo.get(0)); + Assert.assertEquals(expected2, cookieInfo.get(1)); + } + + @Test + @MediumTest + @Feature({"AndroidWebView", "Privacy"}) + public void testGetCookieInfo_emptyCookie() { + final String url = "http://www.example.com"; + + final String cookieString = "cookie1=test1"; + final String expected = "cookie1=test1; domain=www.example.com; path=/"; + + allowThirdPartyCookies(mAwContents); + mCookieManager.setCookie(url, cookieString); + List<String> cookieInfo = mCookieManager.getCookieInfo(url); + + Assert.assertNotNull(cookieInfo); + Assert.assertEquals(expected, cookieInfo.get(0)); + } + + @Test + @MediumTest + @Feature({"AndroidWebView", "Privacy"}) public void testSetCookie() { Assert.assertEquals( 0, RecordHistogram.getHistogramTotalCountForTesting(SECURE_COOKIE_HISTOGRAM_NAME)); @@ -1521,6 +1588,24 @@ } /** + * @return an expiry date in the standard IMF-fixdate format defined by RFC 7231. The expiry + * date will outlive the test so that it can be read during the test. + */ + private String getHttpCookieExpiryDate() { + final DateFormat format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z"); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + Date expiry = new Date(); + expiry.setTime(expiry.getTime() + CookieLifetime.OUTLIVE_THE_TEST_SEC * 1000); + String formattedDate = format.format(expiry); + // On some platforms, getting the date string includes '+00:00' at the end but the cookie + // API does not return this so we want to remove it if it is present. + if (formattedDate.endsWith("+00:00")) { + formattedDate = formattedDate.substring(0, formattedDate.length() - 6); + } + return formattedDate; + } + + /** * Asserts there are no cookies set for the given URL. This makes no assertions about other * URLs. *
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 9c4dfbe..bde1b38f 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -191,6 +191,8 @@ "ambient/ui/ambient_animation_background_color.h", "ambient/ui/ambient_animation_player.cc", "ambient/ui/ambient_animation_player.h", + "ambient/ui/ambient_animation_progress_tracker.cc", + "ambient/ui/ambient_animation_progress_tracker.h", "ambient/ui/ambient_animation_resizer.cc", "ambient/ui/ambient_animation_resizer.h", "ambient/ui/ambient_animation_shield_controller.cc", @@ -2528,6 +2530,7 @@ "ambient/model/ambient_topic_queue_unittest.cc", "ambient/ui/ambient_animation_attribution_transformer_unittest.cc", "ambient/ui/ambient_animation_background_color_unittest.cc", + "ambient/ui/ambient_animation_progress_tracker_unittest.cc", "ambient/ui/ambient_animation_resizer_unittest.cc", "ambient/ui/ambient_animation_shield_controller_unittest.cc", "ambient/ui/ambient_container_view_unittest.cc",
diff --git a/ash/accessibility/accessibility_controller_impl.h b/ash/accessibility/accessibility_controller_impl.h index 638038d..b785d786 100644 --- a/ash/accessibility/accessibility_controller_impl.h +++ b/ash/accessibility/accessibility_controller_impl.h
@@ -354,9 +354,6 @@ // Toggle dictation. void ToggleDictation(); - // Cancels all current and queued speech immediately. - void SilenceSpokenFeedback(); - // Called when we first detect two fingers are held down, which can be used to // toggle spoken feedback on some touch-only devices. void OnTwoFingerTouchStart(); @@ -462,6 +459,7 @@ const absl::optional<std::u16string>& text, const absl::optional<std::vector<DictationBubbleHintType>>& hints) override; + void SilenceSpokenFeedback() override; // SessionObserver: void OnSigninScreenPrefServiceInitialized(PrefService* prefs) override;
diff --git a/ash/ambient/ambient_controller.cc b/ash/ambient/ambient_controller.cc index 1390dcf..da061ea 100644 --- a/ash/ambient/ambient_controller.cc +++ b/ash/ambient/ambient_controller.cc
@@ -17,6 +17,7 @@ #include "ash/ambient/model/ambient_topic_queue_animation_delegate.h" #include "ash/ambient/model/ambient_topic_queue_slideshow_delegate.h" #include "ash/ambient/resources/ambient_animation_static_resources.h" +#include "ash/ambient/ui/ambient_animation_progress_tracker.h" #include "ash/ambient/ui/ambient_container_view.h" #include "ash/ambient/ui/ambient_view_delegate.h" #include "ash/ambient/util/ambient_util.h" @@ -638,11 +639,15 @@ fingerprint_->AddFingerprintObserver( fingerprint_observer_receiver_.BindNewPipeAndPassRemote()); + ambient_animation_progress_tracker_ = + std::make_unique<AmbientAnimationProgressTracker>(); } else { DVLOG(1) << "Ambient mode disabled"; CloseUi(); + ambient_animation_progress_tracker_.reset(); + for (const auto* pref_name : {ambient::prefs::kAmbientModeLockScreenBackgroundTimeoutSeconds, ambient::prefs::kAmbientModeLockScreenInactivityTimeoutSeconds, @@ -797,7 +802,7 @@ aura::Window* container) { AmbientAnimationTheme current_theme = GetCurrentTheme(); auto container_view = std::make_unique<AmbientContainerView>( - &delegate_, + &delegate_, ambient_animation_progress_tracker_.get(), AmbientAnimationStaticResources::Create(current_theme, /*serializable=*/true), multi_screen_metrics_recorder_.get());
diff --git a/ash/ambient/ambient_controller.h b/ash/ambient/ambient_controller.h index 6d033c8..f4f6d280 100644 --- a/ash/ambient/ambient_controller.h +++ b/ash/ambient/ambient_controller.h
@@ -44,6 +44,7 @@ namespace ash { +class AmbientAnimationProgressTracker; class AmbientBackendController; class AmbientContainerView; class AmbientMultiScreenMetricsRecorder; @@ -203,6 +204,8 @@ std::unique_ptr<AmbientBackendController> ambient_backend_controller_; std::unique_ptr<AmbientPhotoController> ambient_photo_controller_; std::unique_ptr<AmbientWeatherController> ambient_weather_controller_; + std::unique_ptr<AmbientAnimationProgressTracker> + ambient_animation_progress_tracker_; // Monitors the device inactivity and controls the auto-show of ambient. base::OneShotTimer inactivity_timer_;
diff --git a/ash/ambient/ui/ambient_animation_player.cc b/ash/ambient/ui/ambient_animation_player.cc index 4f93d99c..cb2fa988 100644 --- a/ash/ambient/ui/ambient_animation_player.cc +++ b/ash/ambient/ui/ambient_animation_player.cc
@@ -5,7 +5,9 @@ #include "ash/ambient/ui/ambient_animation_player.h" #include <string> +#include <utility> +#include "ash/ambient/ui/ambient_animation_progress_tracker.h" #include "ash/public/cpp/ambient/ambient_ui_model.h" #include "ash/utility/lottie_util.h" #include "base/check.h" @@ -49,32 +51,57 @@ } // namespace AmbientAnimationPlayer::AmbientAnimationPlayer( - views::AnimatedImageView* animated_image_view) - : animated_image_view_(animated_image_view) { + views::AnimatedImageView* animated_image_view, + AmbientAnimationProgressTracker* progress_tracker) + : animated_image_view_(animated_image_view), + progress_tracker_(progress_tracker) { DCHECK(animated_image_view_); lottie::Animation* animation = animated_image_view_->animated_image(); DCHECK(animation); - absl::optional<base::TimeDelta> cycle_restart_timestamp_found = - FindCycleRestartTimestamp(*animation->skottie()); - if (cycle_restart_timestamp_found.has_value()) { - cycle_restart_timestamp_ = *cycle_restart_timestamp_found; - if (cycle_restart_timestamp_ >= animation->GetAnimationDuration()) { - LOG(DFATAL) << "Animation has invalid cycle restart timestamp " - << cycle_restart_timestamp_ << ". Total cycle duration " - << animation->GetAnimationDuration(); - } + DCHECK(progress_tracker_); + lottie::Animation::PlaybackConfig playback_config; + // If there are existing animations in this ambient mode session, start + // playing from the existing animations' timestamps. This gives rough + // synchronization across animations. The animations' timestamps should not + // diverge over time because AnimatedImageView makes time steps that + // ultimately reflect real time (i.e. it does not step by a fixed amount each + // frame). Thus, there may be transient periods where the animations diverge + // due to random system instability, but they should all converge again + // eventually. + if (progress_tracker_->HasActiveAnimations()) { + AmbientAnimationProgressTracker::ImmutableParams immutable_params = + progress_tracker_->GetImmutableParams(); + AmbientAnimationProgressTracker::Progress global_progress = + progress_tracker_->GetGlobalProgress(); + playback_config = { + immutable_params.scheduled_cycles, + global_progress.current_timestamp * immutable_params.total_duration, + global_progress.num_completed_cycles, immutable_params.style}; } else { - DVLOG(1) << "Restart marker not found in animation. Defaulting to cycle " - "restart at timestamp 0"; - DCHECK(cycle_restart_timestamp_.is_zero()); + absl::optional<base::TimeDelta> cycle_restart_timestamp_found = + FindCycleRestartTimestamp(*animation->skottie()); + if (cycle_restart_timestamp_found.has_value()) { + cycle_restart_timestamp_ = *cycle_restart_timestamp_found; + if (cycle_restart_timestamp_ >= animation->GetAnimationDuration()) { + LOG(DFATAL) << "Animation has invalid cycle restart timestamp " + << cycle_restart_timestamp_ << ". Total cycle duration " + << animation->GetAnimationDuration(); + } + } else { + DVLOG(1) << "Restart marker not found in animation. Defaulting to cycle " + "restart at timestamp 0"; + DCHECK(cycle_restart_timestamp_.is_zero()); + } + playback_config = lottie::Animation::PlaybackConfig( + {{base::TimeDelta(), animation->GetAnimationDuration()}, + {cycle_restart_timestamp_, animation->GetAnimationDuration()}}, + /*initial_offset=*/base::TimeDelta(), /*initial_completed_cycles=*/0, + lottie::Animation::Style::kLoop); } animation->SetPlaybackSpeed( AmbientUiModel::Get()->animation_playback_speed()); - animated_image_view_->Play(lottie::Animation::PlaybackConfig( - {{base::TimeDelta(), animation->GetAnimationDuration()}, - {cycle_restart_timestamp_, animation->GetAnimationDuration()}}, - /*initial_offset=*/base::TimeDelta(), - /*initial_completed_cycles=*/0, lottie::Animation::Style::kLoop)); + progress_tracker_->RegisterAnimation(animation); + animated_image_view_->Play(std::move(playback_config)); } AmbientAnimationPlayer::~AmbientAnimationPlayer() {
diff --git a/ash/ambient/ui/ambient_animation_player.h b/ash/ambient/ui/ambient_animation_player.h index 4ae4ae2..64b05f8 100644 --- a/ash/ambient/ui/ambient_animation_player.h +++ b/ash/ambient/ui/ambient_animation_player.h
@@ -16,6 +16,8 @@ namespace ash { +class AmbientAnimationProgressTracker; + // Plays an AnimatedImageView in a loop until destruction. The "looping" logic // meets ambient mode's custom requirements: The lottie animation may optionally // have a "marker" embedded in it. The "marker" is a timestamp set by the motion @@ -42,13 +44,15 @@ public: // Starts playing the |animated_image_view| immediately upon construction. explicit AmbientAnimationPlayer( - views::AnimatedImageView* animated_image_view); + views::AnimatedImageView* animated_image_view, + AmbientAnimationProgressTracker* progress_tracker); AmbientAnimationPlayer(const AmbientAnimationPlayer&) = delete; AmbientAnimationPlayer& operator=(const AmbientAnimationPlayer&) = delete; ~AmbientAnimationPlayer(); private: const base::raw_ptr<views::AnimatedImageView> animated_image_view_; + const base::raw_ptr<AmbientAnimationProgressTracker> progress_tracker_; base::TimeDelta cycle_restart_timestamp_; };
diff --git a/ash/ambient/ui/ambient_animation_progress_tracker.cc b/ash/ambient/ui/ambient_animation_progress_tracker.cc new file mode 100644 index 0000000..f3afac7 --- /dev/null +++ b/ash/ambient/ui/ambient_animation_progress_tracker.cc
@@ -0,0 +1,147 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/ambient/ui/ambient_animation_progress_tracker.h" + +#include <utility> + +#include "base/check.h" +#include "base/logging.h" +#include "base/notreached.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace ash { + +AmbientAnimationProgressTracker::ImmutableParams::ImmutableParams() = default; + +AmbientAnimationProgressTracker::ImmutableParams::ImmutableParams( + const ImmutableParams& other) = default; + +AmbientAnimationProgressTracker::ImmutableParams& +AmbientAnimationProgressTracker::ImmutableParams::operator=( + const ImmutableParams& other) = default; + +AmbientAnimationProgressTracker::ImmutableParams::~ImmutableParams() = default; + +AmbientAnimationProgressTracker::AmbientAnimationProgressTracker() = default; + +AmbientAnimationProgressTracker::~AmbientAnimationProgressTracker() = default; + +void AmbientAnimationProgressTracker::RegisterAnimation( + lottie::Animation* animation) { + DCHECK(animation); + DCHECK(!animation_observations_.IsObservingSource(animation)); + animation_observations_.AddObservation(animation); + if (animation->GetPlaybackConfig()) { + // The parameters verified here all concern "time" in the animation in some + // form. They must match so that the "progress" returned by + // GetGlobalProgress() has the same frame of reference across all + // animations. Each animation's parameters are verified one time. + VerifyAnimationImmutableParams(*animation); + started_animations_.insert(animation); + } else { + DVLOG(4) << "Animation has not been Start()ed yet. Will be verified in " + "AnimationWillStartPlaying() later."; + uninitialized_animations_.insert(animation); + } +} + +bool AmbientAnimationProgressTracker::HasActiveAnimations() const { + // Some of the started animations may not have painted a single frame yet. If + // this is the case, GetCurrentProgress() will be null, so at least one of + // them must return a non-null value for GetGlobalProgress() to return a valid + // value. + for (const lottie::Animation* animation : started_animations_) { + if (animation->GetCurrentProgress()) + return true; + } + return false; +} + +AmbientAnimationProgressTracker::Progress +AmbientAnimationProgressTracker::GetGlobalProgress() const { + // Currently, the method for picking one "global" progress is trivial. It just + // picks an arbitrary animation in the group because in practice, their + // timestamps should not have diverged by an amount that is user-perceptible + // (ex: less than 100 ms). If it's needed in the future, we can do something + // more complex here like taking the median or mean progress of all + // animations. But the complexity is currently not justified. + for (const lottie::Animation* animation : started_animations_) { + if (animation->GetCurrentProgress()) { + DCHECK(animation->GetNumCompletedCycles()); + return {*animation->GetNumCompletedCycles(), + *animation->GetCurrentProgress()}; + } + } + NOTREACHED() << "HasActiveAnimations() must be true before calling " + "GetGlobalProgress()"; + return Progress(); +} + +AmbientAnimationProgressTracker::ImmutableParams +AmbientAnimationProgressTracker::GetImmutableParams() const { + DCHECK(HasActiveAnimations()); + // The animation picked here is arbitrary since they all should have the same + // immutable params. + const lottie::Animation* animation = *started_animations_.begin(); + auto playback_config = animation->GetPlaybackConfig(); + ImmutableParams params; + params.total_duration = animation->GetAnimationDuration(); + params.scheduled_cycles = playback_config->scheduled_cycles; + params.style = playback_config->style; + return params; +} + +void AmbientAnimationProgressTracker::AnimationWillStartPlaying( + const lottie::Animation* animation) { + DCHECK(animation_observations_.IsObservingSource( + const_cast<lottie::Animation*>(animation))); + VerifyAnimationImmutableParams(*animation); + DCHECK(uninitialized_animations_.contains(animation)); + DCHECK(!started_animations_.contains(animation)); + uninitialized_animations_.erase(animation); + started_animations_.insert(animation); +} + +void AmbientAnimationProgressTracker::AnimationIsDeleting( + const lottie::Animation* animation) { + DCHECK(animation_observations_.IsObservingSource( + const_cast<lottie::Animation*>(animation))); + animation_observations_.RemoveObservation( + const_cast<lottie::Animation*>(animation)); + started_animations_.erase(animation); + uninitialized_animations_.erase(animation); +} + +void AmbientAnimationProgressTracker::VerifyAnimationImmutableParams( + const lottie::Animation& animation) const { + DCHECK(!started_animations_.contains(&animation)); + if (started_animations_.empty()) { + DVLOG(4) << "Incoming animation is the first started in the session. No " + "need to verify against other animations"; + return; + } + // The animation picked here is arbitrary since all existing animations should + // have gone through this method, verifying that all of their immutable params + // match. + const lottie::Animation* existing_animation = *started_animations_.begin(); + DCHECK_EQ(animation.GetAnimationDuration(), + existing_animation->GetAnimationDuration()); + auto incoming_playback_config = animation.GetPlaybackConfig(); + auto existing_playback_config = animation.GetPlaybackConfig(); + DCHECK(incoming_playback_config); + DCHECK(existing_playback_config); + DCHECK_EQ(incoming_playback_config->scheduled_cycles.size(), + existing_playback_config->scheduled_cycles.size()); + for (size_t i = 0; i < incoming_playback_config->scheduled_cycles.size(); + ++i) { + DCHECK_EQ(incoming_playback_config->scheduled_cycles[i].start_offset, + existing_playback_config->scheduled_cycles[i].start_offset); + DCHECK_EQ(incoming_playback_config->scheduled_cycles[i].end_offset, + existing_playback_config->scheduled_cycles[i].end_offset); + } + DCHECK_EQ(incoming_playback_config->style, existing_playback_config->style); +} + +} // namespace ash
diff --git a/ash/ambient/ui/ambient_animation_progress_tracker.h b/ash/ambient/ui/ambient_animation_progress_tracker.h new file mode 100644 index 0000000..0f7f1be --- /dev/null +++ b/ash/ambient/ui/ambient_animation_progress_tracker.h
@@ -0,0 +1,95 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_AMBIENT_UI_AMBIENT_ANIMATION_PROGRESS_TRACKER_H_ +#define ASH_AMBIENT_UI_AMBIENT_ANIMATION_PROGRESS_TRACKER_H_ + +#include "ash/ash_export.h" +#include "base/containers/flat_set.h" +#include "base/scoped_multi_source_observation.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/lottie/animation.h" +#include "ui/lottie/animation_observer.h" + +namespace ash { + +// Observes the progress of the N active lottie animations rendering during +// ambient mode and condenses all of their progress into one global number +// representative of the current progress of all N animations. The method for +// condensing the N timestamps into one is an internal implementation detail. +// +// AmbientAnimationProgressTracker is meant to be a long-lived class whose +// lifetime can span multiple ambient mode sessions if desired. +class ASH_EXPORT AmbientAnimationProgressTracker + : public lottie::AnimationObserver { + public: + struct Progress { + // The number of cycles the animation has completed thus far. + int num_completed_cycles = 0; + + // The normalized timestamp of the most recent frame that the animation + // has painted within the animation's current cycle. + float current_timestamp = 0.f; + }; + + // Parameters for the currently active ambient session that do not change for + // the duration of the session. All animations in the session are guaranteed + // to share the same values for these parameters. A fatal error is raised if a + // discrepancy is detected. + struct ImmutableParams { + ImmutableParams(); + ImmutableParams(const ImmutableParams& other); + ImmutableParams& operator=(const ImmutableParams& other); + ~ImmutableParams(); + + // The total duration of the animation file. + base::TimeDelta total_duration; + + // A subset of lottie::Animation::PlaybackConfig that should be the same for + // all N animations. + std::vector<lottie::Animation::CycleBoundaries> scheduled_cycles; + lottie::Animation::Style style = lottie::Animation::Style::kLoop; + }; + + AmbientAnimationProgressTracker(); + AmbientAnimationProgressTracker(const AmbientAnimationProgressTracker&) = + delete; + AmbientAnimationProgressTracker& operator=( + const AmbientAnimationProgressTracker&) = delete; + ~AmbientAnimationProgressTracker() override; + + // Registers an |animation| to track. The |animation| may be destroyed either + // before or after AmbientAnimationProgressTracker. The tracker automatically + // stops tracking the |animation| when the animation is destroyed. + void RegisterAnimation(lottie::Animation* animation); + + // Whether the tracker has detected at least one animation in the current + // ambient session. + bool HasActiveAnimations() const; + + // HasActiveAnimations() must be true before calling the methods below: + // + // The condensed progress of all active animations. + Progress GetGlobalProgress() const; + ImmutableParams GetImmutableParams() const; + + private: + // lottie::AnimationObserver implementation: + void AnimationWillStartPlaying(const lottie::Animation* animation) override; + void AnimationIsDeleting(const lottie::Animation* animation) override; + + void VerifyAnimationImmutableParams(const lottie::Animation& animation) const; + + base::ScopedMultiSourceObservation<lottie::Animation, + lottie::AnimationObserver> + animation_observations_{this}; + // Registered animations that have been Start()ed. + base::flat_set<const lottie::Animation*> started_animations_; + // Registered animations that have not been Start()ed yet. + base::flat_set<const lottie::Animation*> uninitialized_animations_; +}; + +} // namespace ash + +#endif // ASH_AMBIENT_UI_AMBIENT_ANIMATION_PROGRESS_TRACKER_H_
diff --git a/ash/ambient/ui/ambient_animation_progress_tracker_unittest.cc b/ash/ambient/ui/ambient_animation_progress_tracker_unittest.cc new file mode 100644 index 0000000..db053a2c --- /dev/null +++ b/ash/ambient/ui/ambient_animation_progress_tracker_unittest.cc
@@ -0,0 +1,190 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/ambient/ui/ambient_animation_progress_tracker.h" + +#include "base/memory/scoped_refptr.h" +#include "base/time/time.h" +#include "cc/paint/skottie_wrapper.h" +#include "cc/test/skia_common.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/geometry/size.h" +#include "ui/lottie/animation.h" + +namespace ash { +namespace { + +constexpr float kTimestampEpsilon = .001f; + +using ::testing::AllOf; +using ::testing::Eq; +using ::testing::FloatEq; +using ::testing::Ge; +using ::testing::Le; +using ::testing::SizeIs; + +class AmbientAnimationProgressTrackerTest : public ::testing::Test { + protected: + static constexpr gfx::Size kAnimationSize = gfx::Size(100, 100); + + AmbientAnimationProgressTrackerTest() + : clock_(base::TimeTicks::Now()), + canvas_(kAnimationSize, /*image_scale=*/1.f, /*is_opaque=*/false) {} + + scoped_refptr<cc::SkottieWrapper> CreateSkottie(int duration_secs) { + return cc::CreateSkottie(kAnimationSize, duration_secs); + } + + void Paint(lottie::Animation& animation) { + animation.Paint(&canvas_, clock_, kAnimationSize); + } + + base::TimeTicks clock_; + gfx::Canvas canvas_; + AmbientAnimationProgressTracker tracker_; +}; + +TEST_F(AmbientAnimationProgressTrackerTest, SingleAnimation) { + AmbientAnimationProgressTracker tracker; + lottie::Animation animation(CreateSkottie(/*duration_secs=*/10)); + tracker.RegisterAnimation(&animation); + ASSERT_FALSE(tracker.HasActiveAnimations()); + animation.Start(); + Paint(animation); + ASSERT_TRUE(tracker.HasActiveAnimations()); + AmbientAnimationProgressTracker::ImmutableParams immutable_params = + tracker.GetImmutableParams(); + AmbientAnimationProgressTracker::Progress global_progress = + tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(0)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(0.f)); + EXPECT_THAT(immutable_params.total_duration, Eq(base::Seconds(10))); + ASSERT_THAT(immutable_params.scheduled_cycles, SizeIs(1)); + EXPECT_THAT(immutable_params.scheduled_cycles.front().start_offset, + Eq(base::TimeDelta())); + EXPECT_THAT(immutable_params.scheduled_cycles.front().end_offset, + Eq(base::Seconds(10))); + EXPECT_THAT(immutable_params.style, Eq(lottie::Animation::Style::kLoop)); + + clock_ += base::Seconds(5); + Paint(animation); + global_progress = tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(0)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(.5f)); + + clock_ += base::Seconds(5); + Paint(animation); + global_progress = tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(1)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(0.f)); + + clock_ += base::Seconds(5); + Paint(animation); + global_progress = tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(1)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(.5f)); +} + +TEST_F(AmbientAnimationProgressTrackerTest, MultipleAnimations) { + AmbientAnimationProgressTracker tracker; + lottie::Animation animation_1(CreateSkottie(/*duration_secs=*/10)); + lottie::Animation animation_2(CreateSkottie(/*duration_secs=*/10)); + tracker.RegisterAnimation(&animation_1); + tracker.RegisterAnimation(&animation_2); + ASSERT_FALSE(tracker.HasActiveAnimations()); + animation_1.Start(); + animation_2.Start(); + Paint(animation_1); + Paint(animation_2); + ASSERT_TRUE(tracker.HasActiveAnimations()); + AmbientAnimationProgressTracker::ImmutableParams immutable_params = + tracker.GetImmutableParams(); + AmbientAnimationProgressTracker::Progress global_progress = + tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(0)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(0.f)); + EXPECT_THAT(immutable_params.total_duration, Eq(base::Seconds(10))); + ASSERT_THAT(immutable_params.scheduled_cycles, SizeIs(1)); + EXPECT_THAT(immutable_params.scheduled_cycles.front().start_offset, + Eq(base::TimeDelta())); + EXPECT_THAT(immutable_params.scheduled_cycles.front().end_offset, + Eq(base::Seconds(10))); + EXPECT_THAT(immutable_params.style, Eq(lottie::Animation::Style::kLoop)); + + clock_ += base::Seconds(5); + Paint(animation_1); + clock_ += base::Milliseconds(100); + Paint(animation_2); + global_progress = tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(0)); + EXPECT_THAT(global_progress.current_timestamp, + AllOf(Ge(.5f - kTimestampEpsilon), Le(.51f + kTimestampEpsilon))); + + clock_ += base::Seconds(5) - base::Milliseconds(100); + Paint(animation_1); + Paint(animation_2); + global_progress = tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(1)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(.0f)); + + clock_ += base::Seconds(2); + Paint(animation_2); + clock_ += base::Seconds(1); + Paint(animation_1); + global_progress = tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(1)); + EXPECT_THAT(global_progress.current_timestamp, + AllOf(Ge(.2f - kTimestampEpsilon), Le(.3f + kTimestampEpsilon))); +} + +TEST_F(AmbientAnimationProgressTrackerTest, AnimationsDestroyed) { + AmbientAnimationProgressTracker tracker; + auto animation_1 = + std::make_unique<lottie::Animation>(CreateSkottie(/*duration_secs=*/10)); + auto animation_2 = + std::make_unique<lottie::Animation>(CreateSkottie(/*duration_secs=*/10)); + tracker.RegisterAnimation(animation_1.get()); + tracker.RegisterAnimation(animation_2.get()); + animation_1->Start(); + animation_2->Start(); + Paint(*animation_1); + Paint(*animation_2); + + clock_ += base::Seconds(5); + Paint(*animation_1); + clock_ += base::Milliseconds(100); + Paint(*animation_2); + + animation_1.reset(); + AmbientAnimationProgressTracker::Progress global_progress = + tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(0)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(.51f)); + + animation_2.reset(); + EXPECT_FALSE(tracker.HasActiveAnimations()); + + auto animation_3 = + std::make_unique<lottie::Animation>(CreateSkottie(/*duration_secs=*/20)); + auto animation_4 = + std::make_unique<lottie::Animation>(CreateSkottie(/*duration_secs=*/20)); + tracker.RegisterAnimation(animation_3.get()); + tracker.RegisterAnimation(animation_4.get()); + animation_3->Start(); + animation_4->Start(); + Paint(*animation_3); + Paint(*animation_4); + + clock_ += base::Seconds(5); + Paint(*animation_3); + Paint(*animation_4); + global_progress = tracker.GetGlobalProgress(); + EXPECT_THAT(global_progress.num_completed_cycles, Eq(0)); + EXPECT_THAT(global_progress.current_timestamp, FloatEq(.25f)); +} + +} // namespace +} // namespace ash
diff --git a/ash/ambient/ui/ambient_animation_view.cc b/ash/ambient/ui/ambient_animation_view.cc index 6bb7f63..ecfeb27 100644 --- a/ash/ambient/ui/ambient_animation_view.cc +++ b/ash/ambient/ui/ambient_animation_view.cc
@@ -175,9 +175,11 @@ AmbientAnimationView::AmbientAnimationView( AmbientViewDelegateImpl* view_delegate, + AmbientAnimationProgressTracker* progress_tracker, std::unique_ptr<const AmbientAnimationStaticResources> static_resources, AmbientMultiScreenMetricsRecorder* multi_screen_metrics_recorder) : view_delegate_(view_delegate), + progress_tracker_(progress_tracker), static_resources_(std::move(static_resources)), animation_photo_provider_(static_resources_.get(), view_delegate->GetAmbientBackendModel()), @@ -372,8 +374,8 @@ animation_player_.reset(); // |animated_image_view_| is owned by the base |View| class and outlives the // |animation_player_|, so it's safe to pass a raw ptr here. - animation_player_ = - std::make_unique<AmbientAnimationPlayer>(animated_image_view_); + animation_player_ = std::make_unique<AmbientAnimationPlayer>( + animated_image_view_, progress_tracker_.get()); view_delegate_->NotifyObserversMarkerHit( AmbientPhotoConfig::Marker::kUiStartRendering); last_jitter_timestamp_ = base::TimeTicks::Now();
diff --git a/ash/ambient/ui/ambient_animation_view.h b/ash/ambient/ui/ambient_animation_view.h index 7fbe307b..29cdbc0 100644 --- a/ash/ambient/ui/ambient_animation_view.h +++ b/ash/ambient/ui/ambient_animation_view.h
@@ -30,6 +30,7 @@ class AmbientAnimationAttributionProvider; class AmbientAnimationPlayer; +class AmbientAnimationProgressTracker; class AmbientAnimationStaticResources; class AmbientAnimationShieldController; class AmbientMultiScreenMetricsRecorder; @@ -43,6 +44,7 @@ AmbientAnimationView( AmbientViewDelegateImpl* view_delegate, + AmbientAnimationProgressTracker* progress_tracker, std::unique_ptr<const AmbientAnimationStaticResources> static_resources, AmbientMultiScreenMetricsRecorder* multi_screen_metrics_recorder); AmbientAnimationView(const AmbientAnimationView&) = delete; @@ -62,7 +64,7 @@ void ApplyJitter(); const base::raw_ptr<AmbientViewDelegateImpl> view_delegate_; - + const base::raw_ptr<AmbientAnimationProgressTracker> progress_tracker_; const std::unique_ptr<const AmbientAnimationStaticResources> static_resources_; AmbientAnimationPhotoProvider animation_photo_provider_;
diff --git a/ash/ambient/ui/ambient_container_view.cc b/ash/ambient/ui/ambient_container_view.cc index d7821f0..36e709bc 100644 --- a/ash/ambient/ui/ambient_container_view.cc +++ b/ash/ambient/ui/ambient_container_view.cc
@@ -29,6 +29,7 @@ AmbientContainerView::AmbientContainerView( AmbientViewDelegateImpl* delegate, + AmbientAnimationProgressTracker* progress_tracker, std::unique_ptr<AmbientAnimationStaticResources> animation_static_resources, AmbientMultiScreenMetricsRecorder* multi_screen_metrics_recorder) { DCHECK(delegate); @@ -50,7 +51,7 @@ : AmbientAnimationTheme::kSlideshow; if (animation_static_resources) { main_rendering_view = AddChildView(std::make_unique<AmbientAnimationView>( - delegate, std::move(animation_static_resources), + delegate, progress_tracker, std::move(animation_static_resources), multi_screen_metrics_recorder)); } else { main_rendering_view = AddChildView(std::make_unique<PhotoView>(delegate));
diff --git a/ash/ambient/ui/ambient_container_view.h b/ash/ambient/ui/ambient_container_view.h index 767bb33..72ea997 100644 --- a/ash/ambient/ui/ambient_container_view.h +++ b/ash/ambient/ui/ambient_container_view.h
@@ -12,6 +12,7 @@ namespace ash { +class AmbientAnimationProgressTracker; class AmbientAnimationStaticResources; class AmbientMultiScreenMetricsRecorder; class AmbientViewDelegateImpl; @@ -31,6 +32,7 @@ // slideshow UI should be rendered instead. AmbientContainerView( AmbientViewDelegateImpl* delegate, + AmbientAnimationProgressTracker* progress_tracker, std::unique_ptr<AmbientAnimationStaticResources> animation_static_resources, AmbientMultiScreenMetricsRecorder* multi_screen_metrics_recorder);
diff --git a/ash/app_list/views/app_list_bubble_apps_page.cc b/ash/app_list/views/app_list_bubble_apps_page.cc index a0c4520e..1c56f0f 100644 --- a/ash/app_list/views/app_list_bubble_apps_page.cc +++ b/ash/app_list/views/app_list_bubble_apps_page.cc
@@ -107,6 +107,37 @@ constexpr base::TimeDelta kShowPageAnimationOpacityDuration = base::Milliseconds(100); +// A view that runs a click callback when clicked or tapped. +class ClickableView : public views::View { + public: + explicit ClickableView(base::RepeatingClosure click_callback) + : click_callback_(click_callback) {} + ~ClickableView() override = default; + + // views::View: + bool OnMousePressed(const ui::MouseEvent& event) override { + views::View::OnMousePressed(event); + // Return true so this object will receive a mouse released event. + return true; + } + + void OnMouseReleased(const ui::MouseEvent& event) override { + views::View::OnMouseReleased(event); + click_callback_.Run(); + } + + void OnGestureEvent(ui::GestureEvent* event) override { + views::View::OnGestureEvent(event); + if (event->type() == ui::ET_GESTURE_TAP) { + event->SetHandled(); + click_callback_.Run(); + } + } + + private: + base::RepeatingClosure click_callback_; +}; + } // namespace AppListBubbleAppsPage::AppListBubbleAppsPage( @@ -617,8 +648,13 @@ void AppListBubbleAppsPage::InitContinueLabelContainer( views::View* scroll_contents) { + // The entire container view is clickable/tappable. The view is not focusable, + // but the toggle button is focusable, and that satisfies the user's need for + // an element with keyboard or accessibility focus. continue_label_container_ = - scroll_contents->AddChildView(std::make_unique<views::View>()); + scroll_contents->AddChildView(std::make_unique<ClickableView>( + base::BindRepeating(&AppListBubbleAppsPage::OnToggleContinueSection, + base::Unretained(this)))); continue_label_container_->SetBorder( views::CreateEmptyBorder(kContinueLabelContainerPadding)); @@ -636,6 +672,8 @@ // Button should be right aligned, so flex label to fill empty space. layout->SetFlexForView(continue_label_, 1); + // The toggle button is clickable/tappable in addition to the container view. + // This ensures ink drop ripple effects play when the button is clicked. toggle_continue_section_button_ = continue_label_container_->AddChildView(std::make_unique<IconButton>( base::BindRepeating(&AppListBubbleAppsPage::OnToggleContinueSection,
diff --git a/ash/app_list/views/app_list_bubble_apps_page_unittest.cc b/ash/app_list/views/app_list_bubble_apps_page_unittest.cc index 556f408..ed2bf8ac 100644 --- a/ash/app_list/views/app_list_bubble_apps_page_unittest.cc +++ b/ash/app_list/views/app_list_bubble_apps_page_unittest.cc
@@ -276,7 +276,7 @@ EXPECT_FALSE(apps_page->continue_label_container_for_test()->GetVisible()); } -TEST_F(AppListBubbleAppsPageTest, CanHideContinueSection) { +TEST_F(AppListBubbleAppsPageTest, CanHideContinueSectionByClickingButton) { base::test::ScopedFeatureList feature_list( features::kLauncherHideContinueSection); @@ -308,6 +308,39 @@ EXPECT_TRUE(apps_page->separator_for_test()->GetVisible()); } +TEST_F(AppListBubbleAppsPageTest, CanHideContinueSectionByClickingHeader) { + base::test::ScopedFeatureList feature_list( + features::kLauncherHideContinueSection); + + // Show the app list with enough items to make the continue section and + // recent apps visible. + auto* helper = GetAppListTestHelper(); + helper->AddContinueSuggestionResults(4); + helper->AddRecentApps(5); + helper->AddAppItems(5); + helper->ShowAppList(); + + // The toggle continue section button has the "hide" tooltip. + auto* apps_page = helper->GetBubbleAppsPage(); + views::View* continue_label_container = + apps_page->continue_label_container_for_test(); + ASSERT_TRUE(continue_label_container); + + // Click on the container to hide the continue section. + LeftClickOn(continue_label_container); + + // Continue section and recent apps are hidden. + EXPECT_FALSE(helper->GetBubbleContinueSectionView()->GetVisible()); + EXPECT_FALSE(helper->GetBubbleRecentAppsView()->GetVisible()); + + // Tap on the container to show the continue section. + GestureTapOn(continue_label_container); + + // Continue section and recent apps are shown. + EXPECT_TRUE(helper->GetBubbleContinueSectionView()->GetVisible()); + EXPECT_TRUE(helper->GetBubbleRecentAppsView()->GetVisible()); +} + TEST_F(AppListBubbleAppsPageTest, HideContinueSectionPlaysAnimation) { base::test::ScopedFeatureList feature_list( features::kLauncherHideContinueSection);
diff --git a/ash/components/README.md b/ash/components/README.md index 1086ea1..3aee73a 100644 --- a/ash/components/README.md +++ b/ash/components/README.md
@@ -6,11 +6,7 @@ This directory contains components that are used by //ash system UI and window manager code. It sits "below" //ash in the dependency graph. For C++ code, think of //ash/components like top-level //components, but for code that is -only used on Chrome OS, and only for system UI / window manager support. - -For example, //ash/components/account_manager manages the user's GAIA accounts, -but only on behalf of Chrome OS code. //components/account_manager_core contains -cross-platform support for accounts. +only used on ChromeOS, and only for system UI / window manager support. Some subdirectories contain low-level utility code. For example, //ash/components/disks has utilities for mounting and unmounting disk volumes.
diff --git a/ash/components/account_manager/DEPS b/ash/components/account_manager/DEPS deleted file mode 100644 index 1507f16..0000000 --- a/ash/components/account_manager/DEPS +++ /dev/null
@@ -1,5 +0,0 @@ -include_rules = [ - "+chromeos/crosapi/mojom", - "+components/account_manager_core", - "+google_apis/gaia", -]
diff --git a/ash/components/arc/mojom/notifications.mojom b/ash/components/arc/mojom/notifications.mojom index f250576e..3006cdf9 100644 --- a/ash/components/arc/mojom/notifications.mojom +++ b/ash/components/arc/mojom/notifications.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Next MinVersion: 27 +// Next MinVersion: 28 module arc.mojom; @@ -184,6 +184,10 @@ // True if there's at least one action button enabled for the notification. [MinVersion=26] bool is_action_enabled; + // True if there's at least one action button on the notification that's + // available for the user to trigger remote input. + [MinVersion=27] + bool is_inline_reply_enabled; }; struct ArcDoNotDisturbStatus { @@ -225,7 +229,7 @@ VISIBILITY_MESSAGE_CENTER = 1, }; -// Next Method ID: 11 +// Next Method ID: 12 interface NotificationsHost { // Set the Do-Not-Disturb status on Chrome side from Android side. [MinVersion=18] @@ -261,6 +265,10 @@ // Sets the lock screen setting on Chrome side from Android side. Usually // invoked when the setting on Android side is chagned. OnLockScreenSettingUpdated@10(ArcLockScreenNotificationSetting setting); + + [MinVersion=27] + // Triggers Chrome to log that inline reply is sent for a notification. + LogInlineReplySent@11(string key); }; // Deprecated method IDs: 0
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 3c83d6b..652478c 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -353,6 +353,10 @@ const base::Feature kCrosPrivacyHub{"CrosPrivacyHub", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables future features for Privacy Hub for ChromeOS. +const base::Feature kCrosPrivacyHubFuture{"CrosPrivacyHubFuture", + base::FEATURE_DISABLED_BY_DEFAULT}; + // If enabled, replaces the `DeskMiniView` legacy desk close button and behavior // with a button to close desk and windows and a button to combine desks (the // legacy behavior). @@ -1832,7 +1836,12 @@ } bool IsCrosPrivacyHubEnabled() { - return base::FeatureList::IsEnabled(kCrosPrivacyHub); + return base::FeatureList::IsEnabled(kCrosPrivacyHub) || + IsCrosPrivacyHubFutureEnabled(); +} + +bool IsCrosPrivacyHubFutureEnabled() { + return base::FeatureList::IsEnabled(kCrosPrivacyHubFuture); } bool IsCrosNextWMPEnabled() {
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index c2468b7..953bcb8 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -157,6 +157,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kCrosPrivacyHub; COMPONENT_EXPORT(ASH_CONSTANTS) +extern const base::Feature kCrosPrivacyHubFuture; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kCrostiniBullseyeUpgrade; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDesksTemplates; @@ -702,6 +704,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsClipboardHistoryReorderEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsConsumerAutoUpdateToggleAllowed(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCrosPrivacyHubEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCrosPrivacyHubFutureEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCrosNextWMPEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDesksCloseAllEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCryptohomeRecoveryFlowEnabled();
diff --git a/ash/public/cpp/accessibility_controller.h b/ash/public/cpp/accessibility_controller.h index 38bdb31..b7cd14b 100644 --- a/ash/public/cpp/accessibility_controller.h +++ b/ash/public/cpp/accessibility_controller.h
@@ -194,6 +194,9 @@ const absl::optional<std::u16string>& text, const absl::optional<std::vector<DictationBubbleHintType>>& hints) = 0; + // Cancels all of spoken feedback's current and queued speech immediately. + virtual void SilenceSpokenFeedback() = 0; + protected: AccessibilityController(); virtual ~AccessibilityController();
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_manager.cc b/ash/public/cpp/external_arc/message_center/arc_notification_manager.cc index a1899b0..5445a64d 100644 --- a/ash/public/cpp/external_arc/message_center/arc_notification_manager.cc +++ b/ash/public/cpp/external_arc/message_center/arc_notification_manager.cc
@@ -17,6 +17,7 @@ #include "ash/public/cpp/message_center/arc_notification_constants.h" #include "ash/public/cpp/message_center/arc_notification_manager_delegate.h" #include "ash/system/message_center/message_view_factory.h" +#include "ash/system/message_center/metrics_utils.h" #include "base/bind.h" #include "base/command_line.h" #include "base/containers/contains.h" @@ -224,6 +225,8 @@ metrics_utils::LogArcNotificationStyle(data->style); metrics_utils::LogArcNotificationActionEnabled(data->is_action_enabled); + metrics_utils::LogArcNotificationInlineReplyEnabled( + data->is_inline_reply_enabled); } std::string app_id = @@ -353,6 +356,15 @@ notifications_instance->CancelDeferredUserAction(id); } +void ArcNotificationManager::LogInlineReplySent(const std::string& key) { + auto it = items_.find(key); + if (it == items_.end()) { + return; + } + metrics_utils::LogInlineReplySent(it->second->GetNotificationId(), + !message_center_->IsMessageCenterVisible()); +} + void ArcNotificationManager::OnNotificationRemoved(const std::string& key) { auto it = items_.find(key); if (it == items_.end()) {
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_manager.h b/ash/public/cpp/external_arc/message_center/arc_notification_manager.h index 1a3f491..94db811 100644 --- a/ash/public/cpp/external_arc/message_center/arc_notification_manager.h +++ b/ash/public/cpp/external_arc/message_center/arc_notification_manager.h
@@ -63,6 +63,7 @@ arc::mojom::ArcLockScreenNotificationSettingPtr setting) override; void ProcessUserAction( arc::mojom::ArcNotificationUserActionDataPtr data) override; + void LogInlineReplySent(const std::string& key) override; // Methods called from ArcNotificationItem: void SendNotificationRemovedFromChrome(const std::string& key);
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_manager_unittest.cc b/ash/public/cpp/external_arc/message_center/arc_notification_manager_unittest.cc index 628f9ab..75b9a70 100644 --- a/ash/public/cpp/external_arc/message_center/arc_notification_manager_unittest.cc +++ b/ash/public/cpp/external_arc/message_center/arc_notification_manager_unittest.cc
@@ -31,6 +31,8 @@ constexpr char kHistogramNameActionEnabled[] = "Arc.Notifications.ActionEnabled"; constexpr char kHistogramNameStyle[] = "Arc.Notifications.Style"; +constexpr char kHistogramNameInlineReplyEnabled[] = + "Arc.Notifications.InlineReplyEnabled"; class TestArcAppIdProvider : public ArcAppIdProvider { public: @@ -333,16 +335,19 @@ base::HistogramTester histogram_tester; histogram_tester.ExpectTotalCount(kHistogramNameActionEnabled, 0); histogram_tester.ExpectTotalCount(kHistogramNameStyle, 0); + histogram_tester.ExpectTotalCount(kHistogramNameInlineReplyEnabled, 0); // Create notification std::string key = CreateNotification(); histogram_tester.ExpectTotalCount(kHistogramNameActionEnabled, 1); histogram_tester.ExpectTotalCount(kHistogramNameStyle, 1); + histogram_tester.ExpectTotalCount(kHistogramNameInlineReplyEnabled, 1); // Update notification CreateNotificationWithKey(key); histogram_tester.ExpectTotalCount(kHistogramNameActionEnabled, 1); histogram_tester.ExpectTotalCount(kHistogramNameStyle, 1); + histogram_tester.ExpectTotalCount(kHistogramNameInlineReplyEnabled, 1); } } // namespace ash
diff --git a/ash/public/cpp/external_arc/message_center/metrics_utils.cc b/ash/public/cpp/external_arc/message_center/metrics_utils.cc index 490d168..b8584b3 100644 --- a/ash/public/cpp/external_arc/message_center/metrics_utils.cc +++ b/ash/public/cpp/external_arc/message_center/metrics_utils.cc
@@ -12,6 +12,11 @@ base::UmaHistogramBoolean("Arc.Notifications.ActionEnabled", action_enabled); } +void LogArcNotificationInlineReplyEnabled(bool inline_reply_enabled) { + base::UmaHistogramBoolean("Arc.Notifications.InlineReplyEnabled", + inline_reply_enabled); +} + void LogArcNotificationStyle(arc::mojom::ArcNotificationStyle style) { base::UmaHistogramEnumeration("Arc.Notifications.Style", style); }
diff --git a/ash/public/cpp/external_arc/message_center/metrics_utils.h b/ash/public/cpp/external_arc/message_center/metrics_utils.h index 85e5e09e..e6aa819 100644 --- a/ash/public/cpp/external_arc/message_center/metrics_utils.h +++ b/ash/public/cpp/external_arc/message_center/metrics_utils.h
@@ -12,6 +12,9 @@ // Logs if action button is enabled for Arc notification. void LogArcNotificationActionEnabled(bool action_enabled); +// Logs if inline reply is enabled for Arc notification. +void LogArcNotificationInlineReplyEnabled(bool inline_reply_enabled); + // Logs the style of Arc rich notification. void LogArcNotificationStyle(arc::mojom::ArcNotificationStyle style);
diff --git a/ash/services/cellular_setup/cellular_setup_impl_unittest.cc b/ash/services/cellular_setup/cellular_setup_impl_unittest.cc index 429234a..e59df99 100644 --- a/ash/services/cellular_setup/cellular_setup_impl_unittest.cc +++ b/ash/services/cellular_setup/cellular_setup_impl_unittest.cc
@@ -9,7 +9,6 @@ #include <vector> #include "ash/services/cellular_setup/cellular_setup_base.h" -#include "ash/services/cellular_setup/cellular_setup_impl.h" #include "ash/services/cellular_setup/fake_ota_activator.h" #include "ash/services/cellular_setup/ota_activator_impl.h" #include "ash/services/cellular_setup/public/cpp/fake_activation_delegate.h"
diff --git a/ash/services/device_sync/attestation_certificates_syncer_impl.cc b/ash/services/device_sync/attestation_certificates_syncer_impl.cc index 2d07c3c2f..e044a64 100644 --- a/ash/services/device_sync/attestation_certificates_syncer_impl.cc +++ b/ash/services/device_sync/attestation_certificates_syncer_impl.cc
@@ -64,6 +64,7 @@ // static void AttestationCertificatesSyncerImpl::RegisterPrefs( PrefRegistrySimple* registry) { + PA_LOG(INFO) << __func__; registry->RegisterTimePref( prefs::kCryptAuthAttestationCertificatesLastGeneratedTimestamp, base::Time() - kValidTime); @@ -89,6 +90,8 @@ const std::string& user_key) { DCHECK(features::IsEcheSWAEnabled()); + PA_LOG(INFO) << __func__; + // Cache the cert generation time, to be committed to prefs once the upload is // complete and SetLastSyncTimestamp is called. last_update_time_ = base::Time::Now(); @@ -104,6 +107,7 @@ } void AttestationCertificatesSyncerImpl::SetLastSyncTimestamp() { + PA_LOG(INFO) << __func__; pref_service_->SetTime( prefs::kCryptAuthAttestationCertificatesLastGeneratedTimestamp, last_update_time_); @@ -128,14 +132,14 @@ base::TimeDelta time_to_regeneration_threshold = CalculateTimeToRegeneration(); if (time_to_regeneration_threshold < base::Seconds(0)) { - PA_LOG(INFO) << "Requesting new attestation certificates DeviceSync"; + PA_LOG(INFO) << "Requesting new attestation certificates sync"; StartTimer(kMaxTimeout); cryptauth_scheduler_->RequestDeviceSync( cryptauthv2::ClientMetadata::InvocationReason:: ClientMetadata_InvocationReason_FAST_PERIODIC, /*session_id=*/absl::nullopt); } else { - PA_LOG(INFO) << "Delaying new attestation certificate generation"; + PA_LOG(INFO) << "Delaying new attestation certificate sync request"; StartTimer(time_to_regeneration_threshold); } }
diff --git a/ash/services/device_sync/cryptauth_device_syncer_impl.cc b/ash/services/device_sync/cryptauth_device_syncer_impl.cc index a5e3e877..10e579f 100644 --- a/ash/services/device_sync/cryptauth_device_syncer_impl.cc +++ b/ash/services/device_sync/cryptauth_device_syncer_impl.cc
@@ -235,10 +235,8 @@ return; case State::kWaitingForBluetoothAddress: if (features::IsEcheSWAEnabled()) { - if (IsAttestationCertificatesUpdateRequired()) { - GetAttestationCertificates(); - return; - } + GetAttestationCertificates(); + return; } [[fallthrough]]; case State::kWaitingForAttestationCertificates: @@ -291,10 +289,6 @@ AttemptNextStep(); } -bool CryptAuthDeviceSyncerImpl::IsAttestationCertificatesUpdateRequired() { - return attestation_certificates_syncer_->IsUpdateRequired(); -} - void CryptAuthDeviceSyncerImpl::GetAttestationCertificates() { SetState(State::kWaitingForAttestationCertificates); const CryptAuthKey* user_key_pair =
diff --git a/ash/services/device_sync/cryptauth_device_syncer_impl.h b/ash/services/device_sync/cryptauth_device_syncer_impl.h index b3337766f..cdf6024 100644 --- a/ash/services/device_sync/cryptauth_device_syncer_impl.h +++ b/ash/services/device_sync/cryptauth_device_syncer_impl.h
@@ -144,7 +144,6 @@ void GetBluetoothAddress(); void OnBluetoothAddress(const std::string& bluetooth_address); - bool IsAttestationCertificatesUpdateRequired(); void GetAttestationCertificates(); void OnAttestationCertificates(const std::vector<std::string>& cert_chain, bool valid);
diff --git a/ash/services/quick_pair/quick_pair_process.cc b/ash/services/quick_pair/quick_pair_process.cc index 2b10901b..879f26b 100644 --- a/ash/services/quick_pair/quick_pair_process.cc +++ b/ash/services/quick_pair/quick_pair_process.cc
@@ -10,7 +10,6 @@ #include "ash/services/quick_pair/public/cpp/not_discoverable_advertisement.h" #include "ash/services/quick_pair/public/mojom/fast_pair_data_parser.mojom.h" #include "ash/services/quick_pair/quick_pair_process.h" -#include "ash/services/quick_pair/quick_pair_process_manager.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h"
diff --git a/ash/services/quick_pair/quick_pair_process_unittest.cc b/ash/services/quick_pair/quick_pair_process_unittest.cc index 48d2e08..51183c2 100644 --- a/ash/services/quick_pair/quick_pair_process_unittest.cc +++ b/ash/services/quick_pair/quick_pair_process_unittest.cc
@@ -12,7 +12,6 @@ #include "ash/services/quick_pair/public/cpp/decrypted_passkey.h" #include "ash/services/quick_pair/public/cpp/decrypted_response.h" #include "ash/services/quick_pair/public/cpp/not_discoverable_advertisement.h" -#include "ash/services/quick_pair/quick_pair_process.h" #include "ash/services/quick_pair/quick_pair_process_manager.h" #include "ash/services/quick_pair/quick_pair_process_manager_impl.h" #include "base/callback_helpers.h"
diff --git a/ash/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc b/ash/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc index caa5e35d..8f7582275 100644 --- a/ash/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc +++ b/ash/services/secure_channel/public/cpp/client/client_channel_impl_unittest.cc
@@ -9,7 +9,6 @@ #include "ash/components/multidevice/remote_device_test_util.h" #include "ash/services/secure_channel/fake_channel.h" #include "ash/services/secure_channel/fake_secure_channel.h" -#include "ash/services/secure_channel/public/cpp/client/client_channel_impl.h" #include "ash/services/secure_channel/public/cpp/client/connection_attempt.h" #include "ash/services/secure_channel/public/cpp/client/connection_attempt_impl.h" #include "ash/services/secure_channel/public/cpp/client/fake_client_channel_observer.h"
diff --git a/ash/shelf/login_shelf_view_pixeltest.cc b/ash/shelf/login_shelf_view_pixeltest.cc index 7b671bec..8d02202 100644 --- a/ash/shelf/login_shelf_view_pixeltest.cc +++ b/ash/shelf/login_shelf_view_pixeltest.cc
@@ -18,6 +18,18 @@ LoginShelfViewPixelTest& operator=(const LoginShelfViewPixelTest&) = delete; ~LoginShelfViewPixelTest() override = default; + // Focuses on the login shelf's shutdown button. + void FocusOnShutdownButton() { + views::View* shutdown_button = + GetPrimaryShelf()->shelf_widget()->GetLoginShelfView()->GetViewByID( + LoginShelfView::kShutdown); + views::Widget* shutdown_button_widget = shutdown_button->GetWidget(); + + Shell::Get()->focus_cycler()->FocusWidget(shutdown_button_widget); + shutdown_button_widget->Activate(); + shutdown_button_widget->GetFocusManager()->SetFocusedView(shutdown_button); + } + // Returns the screenshot name prefix. virtual const char* GetScreenshotPrefix() const { return "login_shelf_view_pixel"; @@ -62,6 +74,31 @@ } // Used to verify the login shelf features with a policy wallpaper. +TEST_F(LoginShelfViewPixelTest, FocusTraversalWithinShelf) { + // Focus on the calendar view. + FocusOnShutdownButton(); + PressAndReleaseKey(ui::VKEY_TAB); + PressAndReleaseKey(ui::VKEY_TAB); + PressAndReleaseKey(ui::VKEY_TAB); + + EXPECT_TRUE(pixel_test_helper_.CompareUiComponentScreenshot( + "focus_on_calendar_view", + AshPixelDiffTestHelper::UiComponent::kShelfWidget)); + + // Focus on the time view. + PressAndReleaseKey(ui::VKEY_TAB); + EXPECT_TRUE(pixel_test_helper_.CompareUiComponentScreenshot( + "focus_on_time_view", AshPixelDiffTestHelper::UiComponent::kShelfWidget)); + + PressAndReleaseKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN); + PressAndReleaseKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN); + + // Move the focus back to the add person button. + EXPECT_TRUE(pixel_test_helper_.CompareUiComponentScreenshot( + "refocus_on_login_shelf", + AshPixelDiffTestHelper::UiComponent::kShelfWidget)); +} + class LoginShelfWithPolicyWallpaperPixelTest : public LoginShelfViewPixelTest { public: LoginShelfWithPolicyWallpaperPixelTest() { @@ -84,16 +121,7 @@ // Verifies that focusing on the login shelf widget with a policy wallpaper // works as expected (see https://crbug.com/1197052). TEST_F(LoginShelfWithPolicyWallpaperPixelTest, FocusOnShutdownButton) { - views::View* shutdown_button = - GetPrimaryShelf()->shelf_widget()->GetLoginShelfView()->GetViewByID( - LoginShelfView::kShutdown); - views::Widget* shutdown_button_widget = shutdown_button->GetWidget(); - - // Focus on the shutdown button. - Shell::Get()->focus_cycler()->FocusWidget(shutdown_button_widget); - shutdown_button_widget->Activate(); - shutdown_button_widget->GetFocusManager()->SetFocusedView(shutdown_button); - + FocusOnShutdownButton(); EXPECT_TRUE( pixel_test_helper_.ComparePrimaryFullScreen("focus_on_shutdown_button")); }
diff --git a/ash/system/message_center/metrics_utils.h b/ash/system/message_center/metrics_utils.h index bde25e8..89b3393 100644 --- a/ash/system/message_center/metrics_utils.h +++ b/ash/system/message_center/metrics_utils.h
@@ -5,6 +5,7 @@ #ifndef ASH_SYSTEM_MESSAGE_CENTER_METRICS_UTILS_H_ #define ASH_SYSTEM_MESSAGE_CENTER_METRICS_UTILS_H_ +#include "ash/ash_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/message_center/public/cpp/notification.h" #include "ui/message_center/views/message_popup_view.h" @@ -124,7 +125,8 @@ void LogClickedActionButton(const std::string& notification_id, bool is_popup); // Logs an InlineReplySent event. -void LogInlineReplySent(const std::string& notification_id, bool is_popup); +ASH_EXPORT void LogInlineReplySent(const std::string& notification_id, + bool is_popup); // Logs a ExpireToTray event for a pop-up notification. void LogPopupExpiredToTray(const std::string& notification_id);
diff --git a/ash/system/network/network_list_view_controller_unittest.cc b/ash/system/network/network_list_view_controller_unittest.cc index df77842..763338ce 100644 --- a/ash/system/network/network_list_view_controller_unittest.cc +++ b/ash/system/network/network_list_view_controller_unittest.cc
@@ -1112,44 +1112,49 @@ network_state_helper()->manager_test()->SetInteractiveDelay( kInteractiveDelay); + // ClearDevices() calls RunUntilIdle which performs some initial scans. + size_t initial_wifi_count = 1u; + size_t initial_tether_count = 1u; + size_t initial_scan_count = 2u; + // Scanning bar is not visible if WiFi is not enabled. EXPECT_FALSE(HasScanTimerStarted()); EXPECT_FALSE(getScanningBarVisibility()); - EXPECT_EQ(0u, GetScanCount()); - EXPECT_EQ(0u, GetWifiScanCount()); - EXPECT_EQ(0u, GetTetherScanCount()); + EXPECT_EQ(initial_scan_count + 0u, GetScanCount()); + EXPECT_EQ(initial_wifi_count + 0u, GetWifiScanCount()); + EXPECT_EQ(initial_tether_count + 0u, GetTetherScanCount()); // Add an enabled WiFi device. AddWifiDevice(); EXPECT_TRUE(HasScanTimerStarted()); EXPECT_TRUE(getScanningBarVisibility()); - EXPECT_EQ(2u, GetScanCount()); - EXPECT_EQ(1u, GetWifiScanCount()); - EXPECT_EQ(1u, GetTetherScanCount()); + EXPECT_EQ(initial_scan_count + 2u, GetScanCount()); + EXPECT_EQ(initial_wifi_count + 1u, GetWifiScanCount()); + EXPECT_EQ(initial_tether_count + 1u, GetTetherScanCount()); // Simulate scanning finishing. task_environment()->FastForwardBy(kInteractiveDelay); EXPECT_FALSE(getScanningBarVisibility()); EXPECT_TRUE(HasScanTimerStarted()); - EXPECT_EQ(2u, GetScanCount()); - EXPECT_EQ(1u, GetWifiScanCount()); - EXPECT_EQ(1u, GetTetherScanCount()); + EXPECT_EQ(initial_scan_count + 2u, GetScanCount()); + EXPECT_EQ(initial_wifi_count + 1u, GetWifiScanCount()); + EXPECT_EQ(initial_tether_count + 1u, GetTetherScanCount()); // Make sure scan timer is still running. task_environment()->FastForwardBy(kInteractiveDelay); EXPECT_TRUE(HasScanTimerStarted()); EXPECT_FALSE(getScanningBarVisibility()); - EXPECT_EQ(2u, GetScanCount()); - EXPECT_EQ(1u, GetWifiScanCount()); - EXPECT_EQ(1u, GetTetherScanCount()); + EXPECT_EQ(initial_scan_count + 2u, GetScanCount()); + EXPECT_EQ(initial_wifi_count + 1u, GetWifiScanCount()); + EXPECT_EQ(initial_tether_count + 1u, GetTetherScanCount()); task_environment()->FastForwardBy(kInteractiveDelay); EXPECT_TRUE(HasScanTimerStarted()); EXPECT_FALSE(getScanningBarVisibility()); - EXPECT_EQ(2u, GetScanCount()); - EXPECT_EQ(1u, GetWifiScanCount()); - EXPECT_EQ(1u, GetTetherScanCount()); + EXPECT_EQ(initial_scan_count + 2u, GetScanCount()); + EXPECT_EQ(initial_wifi_count + 1u, GetWifiScanCount()); + EXPECT_EQ(initial_tether_count + 1u, GetTetherScanCount()); // Disabling WiFi device ends scan timer. network_state_handler()->SetTechnologyEnabled( @@ -1158,9 +1163,9 @@ EXPECT_FALSE(getScanningBarVisibility()); EXPECT_FALSE(HasScanTimerStarted()); - EXPECT_EQ(2u, GetScanCount()); - EXPECT_EQ(1u, GetWifiScanCount()); - EXPECT_EQ(1u, GetTetherScanCount()); + EXPECT_EQ(initial_scan_count + 2u, GetScanCount()); + EXPECT_EQ(initial_wifi_count + 1u, GetWifiScanCount()); + EXPECT_EQ(initial_tether_count + 1u, GetTetherScanCount()); } } // namespace ash
diff --git a/ash/test/ash_pixel_diff_test_helper.cc b/ash/test/ash_pixel_diff_test_helper.cc index f35e78f8..78170ed 100644 --- a/ash/test/ash_pixel_diff_test_helper.cc +++ b/ash/test/ash_pixel_diff_test_helper.cc
@@ -4,10 +4,24 @@ #include "ash/test/ash_pixel_diff_test_helper.h" +#include "ash/root_window_controller.h" +#include "ash/shelf/shelf.h" #include "ash/shell.h" namespace ash { +namespace { + +Shelf* GetPrimaryShelf() { + return Shell::GetPrimaryRootWindowController()->shelf(); +} + +gfx::Rect GetShelfWidgetScreenBounds() { + return GetPrimaryShelf()->GetWindow()->GetBoundsInScreen(); +} + +} // namespace + AshPixelDiffTestHelper::AshPixelDiffTestHelper() = default; AshPixelDiffTestHelper::~AshPixelDiffTestHelper() = default; @@ -20,10 +34,33 @@ gfx::Rect(primary_root_window->bounds().size())); } +bool AshPixelDiffTestHelper::CompareUiComponentScreenshot( + const std::string& screenshot_name, + UiComponent ui_component) { + return ComparePrimaryScreenshotWithBoundsInScreen( + screenshot_name, GetUiComponentBoundsInScreen(ui_component)); +} + +bool AshPixelDiffTestHelper::ComparePrimaryScreenshotWithBoundsInScreen( + const std::string& screenshot_name, + const gfx::Rect& screen_bounds) { + aura::Window* primary_root_window = Shell::Get()->GetPrimaryRootWindow(); + return pixel_diff_.CompareNativeWindowScreenshot( + screenshot_name, primary_root_window, screen_bounds); +} + void AshPixelDiffTestHelper::InitSkiaGoldPixelDiff( const std::string& screenshot_prefix, const std::string& corpus) { pixel_diff_.Init(screenshot_prefix, corpus); } +gfx::Rect AshPixelDiffTestHelper::GetUiComponentBoundsInScreen( + UiComponent ui_component) const { + switch (ui_component) { + case UiComponent::kShelfWidget: + return GetShelfWidgetScreenBounds(); + } +} + } // namespace ash
diff --git a/ash/test/ash_pixel_diff_test_helper.h b/ash/test/ash_pixel_diff_test_helper.h index 1be439e..7c58ab07 100644 --- a/ash/test/ash_pixel_diff_test_helper.h +++ b/ash/test/ash_pixel_diff_test_helper.h
@@ -13,6 +13,12 @@ // tests via the Skia Gold. class AshPixelDiffTestHelper { public: + // Lists the UI components supported by pixel tests. + enum class UiComponent { + // The shelf widget that shows the shelf background. + kShelfWidget, + }; + AshPixelDiffTestHelper(); AshPixelDiffTestHelper(const AshPixelDiffTestHelper&) = delete; AshPixelDiffTestHelper& operator=(const AshPixelDiffTestHelper&) = delete; @@ -20,14 +26,31 @@ // Takes a screenshot of the primary fullscreen then uploads it to the Skia // Gold to perform pixel comparison. Returns the comparison result. + // NOTE: use this function only when necessary. Otherwise, a tiny UI change + // may break many pixel tests. bool ComparePrimaryFullScreen(const std::string& screenshot_name); + // Takes a screenshot of the area associated to `ui_component` then compares + // it with the benchmark image. Returns the comparison result. + bool CompareUiComponentScreenshot(const std::string& screenshot_name, + UiComponent ui_component); + + // Compares the screenshot of the area specified by `screen_bounds` with the + // benchmark image. Returns the comparison result. + bool ComparePrimaryScreenshotWithBoundsInScreen( + const std::string& screenshot_name, + const gfx::Rect& screen_bounds); + // Initializes the underlying utility class for Skia Gold pixel tests. // NOTE: this function has to be called before any pixel comparison. void InitSkiaGoldPixelDiff(const std::string& screenshot_prefix, const std::string& corpus = std::string()); private: + // Returns the screen bounds of the given UI component. + // NOTE: this function assumes that the UI component is on the primary screen. + gfx::Rect GetUiComponentBoundsInScreen(UiComponent ui_component) const; + // Used to take screenshots and upload images to the Skia Gold server to // perform pixel comparison. // NOTE: the user of `ViewSkiaGoldPixelDiff` has the duty to initialize
diff --git a/ash/webui/shimless_rma/mojom/shimless_rma.mojom b/ash/webui/shimless_rma/mojom/shimless_rma.mojom index b53d200b..f142160e 100644 --- a/ash/webui/shimless_rma/mojom/shimless_rma.mojom +++ b/ash/webui/shimless_rma/mojom/shimless_rma.mojom
@@ -67,6 +67,8 @@ kWaitForManualWPEnable, kFinalize, kRepairComplete, + kHardwareError, + kReboot, }; // Defined error codes.
diff --git a/ash/webui/shimless_rma/resources/BUILD.gn b/ash/webui/shimless_rma/resources/BUILD.gn index 769e269e..e9f99d85 100644 --- a/ash/webui/shimless_rma/resources/BUILD.gn +++ b/ash/webui/shimless_rma/resources/BUILD.gn
@@ -21,6 +21,7 @@ "calibration_component_chip.js", "icons.js", "critical_error_page.js", + "hardware_error_page.js", "onboarding_choose_destination_page.js", "onboarding_choose_wp_disable_method_page.js", "onboarding_choose_wipe_device_page.js", @@ -31,6 +32,7 @@ "onboarding_update_page.js", "onboarding_wait_for_manual_wp_disable_page.js", "onboarding_wp_disable_complete_page.js", + "reboot_page.js", "reimaging_calibration_failed_page.js", "reimaging_calibration_run_page.js", "reimaging_calibration_setup_page.js", @@ -94,6 +96,7 @@ ":calibration_component_chip", ":critical_error_page", ":fake_shimless_rma_service", + ":hardware_error_page", ":mojo_interface_provider", ":onboarding_choose_destination_page", ":onboarding_choose_wipe_device_page", @@ -105,6 +108,7 @@ ":onboarding_update_page", ":onboarding_wait_for_manual_wp_disable_page", ":onboarding_wp_disable_complete_page", + ":reboot_page", ":reimaging_calibration_failed_page", ":reimaging_calibration_run_page", ":reimaging_calibration_setup_page", @@ -126,6 +130,7 @@ js_library("shimless_rma") { deps = [ ":critical_error_page", + ":hardware_error_page", ":mojo_interface_provider", ":onboarding_choose_destination_page", ":onboarding_choose_wipe_device_page", @@ -143,6 +148,7 @@ ":onboarding_update_page", ":onboarding_wait_for_manual_wp_disable_page", ":onboarding_wp_disable_complete_page", + ":reboot_page", ":reimaging_calibration_failed_page", ":reimaging_calibration_run_page", ":reimaging_calibration_setup_page", @@ -176,6 +182,16 @@ ] } +js_library("hardware_error_page") { + deps = [ + ":base_page", + ":mojo_interface_provider", + ":shimless_rma_types", + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:i18n_behavior.m", + ] +} + js_library("data") { deps = [ ":shimless_rma_types", @@ -321,6 +337,16 @@ ] } +js_library("reboot_page") { + deps = [ + ":base_page", + ":mojo_interface_provider", + ":shimless_rma_types", + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:i18n_behavior.m", + ] +} + js_library("reimaging_calibration_failed_page") { deps = [ ":base_page",
diff --git a/ash/webui/shimless_rma/resources/fake_data.js b/ash/webui/shimless_rma/resources/fake_data.js index a91f84be..668d6f3 100644 --- a/ash/webui/shimless_rma/resources/fake_data.js +++ b/ash/webui/shimless_rma/resources/fake_data.js
@@ -134,6 +134,18 @@ canGoBack: false, error: RmadErrorCode.kOk, }, + { + state: State.kHardwareError, + canExit: false, + canGoBack: false, + error: RmadErrorCode.kOk, + }, + { + state: State.kReboot, + canExit: false, + canGoBack: false, + error: RmadErrorCode.kOk, + }, ]; /** @type {!Array<string>} */
diff --git a/ash/webui/shimless_rma/resources/hardware_error_page.html b/ash/webui/shimless_rma/resources/hardware_error_page.html new file mode 100644 index 0000000..2be2cc9 --- /dev/null +++ b/ash/webui/shimless_rma/resources/hardware_error_page.html
@@ -0,0 +1,34 @@ +<style include="cr-shared-style shimless-rma-shared"> + .large-icon { + height: 200px; + width: 300px; + } + + #navigationButtonWrapper { + bottom: var(--header-footer-height); + position: absolute; + right: var(--content-container-padding); + } + </style> + <base-page> + <div slot="left-pane"> + <h1>[[i18n('hardwareErrorTitle')]]</h1> + <div class="icon-message"> + <iron-icon icon="shimless-icon:warning" class="warning-icon small-icon"> + </iron-icon> + <div class="instructions">[[i18n('hardwareErrorMessage')]]</div> + </div> + <div id="navigationButtonWrapper"> + <cr-button id="shutDownButton" class="action-button" + on-click="onShutDownButtonClicked_" disabled="[[allButtonsDisabled]]"> + [[i18n('hardwareErrorShutDownButton')]] + </cr-button> + </div> + </div> + <div slot="right-pane"> + <div class="illustration-wrapper"> + <img class="illustration" src="illustrations/error.svg" + alt="[[i18n('errorAltText')]]"> + </div> + </div> + </base-page>
diff --git a/ash/webui/shimless_rma/resources/hardware_error_page.js b/ash/webui/shimless_rma/resources/hardware_error_page.js new file mode 100644 index 0000000..87757f7e --- /dev/null +++ b/ash/webui/shimless_rma/resources/hardware_error_page.js
@@ -0,0 +1,63 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import './base_page.js'; +import './shimless_rma_shared_css.js'; +import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; + +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js'; +import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getShimlessRmaService} from './mojo_interface_provider.js'; +import {ShimlessRmaServiceInterface, ShutdownMethod} from './shimless_rma_types.js'; +import {disableAllButtons, executeThenTransitionState} from './shimless_rma_util.js'; + +/** + * @fileoverview + * 'hardware-error-page' is displayed when an unexpected error blocks RMA from + * continuing. + */ + +/** + * @constructor + * @extends {PolymerElement} + * @implements {I18nBehaviorInterface} + */ +const HardwareErrorPageBase = mixinBehaviors([I18nBehavior], PolymerElement); + +/** @polymer */ +export class HardwareErrorPage extends HardwareErrorPageBase { + static get is() { + return 'hardware-error-page'; + } + + static get template() { + return html`{__html_template__}`; + } + static get properties() { + return { + /** + * Set by shimless_rma.js. + * @type {boolean} + */ + allButtonsDisabled: Boolean, + }; + } + + constructor() { + super(); + /** @private {ShimlessRmaServiceInterface} */ + this.shimlessRmaService_ = getShimlessRmaService(); + } + + /** @protected */ + onShutDownButtonClicked_() { + executeThenTransitionState( + this, () => this.shimlessRmaService_.endRma(ShutdownMethod.kShutdown)); + disableAllButtons(this, /* showBusyStateOverlay= */ true); + } +} + +customElements.define(HardwareErrorPage.is, HardwareErrorPage);
diff --git a/ash/webui/shimless_rma/resources/reboot_page.html b/ash/webui/shimless_rma/resources/reboot_page.html new file mode 100644 index 0000000..99a76cd --- /dev/null +++ b/ash/webui/shimless_rma/resources/reboot_page.html
@@ -0,0 +1,17 @@ +<style include="cr-shared-style shimless-rma-shared"> +</style> + +<base-page> + <div slot="left-pane"> + <h1>[[i18n('RebootPageTitle')]]</h1> + <div class="instructions"> + [[i18n('RebootPageMessage')]] + </div> + </div> + <div slot="right-pane"> + <div class="illustration-wrapper"> + <paper-spinner-lite active class="large-spinner"> + </paper-spinner-lite> + </div> + </div> +</base-page>
diff --git a/ash/webui/shimless_rma/resources/reboot_page.js b/ash/webui/shimless_rma/resources/reboot_page.js new file mode 100644 index 0000000..8a763a7b --- /dev/null +++ b/ash/webui/shimless_rma/resources/reboot_page.js
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; +import './base_page.js'; +import './shimless_rma_shared_css.js'; + +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js'; +import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +/** + * @fileoverview + * 'reboot-page' is displayed while waiting for a reboot. + */ + +/** + * @constructor + * @extends {PolymerElement} + * @implements {I18nBehaviorInterface} + */ +const RebootPageBase = mixinBehaviors([I18nBehavior], PolymerElement); + +/** @polymer */ +export class RebootPage extends RebootPageBase { + static get is() { + return 'reboot-page'; + } + + static get template() { + return html`{__html_template__}`; + } +} + +customElements.define(RebootPage.is, RebootPage);
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js index 25196be..7d7b63a5 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma.js +++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -3,6 +3,7 @@ // found in the LICENSE file. import './critical_error_page.js'; +import './hardware_error_page.js'; import './onboarding_choose_destination_page.js'; import './onboarding_choose_wipe_device_page.js'; import './onboarding_choose_wp_disable_method_page.js'; @@ -13,6 +14,7 @@ import './onboarding_update_page.js'; import './onboarding_wait_for_manual_wp_disable_page.js'; import './onboarding_wp_disable_complete_page.js'; +import './reboot_page.js'; import './reimaging_calibration_failed_page.js'; import './reimaging_calibration_run_page.js'; import './reimaging_calibration_setup_page.js'; @@ -218,6 +220,20 @@ buttonExit: ButtonState.HIDDEN, buttonBack: ButtonState.HIDDEN, }, + [State.kHardwareError]: { + componentIs: 'hardware-error-page', + requiresReloadWhenShown: false, + buttonNext: ButtonState.HIDDEN, + buttonExit: ButtonState.HIDDEN, + buttonBack: ButtonState.HIDDEN, + }, + [State.kReboot]: { + componentIs: 'reboot-page', + requiresReloadWhenShown: false, + buttonNext: ButtonState.HIDDEN, + buttonExit: ButtonState.HIDDEN, + buttonBack: ButtonState.HIDDEN, + }, }; /** @@ -412,6 +428,24 @@ this.currentPage_.buttonNextLabelKey = e.detail; this.notifyPath('currentPage_.buttonNextLabelKey'); }; + + /** + * The fatalHardwareErrorCallback_ callback is used by the finalization + * page and the provisioning page to tell the app that there is a fatal + * hardware error. + * @private {?Function} + */ + this.fatalHardwareErrorCallback_ = (event) => { + const errorState = { + stateResult: { + state: State.kHardwareError, + canExit: false, + canGoBack: false, + error: event.detail, + }, + }; + this.showState_(errorState); + }; } /** @override */ @@ -428,6 +462,8 @@ 'enable-all-buttons', this.enableAllButtonsCallback_); window.addEventListener('click-exit-button', this.exitButtonCallback_); window.addEventListener('click-next-button', this.nextButtonCallback_); + window.addEventListener( + 'fatal-hardware-error', this.fatalHardwareErrorCallback_); } /** @override */ @@ -444,6 +480,8 @@ 'enable-all-buttons', this.enableAllButtonsCallback_); window.removeEventListener('click-exit-button', this.exitButtonCallback_); window.removeEventListener('click-next-button', this.nextButtonCallback_); + window.removeEventListener( + 'fatal-hardware-error', this.fatalHardwareErrorCallback_); } /** @override */
diff --git a/ash/webui/shimless_rma/resources/wrapup_finalize_page.html b/ash/webui/shimless_rma/resources/wrapup_finalize_page.html index 362df7f2..677cbb9 100644 --- a/ash/webui/shimless_rma/resources/wrapup_finalize_page.html +++ b/ash/webui/shimless_rma/resources/wrapup_finalize_page.html
@@ -7,35 +7,11 @@ <div id="finalizationMessage" class="instructions"> [[finalizationMessage_]] </div> - <div> - <cr-button id="retryFinalizationButton" class="cancel-button" - on-click="onRetryFinalizationButtonClicked_" - hidden$="[[!shouldShowRetryButton_]]" - disabled="[[allButtonsDisabled]]"> - [[i18n('finalizePageFailedRetryButtonLabel')]] - </cr-button> - </div> </div> <div slot="right-pane"> <div class="illustration-wrapper"> - <paper-spinner-lite active hidden$="[[!shouldShowSpinner_]]" - class="large-spinner"> + <paper-spinner-lite active class="large-spinner"> </paper-spinner-lite> </div> </div> </base-page> - -<cr-dialog id="hardwareWpDisabledDialog" no-cancel> - <div slot="title"> - [[i18n('finalizePageWpDisabledDialogTitle')]] - </div> - <div slot="body"> - [[i18n('finalizePageWpDisabledDialogBody')]] - </div> - <div class="dialog-footer" slot="button-container"> - <cr-button id="tryAgainButton" class="text-button action-button" - on-click="onTryAgainButtonClick_"> - [[i18n('tryAgainButtonLabel')]] - </cr-button> - </div> -</cr-dialog>
diff --git a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js index 492106a..abc2f6a 100644 --- a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js
@@ -10,15 +10,13 @@ import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getShimlessRmaService} from './mojo_interface_provider.js'; -import {FinalizationError, FinalizationObserverInterface, FinalizationObserverReceiver, FinalizationStatus, ShimlessRmaServiceInterface, StateResult} from './shimless_rma_types.js'; +import {FinalizationError, FinalizationObserverInterface, FinalizationObserverReceiver, FinalizationStatus, RmadErrorCode, ShimlessRmaServiceInterface, StateResult} from './shimless_rma_types.js'; import {executeThenTransitionState} from './shimless_rma_util.js'; /** @type {!Object<!FinalizationStatus, string>} */ const finalizationStatusTextKeys = { [FinalizationStatus.kInProgress]: 'finalizePageProgressText', [FinalizationStatus.kComplete]: 'finalizePageCompleteText', - [FinalizationStatus.kFailedBlocking]: 'finalizePageFailedBlockingText', - [FinalizationStatus.kFailedNonBlocking]: 'finalizePageFailedNonBlockingText', }; /** @@ -57,18 +55,6 @@ type: String, value: '', }, - - /** @protected {boolean} */ - shouldShowSpinner_: { - type: Boolean, - value: false, - }, - - /** @protected {boolean} */ - shouldShowRetryButton_: { - type: Boolean, - value: false, - }, }; } @@ -93,57 +79,23 @@ * @param {!FinalizationError} error */ onFinalizationUpdated(status, progress, error) { - const isErrorStatus = status === FinalizationStatus.kFailedBlocking || - status === FinalizationStatus.kFailedNonBlocking; - const isHardwareWpError = - isErrorStatus && error === FinalizationError.kCannotEnableHardwareWp; - - this.finalizationMessage_ = this.i18n( - isHardwareWpError ? 'finalizePageProgressText' : - finalizationStatusTextKeys[status]); - - if (status === FinalizationStatus.kComplete) { - executeThenTransitionState( - this, () => this.shimlessRmaService_.finalizationComplete()); - return; - } - - this.shouldShowSpinner_ = - isHardwareWpError || status === FinalizationStatus.kInProgress; - - if (isHardwareWpError) { - const dialog = /** @type {!CrDialogElement} */ ( - this.shadowRoot.querySelector('#hardwareWpDisabledDialog')); - dialog.showModal(); + if (status === FinalizationStatus.kFailedBlocking || + status === FinalizationStatus.kFailedNonBlocking) { + this.dispatchEvent(new CustomEvent('fatal-hardware-error', { + bubbles: true, + composed: true, + detail: RmadErrorCode.kFinalizationFailed, + })); } else { - // For other errors, continue using retry button to handle for now. - this.shouldShowRetryButton_ = isErrorStatus; + this.finalizationMessage_ = this.i18n(finalizationStatusTextKeys[status]); + + if (status === FinalizationStatus.kComplete) { + executeThenTransitionState( + this, () => this.shimlessRmaService_.finalizationComplete()); + return; + } } } - - /** @protected */ - onRetryFinalizationButtonClicked_() { - if (!this.shouldShowRetryButton_) { - console.error('Finalization has not failed.'); - return; - } - - executeThenTransitionState( - this, () => this.shimlessRmaService_.retryFinalization()); - } - - /** - * Handles the try again button on hardwareWpDisabledDialog is clicked. - * @protected - */ - onTryAgainButtonClick_() { - const dialog = /** @type {!CrDialogElement} */ ( - this.shadowRoot.querySelector('#hardwareWpDisabledDialog')); - dialog.close(); - - executeThenTransitionState( - this, () => this.shimlessRmaService_.retryFinalization()); - } } customElements.define(WrapupFinalizePage.is, WrapupFinalizePage);
diff --git a/ash/webui/shimless_rma/shimless_rma.cc b/ash/webui/shimless_rma/shimless_rma.cc index 2e605023..2c438d3c 100644 --- a/ash/webui/shimless_rma/shimless_rma.cc +++ b/ash/webui/shimless_rma/shimless_rma.cc
@@ -184,16 +184,6 @@ {"finalizePageTitleText", IDS_SHIMLESS_RMA_FINALIZE_PAGE_TITLE}, {"finalizePageProgressText", IDS_SHIMLESS_RMA_FINALIZE_PROGRESS}, {"finalizePageCompleteText", IDS_SHIMLESS_RMA_FINALIZE_COMPLETE}, - {"finalizePageFailedBlockingText", - IDS_SHIMLESS_RMA_FINALIZE_FAILED_BLOCKING}, - {"finalizePageFailedNonBlockingText", - IDS_SHIMLESS_RMA_FINALIZE_FAILED_NON_BLOCKING}, - {"finalizePageFailedRetryButtonLabel", - IDS_SHIMLESS_RMA_FINALIZE_FAILED_RETRY_BUTTON_LABEL}, - {"finalizePageWpDisabledDialogTitle", - IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_TITLE}, - {"finalizePageWpDisabledDialogBody", - IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_BODY}, // Run calibration page {"runCalibrationTitleText", IDS_SHIMLESS_RMA_RUN_CALIBRATION_PAGE_TITLE}, {"runCalibrationCompleteTitleText", @@ -322,6 +312,14 @@ // Critical error {"criticalErrorMessageText", IDS_SHIMLESS_RMA_CRITICAL_ERROR_MESSAGE}, {"criticalErrorRebootText", IDS_SHIMLESS_RMA_CRITICAL_REBOOT_BUTTON}, + // Hardware error + {"hardwareErrorTitle", IDS_SHIMLESS_RMA_HARDWARE_ERROR_TITLE}, + {"hardwareErrorMessage", IDS_SHIMLESS_RMA_HARDWARE_ERROR_MESSAGE}, + {"hardwareErrorShutDownButton", + IDS_SHIMLESS_RMA_HARDWARE_SHUTDOWN_BUTTON}, + // Hardware error + {"RebootPageTitle", IDS_SHIMLESS_RMA_REBOOT_PAGE_TITLE}, + {"RebootPageMessage", IDS_SHIMLESS_RMA_REBOOT_PAGE_MESSAGE}, // Wipe device page {"wipeDeviceTitleText", IDS_SHIMLESS_RMA_WIPE_DEVICE_TITLE}, {"wipeDeviceRemoveDataLabel",
diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc index 067189a..2c6c86b 100644 --- a/ash/wm/default_state.cc +++ b/ash/wm/default_state.cc
@@ -563,8 +563,15 @@ } // When reentering a state, use the saved `snap_ratio_`. - UpdateBoundsFromState(window_state, state_in_previous_mode->GetType(), - window_state->snap_ratio()); + if (window_state->IsSnapped()) { + UpdateBoundsFromState(window_state, state_in_previous_mode->GetType(), + window_state->snap_ratio().has_value() + ? window_state->snap_ratio() + : absl::make_optional(kDefaultSnapRatio)); + } else { + UpdateBoundsFromState(window_state, state_in_previous_mode->GetType(), + absl::nullopt); + } UpdateMinimizedState(window_state, state_in_previous_mode->GetType()); // Then restore the restore bounds to their previous value.
diff --git a/ash/wm/desks/templates/saved_desk_item_view.cc b/ash/wm/desks/templates/saved_desk_item_view.cc index 5ecd4db6..75cdf6a8 100644 --- a/ash/wm/desks/templates/saved_desk_item_view.cc +++ b/ash/wm/desks/templates/saved_desk_item_view.cc
@@ -43,6 +43,7 @@ #include "ui/gfx/geometry/insets.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/text_constants.h" +#include "ui/views/animation/animation_builder.h" #include "ui/views/background.h" #include "ui/views/controls/focus_ring.h" #include "ui/views/controls/highlight_path_generator.h" @@ -87,6 +88,9 @@ // actual text. constexpr auto kTemplateNameInsets = gfx::Insets::VH(0, 2); +// The time duration for the hover and icon containers to fade in and out. +constexpr int kFadeDurationMs = 100; + std::u16string GetTimeStr(base::Time timestamp) { std::u16string date, time, time_str; @@ -258,6 +262,12 @@ focus_ring->SetColorId(ui::kColorAshFocusRing); SetEventTargeter(std::make_unique<views::ViewTargeter>(this)); + + hover_container_->SetPaintToLayer(); + icon_container_view_->SetPaintToLayer(); + + hover_container_->layer()->SetFillsBoundsOpaquely(false); + icon_container_view_->layer()->SetFillsBoundsOpaquely(false); } SavedDeskItemView::~SavedDeskItemView() { @@ -272,13 +282,25 @@ // For switch access, setting the hover buttons to visible allows users to // navigate to it. - const bool visible = + bool previous_hover_container_visibility = hover_container_should_be_visible_; + hover_container_should_be_visible_ = !is_template_name_being_modified_ && ((is_touch && HitTestPoint(location_in_view)) || (!is_touch && IsMouseHovered()) || Shell::Get()->accessibility_controller()->IsSwitchAccessRunning()); - hover_container_->SetVisible(visible); - icon_container_view_->SetVisible(!visible); + + if (previous_hover_container_visibility == + hover_container_should_be_visible_) { + return; + } + + if (hover_container_should_be_visible_) { + hover_container_->SetVisible(true); + AnimateHover(hover_container_->layer(), icon_container_view_->layer()); + } else { + icon_container_view_->SetVisible(true); + AnimateHover(icon_container_view_->layer(), hover_container_->layer()); + } } bool SavedDeskItemView::IsNameBeingModified() const { @@ -425,6 +447,8 @@ // Hide the hover container when we are modifying the template name. hover_container_->SetVisible(false); icon_container_view_->SetVisible(true); + hover_container_->layer()->SetOpacity(0.0f); + icon_container_view_->layer()->SetOpacity(1.0f); // Set the Overview highlight to move focus with the `name_view_`. auto* highlight_controller = Shell::Get() @@ -552,6 +576,30 @@ desk_template_->Clone()); } +void SavedDeskItemView::OnHoverAnimationEnded() { + hover_container_->SetVisible(hover_container_should_be_visible_); + icon_container_view_->SetVisible(!hover_container_should_be_visible_); +} + +void SavedDeskItemView::AnimateHover(ui::Layer* layer_to_show, + ui::Layer* layer_to_hide) { + views::AnimationBuilder() + .SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET) + .OnEnded(base::BindOnce( + [](base::WeakPtr<SavedDeskItemView> view) { + if (view) + view->OnHoverAnimationEnded(); + }, + weak_ptr_factory_.GetWeakPtr())) + .Once() + .SetOpacity(std::move(layer_to_show), 0.0f) + .SetOpacity(std::move(layer_to_hide), 1.0f) + .Then() + .SetDuration(base::Milliseconds(kFadeDurationMs)) + .SetOpacity(std::move(layer_to_show), 1.0f) + .SetOpacity(std::move(layer_to_hide), 0.0f); +} + void SavedDeskItemView::ContentsChanged(views::Textfield* sender, const std::u16string& new_contents) { DCHECK_EQ(sender, name_view_);
diff --git a/ash/wm/desks/templates/saved_desk_item_view.h b/ash/wm/desks/templates/saved_desk_item_view.h index 0a246cb..b62d701 100644 --- a/ash/wm/desks/templates/saved_desk_item_view.h +++ b/ash/wm/desks/templates/saved_desk_item_view.h
@@ -132,6 +132,9 @@ private: friend class SavedDeskItemViewTestApi; + void OnHoverAnimationEnded(); + void AnimateHover(ui::Layer* layer_to_show, ui::Layer* layer_to_hide); + void OnDeleteTemplate(); void OnDeleteButtonPressed(); @@ -188,6 +191,8 @@ // `OnViewBlurred` does not update the template name. bool should_commit_name_changes_ = true; + bool hover_container_should_be_visible_ = false; + base::ScopedObservation<views::View, views::ViewObserver> name_view_observation_{this};
diff --git a/base/barrier_callback_unittest.cc b/base/barrier_callback_unittest.cc index 7b6db8632..4ba4235 100644 --- a/base/barrier_callback_unittest.cc +++ b/base/barrier_callback_unittest.cc
@@ -15,7 +15,7 @@ namespace { TEST(BarrierCallbackTest, RunsImmediatelyForZeroCallbacks) { - bool done = true; + bool done = false; auto barrier_callback = base::BarrierCallback<int>( 0, base::BindLambdaForTesting([&done](std::vector<int> results) { EXPECT_THAT(results, testing::IsEmpty());
diff --git a/base/feature_list.cc b/base/feature_list.cc index 19707c40..0885a9ab 100644 --- a/base/feature_list.cc +++ b/base/feature_list.cc
@@ -23,6 +23,7 @@ #include "base/notreached.h" #include "base/path_service.h" #include "base/pickle.h" +#include "base/rand_util.h" #include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -503,6 +504,10 @@ // Note: Intentional leak of global singleton. g_feature_list_instance = instance.release(); +#if BUILDFLAG(IS_ANDROID) + ConfigureRandBytesFieldTrial(); +#endif + #if BUILDFLAG(DCHECK_IS_CONFIGURABLE) // Update the behaviour of LOGGING_DCHECK to match the Feature configuration. // DCHECK is also forced to be FATAL if we are running a death-test.
diff --git a/base/rand_util.h b/base/rand_util.h index 9e8a31ff..51e1337 100644 --- a/base/rand_util.h +++ b/base/rand_util.h
@@ -37,6 +37,12 @@ // the range [0, 1). Thread-safe. BASE_EXPORT double BitsToOpenEndedUnitInterval(uint64_t bits); +#if BUILDFLAG(IS_ANDROID) +// Sets the implementation of RandBytes according to the corresponding +// base::Feature. Thread safe: allows to switch while RandBytes() is in use. +BASE_EXPORT void ConfigureRandBytesFieldTrial(); +#endif + // Fills |output_length| bytes of |output| with random data. Thread-safe. // // Although implementations are required to use a cryptographically secure
diff --git a/base/rand_util_posix.cc b/base/rand_util_posix.cc index 7a0e2cd..5ea807e8 100644 --- a/base/rand_util_posix.cc +++ b/base/rand_util_posix.cc
@@ -8,13 +8,18 @@ #include <fcntl.h> #include <stddef.h> #include <stdint.h> +#include <sys/syscall.h> +#include <sys/utsname.h> #include <unistd.h> #include "base/check.h" #include "base/compiler_specific.h" +#include "base/feature_list.h" #include "base/files/file_util.h" +#include "base/metrics/histogram_macros.h" #include "base/no_destructor.h" #include "base/posix/eintr_wrapper.h" +#include "base/time/time.h" #include "build/build_config.h" #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_NACL) @@ -52,27 +57,103 @@ const int fd_; }; +#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \ + BUILDFLAG(IS_ANDROID)) && \ + !BUILDFLAG(IS_NACL) +// TODO(pasko): Unify reading kernel version numbers in: +// mojo/core/channel_linux.cc +// chrome/browser/android/seccomp_support_detector.cc +void KernelVersionNumbers(int32_t* major_version, + int32_t* minor_version, + int32_t* bugfix_version) { + struct utsname info; + if (uname(&info) < 0) { + NOTREACHED(); + *major_version = 0; + *minor_version = 0; + *bugfix_version = 0; + return; + } + int num_read = sscanf(info.release, "%d.%d.%d", major_version, minor_version, + bugfix_version); + if (num_read < 1) + *major_version = 0; + if (num_read < 2) + *minor_version = 0; + if (num_read < 3) + *bugfix_version = 0; +} + +bool KernelSupportsGetRandom() { + int32_t major = 0; + int32_t minor = 0; + int32_t bugfix = 0; + KernelVersionNumbers(&major, &minor, &bugfix); + if (major >= 3 && minor >= 17) + return true; + return false; +} + +bool GetRandomSyscall(void* output, size_t output_length) { + // We have to call `getrandom` via Linux Syscall Support, rather than through + // the libc wrapper, because we might not have an up-to-date libc (e.g. on + // some bots). + const ssize_t r = + HANDLE_EINTR(syscall(__NR_getrandom, output, output_length, 0)); + + // Return success only on total success. In case errno == ENOSYS (or any other + // error), we'll fall through to reading from urandom below. + if (output_length == static_cast<size_t>(r)) { + MSAN_UNPOISON(output, output_length); + return true; + } + return false; +} +#endif // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || + // BUILDFLAG(IS_ANDROID)) && !BUILDFLAG(IS_NACL) + +#if BUILDFLAG(IS_ANDROID) +std::atomic<bool> g_use_getrandom; + +const base::Feature kUseGetrandomForRandBytes{ + "UseGetrandomForRandBytes", base::FEATURE_DISABLED_BY_DEFAULT}; + +bool UseGetrandom() { + return g_use_getrandom.load(std::memory_order_relaxed); +} +#elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_NACL) +bool UseGetrandom() { + return true; +} +#endif + } // namespace namespace base { +#if BUILDFLAG(IS_ANDROID) +void ConfigureRandBytesFieldTrial() { + g_use_getrandom.store(FeatureList::IsEnabled(kUseGetrandomForRandBytes), + std::memory_order_relaxed); +} +#endif + // NOTE: In an ideal future, all implementations of this function will just // wrap BoringSSL's `RAND_bytes`. TODO(crbug.com/995996): Figure out the // build/test/performance issues with dcheng's CL // (https://chromium-review.googlesource.com/c/chromium/src/+/1545096) and land // it or some form of it. void RandBytes(void* output, size_t output_length) { -#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && !BUILDFLAG(IS_NACL) - // We have to call `getrandom` via Linux Syscall Support, rather than through - // the libc wrapper, because we might not have an up-to-date libc (e.g. on - // some bots). - const ssize_t r = HANDLE_EINTR(sys_getrandom(output, output_length, 0)); - - // Return success only on total success. In case errno == ENOSYS (or any other - // error), we'll fall through to reading from urandom below. - if (output_length == static_cast<size_t>(r)) { - MSAN_UNPOISON(output, output_length); - return; +#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \ + BUILDFLAG(IS_ANDROID)) && \ + !BUILDFLAG(IS_NACL) + if (UseGetrandom()) { + // On Android it is mandatory to check that the kernel _version_ has the + // support for a syscall before calling. The same check is made on Linux and + // ChromeOS to avoid making a syscall that predictably returns ENOSYS. + static const bool kernel_has_support = KernelSupportsGetRandom(); + if (kernel_has_support && GetRandomSyscall(output, output_length)) + return; } #elif BUILDFLAG(IS_MAC) // TODO(crbug.com/995996): Enable this on iOS too, when sys/random.h arrives
diff --git a/base/system/sys_info_fuchsia.cc b/base/system/sys_info_fuchsia.cc index 642510d..0246be1 100644 --- a/base/system/sys_info_fuchsia.cc +++ b/base/system/sys_info_fuchsia.cc
@@ -97,7 +97,7 @@ // static uint64_t SysInfo::AmountOfAvailablePhysicalMemoryImpl() { - // TODO(https://crbug.com/986608): Implement this. + // TODO(crbug.com/986608): Implement this when Fuchsia supports it. NOTIMPLEMENTED_LOG_ONCE(); return 0; } @@ -109,6 +109,8 @@ // static uint64_t SysInfo::AmountOfVirtualMemory() { + // Fuchsia does not provide this type of information. + // Return zero to indicate that there is unlimited available virtual memory. return 0; } @@ -171,15 +173,16 @@ // static std::string SysInfo::OperatingSystemVersion() { - return GetCachedBuildInfo().has_version() ? GetCachedBuildInfo().version() - : ""; + const auto& build_info = GetCachedBuildInfo(); + return build_info.has_version() ? build_info.version() : ""; } // static void SysInfo::OperatingSystemVersionNumbers(int32_t* major_version, int32_t* minor_version, int32_t* bugfix_version) { - // Fuchsia doesn't have OS version numbers. + // TODO(crbug.com/1348711): Implement this when Fuchsia supports it. + NOTIMPLEMENTED_LOG_ONCE(); *major_version = 0; *minor_version = 0; *bugfix_version = 0; @@ -198,6 +201,7 @@ // static std::string SysInfo::CPUModelName() { + // TODO(crbug.com/1233859): Implement this when Fuchsia supports it. NOTIMPLEMENTED_LOG_ONCE(); return std::string(); }
diff --git a/base/trace_event/memory_dump_provider_info.h b/base/trace_event/memory_dump_provider_info.h index 4784321e..ef6cd5e 100644 --- a/base/trace_event/memory_dump_provider_info.h +++ b/base/trace_event/memory_dump_provider_info.h
@@ -64,10 +64,22 @@ MemoryDumpProviderInfo(const MemoryDumpProviderInfo&) = delete; MemoryDumpProviderInfo& operator=(const MemoryDumpProviderInfo&) = delete; + // These non-const fields below, instead, are not thread safe and can be + // mutated only: + // - On the |task_runner|, when not null (i.e. for thread-bound MDPS). + // - By the MDM's background thread (or in any other way that guarantees + // sequencing) for non-thread-bound MDPs. + + // Used to transfer ownership for UnregisterAndDeleteDumpProviderSoon(). + // nullptr in all other cases. + // We need to declare this before `dump_provider`, because it might sometimes + // own the pointer it is referencing. Thus, we need this to be destroyed after + // `dump_provider`. + std::unique_ptr<MemoryDumpProvider> owned_dump_provider; + // It is safe to access the const fields below from any thread as they are // never mutated. - - const raw_ptr<MemoryDumpProvider, DanglingUntriaged> dump_provider; + const raw_ptr<MemoryDumpProvider> dump_provider; // The |options| arg passed to MDM::RegisterDumpProvider(). const MemoryDumpProvider::Options options; @@ -84,15 +96,6 @@ // True if the dump provider is allowed for background mode. const bool allowed_in_background_mode; - // These fields below, instead, are not thread safe and can be mutated only: - // - On the |task_runner|, when not null (i.e. for thread-bound MDPS). - // - By the MDM's background thread (or in any other way that guarantees - // sequencing) for non-thread-bound MDPs. - - // Used to transfer ownership for UnregisterAndDeleteDumpProviderSoon(). - // nullptr in all other cases. - std::unique_ptr<MemoryDumpProvider> owned_dump_provider; - // For fail-safe logic (auto-disable failing MDPs). int consecutive_failures;
diff --git a/base/trace_event/process_memory_dump.cc b/base/trace_event/process_memory_dump.cc index aadcf89a3..bb5d997 100644 --- a/base/trace_event/process_memory_dump.cc +++ b/base/trace_event/process_memory_dump.cc
@@ -30,7 +30,7 @@ #include <mach/vm_page_size.h> #endif -#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#if BUILDFLAG(IS_POSIX) #include <sys/mman.h> #endif @@ -40,6 +40,12 @@ #include <Psapi.h> #endif +#if BUILDFLAG(IS_FUCHSIA) +#include <tuple> + +#include "base/notreached.h" +#endif + using ProcessSnapshot = ::perfetto::protos::pbzero::MemoryTrackerSnapshot_ProcessSnapshot; @@ -113,12 +119,9 @@ #endif while (offset < mapped_size) { - // TODO(fuchsia): Port and remove [[maybe_unused]], see - // https://crbug.com/706592. - [[maybe_unused]] uintptr_t chunk_start = (start_pointer + offset); + uintptr_t chunk_start = (start_pointer + offset); const size_t chunk_size = std::min(mapped_size - offset, kMaxChunkSize); - [[maybe_unused]] const size_t page_count = - GetSystemPageCount(chunk_size, page_size); + const size_t page_count = GetSystemPageCount(chunk_size, page_size); size_t resident_page_count = 0; #if BUILDFLAG(IS_WIN) for (size_t i = 0; i < page_count; i++) { @@ -132,7 +135,11 @@ for (size_t i = 0; i < page_count; i++) resident_page_count += vec[i].VirtualAttributes.Valid; #elif BUILDFLAG(IS_FUCHSIA) - // TODO(fuchsia): Port, see https://crbug.com/706592. + // TODO(crbug.com/851760): Implement counting resident bytes. + // For now, log and avoid unused variable warnings. + NOTIMPLEMENTED_LOG_ONCE(); + std::ignore = chunk_start; + std::ignore = page_count; #elif BUILDFLAG(IS_APPLE) // mincore in MAC does not fail with EAGAIN. failure =
diff --git a/media/fuchsia/camera/test_support.shard.test-cml b/build/config/fuchsia/test/cfv1_launcher.shard.test-cml similarity index 81% rename from media/fuchsia/camera/test_support.shard.test-cml rename to build/config/fuchsia/test/cfv1_launcher.shard.test-cml index 3ffd910..47b5005 100644 --- a/media/fuchsia/camera/test_support.shard.test-cml +++ b/build/config/fuchsia/test/cfv1_launcher.shard.test-cml
@@ -4,7 +4,7 @@ { use: [ { - protocol: "fuchsia.sysmem.Allocator", + protocol: "fuchsia.sys.Launcher", }, ], }
diff --git a/build/fuchsia/cipd/BUILD.gn b/build/fuchsia/cipd/BUILD.gn index a2e5a64..da456f1 100644 --- a/build/fuchsia/cipd/BUILD.gn +++ b/build/fuchsia/cipd/BUILD.gn
@@ -281,6 +281,7 @@ deps = [ "//base:base_unittests_pkg", "//fuchsia_web/runners:cast_runner_integration_tests_cfv1_pkg", + "//fuchsia_web/runners:cast_runner_integration_tests_pkg", "//fuchsia_web/runners:web_runner_integration_tests_pkg", "//fuchsia_web/webengine:web_engine_integration_tests_pkg", "//ipc:ipc_tests_pkg", @@ -295,6 +296,7 @@ manifest_path = "${target_gen_dir}/test_manifest.json" far_sources = [ "${root_gen_dir}/base/base_unittests/base_unittests.far", + "${root_gen_dir}/fuchsia_web/runners/cast_runner_integration_tests/cast_runner_integration_tests.far", "${root_gen_dir}/ipc/ipc_tests/ipc_tests.far", "${root_gen_dir}/media/media_unittests/media_unittests.far", "${root_gen_dir}/mojo/mojo_unittests/mojo_unittests.far", @@ -327,6 +329,7 @@ }, { manifest_path = "${target_gen_dir}/cast_runner_tests_manifest.json" + far_sources = [ "${root_gen_dir}/fuchsia_web/runners/cast_runner_integration_tests/cast_runner_integration_tests.far" ] cfv1_far_sources = [ "${root_gen_dir}/fuchsia_web/runners/cast_runner_integration_tests_cfv1/cast_runner_integration_tests_cfv1.far" ] }, ]
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc index 3472a7ea..0042003b 100644 --- a/cc/metrics/compositor_frame_reporter.cc +++ b/cc/metrics/compositor_frame_reporter.cc
@@ -95,8 +95,13 @@ constexpr base::TimeDelta kHighLatencyMin = base::Milliseconds(75); // Number of breakdown stages of the current PipelineReporter -constexpr int kNumOfStages = static_cast<int>(StageType::kStageTypeCount) - 1; - +constexpr int kNumOfCompositorStages = + static_cast<int>(StageType::kStageTypeCount) - 1; +// Number of breakdown stages of the blink +constexpr int kNumOfBlinkStages = + static_cast<int>(BlinkBreakdown::kBreakdownCount); +// Number of breakdown stages of the viz +constexpr int kNumOfVizStages = static_cast<int>(VizBreakdown::kBreakdownCount); // Number of dispatch stages of the current EventLatency constexpr int kNumDispatchStages = static_cast<int>(EventMetrics::DispatchStage::kMaxValue); @@ -358,7 +363,12 @@ default; CompositorFrameReporter::CompositorLatencyInfo::CompositorLatencyInfo( base::TimeDelta init_value) - : top_level_stages(kNumOfStages, init_value), total_latency(init_value) {} + : top_level_stages(kNumOfCompositorStages, init_value), + blink_breakdown_stages(kNumOfBlinkStages, init_value), + viz_breakdown_stages(kNumOfVizStages, init_value), + total_latency(init_value), + total_blink_latency(init_value), + total_viz_latency(init_value) {} CompositorFrameReporter::CompositorLatencyInfo::~CompositorLatencyInfo() = default; @@ -695,10 +705,12 @@ if (frame_termination_status_ == FrameTerminationStatus::kUnknown) TerminateFrame(FrameTerminationStatus::kUnknown, Now()); - processed_blink_breakdown_ = std::make_unique<ProcessedBlinkBreakdown>( - blink_start_time_, begin_main_frame_start_, blink_breakdown_); - processed_viz_breakdown_ = - std::make_unique<ProcessedVizBreakdown>(viz_start_time_, viz_breakdown_); + if (!processed_blink_breakdown_) + processed_blink_breakdown_ = std::make_unique<ProcessedBlinkBreakdown>( + blink_start_time_, begin_main_frame_start_, blink_breakdown_); + if (!processed_viz_breakdown_) + processed_viz_breakdown_ = std::make_unique<ProcessedVizBreakdown>( + viz_start_time_, viz_breakdown_); DCHECK_EQ(current_stage_.start_time, base::TimeTicks()); const FrameInfo frame_info = GenerateFrameInfo(); @@ -1296,6 +1308,11 @@ if (total_pipeline_latency.is_zero()) return; + processed_blink_breakdown_ = std::make_unique<ProcessedBlinkBreakdown>( + blink_start_time_, begin_main_frame_start_, blink_breakdown_); + processed_viz_breakdown_ = + std::make_unique<ProcessedVizBreakdown>(viz_start_time_, viz_breakdown_); + // Note that `current_stage_durations` would always have the same length as // `previous_predictions`, since each index represent the breakdown stages of // the PipelineReporter listed at enum class, StageType. @@ -1308,6 +1325,22 @@ .top_level_stages[static_cast<int>(stage.stage_type)] = substageLatency; } + for (auto it = processed_blink_breakdown_->CreateIterator(); it.IsValid(); + it.Advance()) { + current_stage_durations + .blink_breakdown_stages[static_cast<int>(it.GetBreakdown())] = + it.GetLatency(); + current_stage_durations.total_blink_latency += it.GetLatency(); + } + + for (auto it = processed_viz_breakdown_->CreateIterator(true); it.IsValid(); + it.Advance()) { + current_stage_durations + .viz_breakdown_stages[static_cast<int>(it.GetBreakdown())] = + it.GetDuration(); + current_stage_durations.total_viz_latency += it.GetDuration(); + } + // Do not record current pipeline details or update predictions if no frame // is submitted. if (current_stage_durations @@ -1325,7 +1358,7 @@ previous_predictions.total_latency) >= prediction_deviation_threshold) FindHighLatencyAttribution(previous_predictions, current_stage_durations); - for (int i = 0; i < kNumOfStages; i++) { + for (int i = 0; i < kNumOfCompositorStages; i++) { previous_predictions.top_level_stages[i] = PredictLatency(previous_predictions.top_level_stages[i], current_stage_durations.top_level_stages[i]); @@ -1333,6 +1366,44 @@ previous_predictions.total_latency = PredictLatency(previous_predictions.total_latency, current_stage_durations.total_latency); + + if (!current_stage_durations.total_blink_latency.is_zero()) { + for (int i = 0; i < kNumOfBlinkStages; i++) { + previous_predictions.blink_breakdown_stages[i] = + previous_predictions.total_blink_latency.is_zero() + ? current_stage_durations.blink_breakdown_stages[i] + : PredictLatency( + previous_predictions.blink_breakdown_stages[i], + current_stage_durations.blink_breakdown_stages[i]); + } + previous_predictions.total_blink_latency = + previous_predictions.total_blink_latency.is_zero() + ? current_stage_durations.total_blink_latency + : PredictLatency(previous_predictions.total_blink_latency, + current_stage_durations.total_blink_latency); + } + + // TODO(crbug.com/1349930): implement check that ensure the prediction is + // correct by checking if platform supports breakdown of the stage + // SubmitCompositorFrameToPresentationCompositorFrame.SwapStartToSwapEnd, + // then SwapStartToSwapEnd should always be 0s and data for breakdown of it + // should always be available. (See enum class `VizBreakdown` for stage + // details.) + if (!current_stage_durations.total_viz_latency.is_zero()) { + for (int i = 0; i < kNumOfVizStages; i++) { + previous_predictions.viz_breakdown_stages[i] = + previous_predictions.total_viz_latency.is_zero() + ? current_stage_durations.viz_breakdown_stages[i] + : PredictLatency( + previous_predictions.viz_breakdown_stages[i], + current_stage_durations.viz_breakdown_stages[i]); + } + previous_predictions.total_viz_latency = + previous_predictions.total_viz_latency.is_zero() + ? current_stage_durations.total_viz_latency + : PredictLatency(previous_predictions.total_viz_latency, + current_stage_durations.total_viz_latency); + } } } @@ -1382,7 +1453,7 @@ return; CompositorFrameReporter::EventLatencyInfo actual_event_latency( - kNumDispatchStages, kNumOfStages); + kNumDispatchStages, kNumOfCompositorStages); actual_event_latency.total_duration = base::Microseconds(0); // Determine dispatch stage durations. @@ -1460,7 +1531,7 @@ // Calculate new compositor stage predictions. // TODO(crbug.com/1334827): Explore using existing PipelineReporter // predictions for the compositor stage. - for (int i = 0; i < kNumOfStages; i++) { + for (int i = 0; i < kNumOfCompositorStages; i++) { if (actual_event_latency.compositor_durations[i].is_positive()) { predicted_event_latency.compositor_durations[i] = CalculateWeightedAverage( @@ -1622,19 +1693,86 @@ double contribution_change = -1; double highest_contribution_change = -1; std::vector<int> highest_contribution_change_index; + std::vector<int> highest_blink_contribution_change_index; + std::vector<int> highest_viz_contribution_change_index; - for (int i = 0; i < kNumOfStages; i++) { - contribution_change = (current_stage_durations.top_level_stages[i] / - current_stage_durations.total_latency) - - (previous_predictions.top_level_stages[i] / - previous_predictions.total_latency); + for (int i = 0; i < kNumOfCompositorStages; i++) { + switch (i) { + case static_cast<int>(StageType::kSendBeginMainFrameToCommit): + if (current_stage_durations.top_level_stages[i].is_zero() || + previous_predictions.total_blink_latency.is_zero()) + continue; - if (contribution_change > highest_contribution_change) { - highest_contribution_change = contribution_change; - highest_contribution_change_index = {i}; - } else if (std::abs(contribution_change - highest_contribution_change) < - kEpsilon) { - highest_contribution_change_index.push_back(i); + DCHECK(!current_stage_durations.total_blink_latency.is_zero()) + << "There should never be the case where in `stage_history`, data " + "of `kSendBeginMainFrameToCommit` exists, however, the breakdown" + " of blink does not exist"; + + for (int j = 0; j < kNumOfBlinkStages; j++) { + contribution_change = + (current_stage_durations.blink_breakdown_stages[j] / + current_stage_durations.total_latency) - + (previous_predictions.blink_breakdown_stages[j] / + previous_predictions.total_latency); + + if (contribution_change > highest_contribution_change) { + highest_contribution_change = contribution_change; + highest_contribution_change_index.clear(); + highest_viz_contribution_change_index.clear(); + highest_blink_contribution_change_index = {j}; + } else if (std::abs(contribution_change - + highest_contribution_change) < kEpsilon) { + highest_blink_contribution_change_index.push_back(j); + } + } + break; + + case static_cast<int>( + StageType::kSubmitCompositorFrameToPresentationCompositorFrame): + if (current_stage_durations.top_level_stages[i].is_zero() || + previous_predictions.total_viz_latency.is_zero()) + continue; + + DCHECK(!current_stage_durations.total_viz_latency.is_zero()) + << "There should never be the case where in `stage_history`, data " + "of `kSubmitCompositorFrameToPresentationCompositorFrame` " + "exists, however, the breakdown of viz does not exist"; + + for (int j = 0; j < kNumOfVizStages; j++) { + contribution_change = + (current_stage_durations.viz_breakdown_stages[j] / + current_stage_durations.total_latency) - + (previous_predictions.viz_breakdown_stages[j] / + previous_predictions.total_latency); + + if (contribution_change > highest_contribution_change) { + highest_contribution_change = contribution_change; + highest_contribution_change_index.clear(); + highest_blink_contribution_change_index.clear(); + highest_viz_contribution_change_index = {j}; + } else if (std::abs(contribution_change - + highest_contribution_change) < kEpsilon) { + highest_viz_contribution_change_index.push_back(j); + } + } + break; + + default: + contribution_change = (current_stage_durations.top_level_stages[i] / + current_stage_durations.total_latency) - + (previous_predictions.top_level_stages[i] / + previous_predictions.total_latency); + + if (contribution_change > highest_contribution_change) { + highest_contribution_change = contribution_change; + highest_blink_contribution_change_index.clear(); + highest_viz_contribution_change_index.clear(); + highest_contribution_change_index = {i}; + } else if (std::abs(contribution_change - highest_contribution_change) < + kEpsilon) { + highest_contribution_change_index.push_back(i); + } + break; } } @@ -1645,6 +1783,16 @@ high_latency_substages_.push_back( GetStageName(static_cast<StageType>(index))); } + for (auto index : highest_blink_contribution_change_index) { + high_latency_substages_.push_back( + GetStageName(StageType::kSendBeginMainFrameToCommit, absl::nullopt, + static_cast<BlinkBreakdown>(index))); + } + for (auto index : highest_viz_contribution_change_index) { + high_latency_substages_.push_back(GetStageName( + StageType::kSubmitCompositorFrameToPresentationCompositorFrame, + static_cast<VizBreakdown>(index))); + } } } // namespace cc
diff --git a/cc/metrics/compositor_frame_reporter.h b/cc/metrics/compositor_frame_reporter.h index cb327d0f..952fd048 100644 --- a/cc/metrics/compositor_frame_reporter.h +++ b/cc/metrics/compositor_frame_reporter.h
@@ -250,8 +250,12 @@ ~CompositorLatencyInfo(); std::vector<base::TimeDelta> top_level_stages; - // TODO(crbug.com/1334823): add viz and blink breakdown + std::vector<base::TimeDelta> blink_breakdown_stages; + std::vector<base::TimeDelta> viz_breakdown_stages; + base::TimeDelta total_latency; + base::TimeDelta total_blink_latency; + base::TimeDelta total_viz_latency; }; CompositorFrameReporter(const ActiveTrackers& active_trackers,
diff --git a/cc/metrics/compositor_frame_reporter_unittest.cc b/cc/metrics/compositor_frame_reporter_unittest.cc index 26fb03ac..5f991ae4 100644 --- a/cc/metrics/compositor_frame_reporter_unittest.cc +++ b/cc/metrics/compositor_frame_reporter_unittest.cc
@@ -194,6 +194,20 @@ } } + void VerifyLatencyInfo( + CompositorFrameReporter::CompositorLatencyInfo& expected_info, + CompositorFrameReporter::CompositorLatencyInfo& actual_info) { + EXPECT_EQ(expected_info.top_level_stages, actual_info.top_level_stages); + EXPECT_EQ(expected_info.blink_breakdown_stages, + actual_info.blink_breakdown_stages); + EXPECT_EQ(expected_info.viz_breakdown_stages, + actual_info.viz_breakdown_stages); + EXPECT_EQ(expected_info.total_latency, actual_info.total_latency); + EXPECT_EQ(expected_info.total_blink_latency, + actual_info.total_blink_latency); + EXPECT_EQ(expected_info.total_viz_latency, actual_info.total_viz_latency); + } + // This should be defined before |pipeline_reporter_| so it is created before // and destroyed after that. base::SimpleTestTickClock test_tick_clock_; @@ -203,7 +217,7 @@ std::unique_ptr<CompositorFrameReporter> pipeline_reporter_; // Number of breakdown stages of the current PipelineReporter - const int kNumOfStages = + const int kNumOfCompositorStages = static_cast<int>(CompositorFrameReporter::StageType::kStageTypeCount) - 1; const int kNumDispatchStages = static_cast<int>(EventMetrics::DispatchStage::kMaxValue); @@ -786,8 +800,13 @@ AdvanceNowByUs(3); pipeline_reporter_->StartStage( CompositorFrameReporter::StageType::kSendBeginMainFrameToCommit, Now()); + AdvanceNowByUs(4); + base::TimeTicks begin_main_frame_start_time = Now(); + std::unique_ptr<BeginMainFrameMetrics> blink_breakdown = + BuildBlinkBreakdown(); + pipeline_reporter_->SetBlinkBreakdown(std::move(blink_breakdown), + begin_main_frame_start_time); - AdvanceNowByUs(3); pipeline_reporter_->StartStage(CompositorFrameReporter::StageType::kCommit, Now()); @@ -809,24 +828,51 @@ CompositorFrameReporter::StageType:: kSubmitCompositorFrameToPresentationCompositorFrame, Now()); + viz::FrameTimingDetails viz_breakdown = BuildVizBreakdown(); + pipeline_reporter_->SetVizBreakdown(viz_breakdown); - AdvanceNowByUs(3); pipeline_reporter_->TerminateFrame( - CompositorFrameReporter::FrameTerminationStatus::kPresentedFrame, Now()); + CompositorFrameReporter::FrameTerminationStatus::kPresentedFrame, + viz_breakdown.presentation_feedback.timestamp); // predictions when this is the very first prediction CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions1; - expected_latency_predictions1.top_level_stages = - std::vector<base::TimeDelta>(kNumOfStages, base::Microseconds(3)); - expected_latency_predictions1.total_latency = base::Microseconds(21); + expected_latency_predictions1.top_level_stages = { + base::Microseconds(3), base::Microseconds(55), base::Microseconds(3), + base::Microseconds(3), base::Microseconds(3), base::Microseconds(3), + base::Microseconds(15)}; + expected_latency_predictions1.blink_breakdown_stages = { + base::Microseconds(10), base::Microseconds(9), base::Microseconds(8), + base::Microseconds(7), base::Microseconds(0), base::Microseconds(5), + base::Microseconds(6), base::Microseconds(3), base::Microseconds(2), + base::Microseconds(1), base::Microseconds(4)}; + expected_latency_predictions1.viz_breakdown_stages = { + base::Microseconds(1), base::Microseconds(2), base::Microseconds(3), + base::Microseconds(4), base::Microseconds(5), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0)}; + expected_latency_predictions1.total_latency = base::Microseconds(85); + expected_latency_predictions1.total_blink_latency = base::Microseconds(55); + expected_latency_predictions1.total_viz_latency = base::Microseconds(15); // predictions when there exists a previous prediction - CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions2; + CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions2( + base::Microseconds(0)); expected_latency_predictions2.top_level_stages = { - base::Microseconds(1), base::Microseconds(0), base::Microseconds(3), - base::Microseconds(0), base::Microseconds(2), base::Microseconds(3), - base::Microseconds(0)}; - expected_latency_predictions2.total_latency = base::Microseconds(12); + base::Microseconds(1), base::Microseconds(13), base::Microseconds(3), + base::Microseconds(0), base::Microseconds(2), base::Microseconds(3), + base::Microseconds(3)}; + expected_latency_predictions2.blink_breakdown_stages = { + base::Microseconds(10), base::Microseconds(9), base::Microseconds(8), + base::Microseconds(7), base::Microseconds(0), base::Microseconds(5), + base::Microseconds(6), base::Microseconds(3), base::Microseconds(2), + base::Microseconds(1), base::Microseconds(4)}; + expected_latency_predictions2.viz_breakdown_stages = { + base::Microseconds(1), base::Microseconds(2), base::Microseconds(3), + base::Microseconds(4), base::Microseconds(5), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0)}; + expected_latency_predictions2.total_latency = base::Microseconds(28); + expected_latency_predictions2.total_blink_latency = base::Microseconds(55); + expected_latency_predictions2.total_viz_latency = base::Microseconds(15); // expected attribution for all 3 cases above std::vector<std::string> expected_latency_attributions = {}; @@ -839,7 +885,8 @@ pipeline_reporter_->high_latency_substages_for_testing_(); pipeline_reporter_->ClearHighLatencySubstagesForTesting(); - CompositorFrameReporter::CompositorLatencyInfo actual_latency_predictions2; + CompositorFrameReporter::CompositorLatencyInfo actual_latency_predictions2( + base::Microseconds(0)); actual_latency_predictions2.top_level_stages = { base::Microseconds(1), base::Microseconds(0), base::Microseconds(4), base::Microseconds(0), base::Microseconds(2), base::Microseconds(3), @@ -851,14 +898,8 @@ pipeline_reporter_->high_latency_substages_for_testing_(); pipeline_reporter_->ClearHighLatencySubstagesForTesting(); - EXPECT_EQ(expected_latency_predictions1.top_level_stages, - actual_latency_predictions1.top_level_stages); - EXPECT_EQ(expected_latency_predictions1.total_latency, - actual_latency_predictions1.total_latency); - EXPECT_EQ(expected_latency_predictions2.top_level_stages, - actual_latency_predictions2.top_level_stages); - EXPECT_EQ(expected_latency_predictions2.total_latency, - actual_latency_predictions2.total_latency); + VerifyLatencyInfo(expected_latency_predictions1, actual_latency_predictions1); + VerifyLatencyInfo(expected_latency_predictions2, actual_latency_predictions2); EXPECT_EQ(expected_latency_attributions, actual_latency_attributions1); EXPECT_EQ(expected_latency_attributions, actual_latency_attributions2); @@ -908,7 +949,8 @@ base::Microseconds(-1)); // predictions when there exists a previous prediction - CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions2; + CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions2( + base::Microseconds(0)); expected_latency_predictions2.top_level_stages = { base::Microseconds(1), base::Microseconds(0), base::Microseconds(4), base::Microseconds(0), base::Microseconds(2), base::Microseconds(3), @@ -926,26 +968,22 @@ pipeline_reporter_->high_latency_substages_for_testing_(); pipeline_reporter_->ClearHighLatencySubstagesForTesting(); - CompositorFrameReporter::CompositorLatencyInfo actual_latency_predictions2; + CompositorFrameReporter::CompositorLatencyInfo actual_latency_predictions2( + base::Microseconds(0)); actual_latency_predictions2.top_level_stages = { base::Microseconds(1), base::Microseconds(0), base::Microseconds(4), base::Microseconds(0), base::Microseconds(2), base::Microseconds(3), base::Microseconds(0)}; actual_latency_predictions2.total_latency = base::Microseconds(10); + pipeline_reporter_->CalculateCompositorLatencyPrediction( actual_latency_predictions2, kLatencyPredictionDeviationThreshold); std::vector<std::string> actual_latency_attributions2 = pipeline_reporter_->high_latency_substages_for_testing_(); pipeline_reporter_->ClearHighLatencySubstagesForTesting(); - EXPECT_EQ(expected_latency_predictions1.top_level_stages, - actual_latency_predictions1.top_level_stages); - EXPECT_EQ(expected_latency_predictions1.total_latency, - actual_latency_predictions1.total_latency); - EXPECT_EQ(expected_latency_predictions2.top_level_stages, - actual_latency_predictions2.top_level_stages); - EXPECT_EQ(expected_latency_predictions2.total_latency, - actual_latency_predictions2.total_latency); + VerifyLatencyInfo(expected_latency_predictions1, actual_latency_predictions1); + VerifyLatencyInfo(expected_latency_predictions2, actual_latency_predictions2); EXPECT_EQ(expected_latency_attributions, actual_latency_attributions1); EXPECT_EQ(expected_latency_attributions, actual_latency_attributions2); @@ -961,8 +999,25 @@ AdvanceNowByUs(10000000); pipeline_reporter_->StartStage( CompositorFrameReporter::StageType::kSendBeginMainFrameToCommit, Now()); + AdvanceNowByUs(400000); + base::TimeTicks begin_main_frame_start_time = Now(); - AdvanceNowByUs(5000000); + auto blink_breakdown = std::make_unique<BeginMainFrameMetrics>(); + blink_breakdown->handle_input_events = base::Microseconds(1000000); + blink_breakdown->animate = base::Microseconds(900000); + blink_breakdown->style_update = base::Microseconds(800000); + blink_breakdown->layout_update = base::Microseconds(300000); + blink_breakdown->accessibility = base::Microseconds(400000); + blink_breakdown->prepaint = base::Microseconds(500000); + blink_breakdown->compositing_inputs = base::Microseconds(600000); + blink_breakdown->paint = base::Microseconds(300000); + blink_breakdown->composite_commit = base::Microseconds(200000); + blink_breakdown->update_layers = base::Microseconds(100000); + AdvanceNowByUs(5100000); + + pipeline_reporter_->SetBlinkBreakdown(std::move(blink_breakdown), + begin_main_frame_start_time); + pipeline_reporter_->StartStage(CompositorFrameReporter::StageType::kCommit, Now()); @@ -985,27 +1040,73 @@ kSubmitCompositorFrameToPresentationCompositorFrame, Now()); - AdvanceNowByUs(10000000); + viz::FrameTimingDetails viz_breakdown; + viz_breakdown.received_compositor_frame_timestamp = AdvanceNowByUs(1000000); + viz_breakdown.draw_start_timestamp = AdvanceNowByUs(2000000); + viz_breakdown.swap_timings.swap_start = AdvanceNowByUs(3000000); + viz_breakdown.presentation_feedback.available_timestamp = + AdvanceNowByUs(15000000); + viz_breakdown.presentation_feedback.ready_timestamp = AdvanceNowByUs(700000); + viz_breakdown.presentation_feedback.latch_timestamp = AdvanceNowByUs(800000); + viz_breakdown.swap_timings.swap_end = AdvanceNowByUs(1000000); + viz_breakdown.presentation_feedback.timestamp = AdvanceNowByUs(5000000); + + pipeline_reporter_->SetVizBreakdown(viz_breakdown); + pipeline_reporter_->TerminateFrame( CompositorFrameReporter::FrameTerminationStatus::kPresentedFrame, Now()); // predictions when this is the very first prediction CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions1; expected_latency_predictions1.top_level_stages = { - base::Microseconds(10000000), base::Microseconds(5000000), + base::Microseconds(10000000), base::Microseconds(5500000), base::Microseconds(6000000), base::Microseconds(10000000), base::Microseconds(0), base::Microseconds(2000000), - base::Microseconds(10000000)}; - expected_latency_predictions1.total_latency = base::Microseconds(43000000); + base::Microseconds(28500000)}; + expected_latency_predictions1.blink_breakdown_stages = { + base::Microseconds(1000000), base::Microseconds(900000), + base::Microseconds(800000), base::Microseconds(300000), + base::Microseconds(400000), base::Microseconds(500000), + base::Microseconds(600000), base::Microseconds(300000), + base::Microseconds(200000), base::Microseconds(100000), + base::Microseconds(400000)}; + expected_latency_predictions1.viz_breakdown_stages = { + base::Microseconds(1000000), base::Microseconds(2000000), + base::Microseconds(3000000), base::Microseconds(0), + base::Microseconds(5000000), base::Microseconds(15000000), + base::Microseconds(700000), base::Microseconds(800000), + base::Microseconds(1000000)}; + expected_latency_predictions1.total_latency = base::Microseconds(62000000); + expected_latency_predictions1.total_blink_latency = + base::Microseconds(5500000); + expected_latency_predictions1.total_viz_latency = + base::Microseconds(28500000); // predictions when there exists a previous prediction CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions2; expected_latency_predictions2.top_level_stages = { - base::Microseconds(2500000), base::Microseconds(1250000), - base::Microseconds(1500003), base::Microseconds(2500000), - base::Microseconds(1), base::Microseconds(500002), - base::Microseconds(2500000)}; - expected_latency_predictions2.total_latency = base::Microseconds(10750007); + base::Microseconds(8500000), base::Microseconds(4375000), + base::Microseconds(4875000), base::Microseconds(5252650), + base::Microseconds(750000), base::Microseconds(1850000), + base::Microseconds(18375000)}; + expected_latency_predictions2.blink_breakdown_stages = { + base::Microseconds(1000000), base::Microseconds(225000), + base::Microseconds(500000), base::Microseconds(75000), + base::Microseconds(250000), base::Microseconds(350000), + base::Microseconds(150000), base::Microseconds(750000), + base::Microseconds(650000), base::Microseconds(250000), + base::Microseconds(175000)}; + expected_latency_predictions2.viz_breakdown_stages = { + base::Microseconds(625000), base::Microseconds(875000), + base::Microseconds(1500000), base::Microseconds(0), + base::Microseconds(1706075), base::Microseconds(9750000), + base::Microseconds(925000), base::Microseconds(1100000), + base::Microseconds(1893925)}; + expected_latency_predictions2.total_latency = base::Microseconds(43977650); + expected_latency_predictions2.total_blink_latency = + base::Microseconds(4375000); + expected_latency_predictions2.total_viz_latency = + base::Microseconds(18375000); // expected attribution for cases 1 above std::vector<std::string> expected_latency_attributions1 = {}; @@ -1013,7 +1114,8 @@ // expected attribution for case 2 above std::vector<std::string> expected_latency_attributions2 = { "EndCommitToActivation", - "SubmitCompositorFrameToPresentationCompositorFrame"}; + "SubmitCompositorFrameToPresentationCompositorFrame." + "SwapEndToPresentationCompositorFrame"}; CompositorFrameReporter::CompositorLatencyInfo actual_latency_predictions1( base::Microseconds(-1)); @@ -1025,24 +1127,35 @@ CompositorFrameReporter::CompositorLatencyInfo actual_latency_predictions2; actual_latency_predictions2.top_level_stages = { - base::Microseconds(1), base::Microseconds(0), base::Microseconds(4), - base::Microseconds(0), base::Microseconds(2), base::Microseconds(3), - base::Microseconds(0)}; - actual_latency_predictions2.total_latency = base::Microseconds(10); + base::Microseconds(8000000), base::Microseconds(4000000), + base::Microseconds(4500000), base::Microseconds(3670200), + base::Microseconds(1000000), base::Microseconds(1800000), + base::Microseconds(15000000)}; + actual_latency_predictions2.blink_breakdown_stages = { + base::Microseconds(1000000), base::Microseconds(0), + base::Microseconds(400000), base::Microseconds(0), + base::Microseconds(200000), base::Microseconds(300000), + base::Microseconds(0), base::Microseconds(900000), + base::Microseconds(800000), base::Microseconds(300000), + base::Microseconds(100000)}; + actual_latency_predictions2.viz_breakdown_stages = { + base::Microseconds(500000), base::Microseconds(500000), + base::Microseconds(1000000), base::Microseconds(0), + base::Microseconds(608100), base::Microseconds(8000000), + base::Microseconds(1000000), base::Microseconds(1200000), + base::Microseconds(2191900)}; + actual_latency_predictions2.total_latency = base::Microseconds(37970200); + actual_latency_predictions2.total_blink_latency = base::Microseconds(4000000); + actual_latency_predictions2.total_viz_latency = base::Microseconds(15000000); + pipeline_reporter_->CalculateCompositorLatencyPrediction( actual_latency_predictions2, kLatencyPredictionDeviationThreshold); std::vector<std::string> actual_latency_attributions2 = pipeline_reporter_->high_latency_substages_for_testing_(); pipeline_reporter_->ClearHighLatencySubstagesForTesting(); - EXPECT_EQ(expected_latency_predictions1.top_level_stages, - actual_latency_predictions1.top_level_stages); - EXPECT_EQ(expected_latency_predictions1.total_latency, - actual_latency_predictions1.total_latency); - EXPECT_EQ(expected_latency_predictions2.top_level_stages, - actual_latency_predictions2.top_level_stages); - EXPECT_EQ(expected_latency_predictions2.total_latency, - actual_latency_predictions2.total_latency); + VerifyLatencyInfo(expected_latency_predictions1, actual_latency_predictions1); + VerifyLatencyInfo(expected_latency_predictions2, actual_latency_predictions2); EXPECT_EQ(expected_latency_attributions1, actual_latency_attributions1); EXPECT_EQ(expected_latency_attributions2, actual_latency_attributions2); @@ -1053,7 +1166,8 @@ TEST_F(CompositorFrameReporterTest, StageLatencyMultiplePrediction) { CompositorFrameReporter::CompositorLatencyInfo actual_latency_predictions( base::Microseconds(-1)); - CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions; + CompositorFrameReporter::CompositorLatencyInfo expected_latency_predictions( + base::Microseconds(-1)); // First compositor reporter (general) pipeline_reporter_->StartStage( @@ -1071,7 +1185,15 @@ kSubmitCompositorFrameToPresentationCompositorFrame, Now()); - AdvanceNowByUs(833000); + viz::FrameTimingDetails viz_breakdown; + viz_breakdown.received_compositor_frame_timestamp = AdvanceNowByUs(330000); + viz_breakdown.draw_start_timestamp = AdvanceNowByUs(23000); + viz_breakdown.swap_timings.swap_start = AdvanceNowByUs(170000); + viz_breakdown.swap_timings.swap_end = AdvanceNowByUs(280000); + viz_breakdown.presentation_feedback.timestamp = AdvanceNowByUs(30000); + + pipeline_reporter_->SetVizBreakdown(viz_breakdown); + pipeline_reporter_->TerminateFrame( CompositorFrameReporter::FrameTerminationStatus::kPresentedFrame, Now()); @@ -1080,15 +1202,25 @@ base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), base::Microseconds(1500), base::Microseconds(833000)}; + expected_latency_predictions.blink_breakdown_stages = { + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0)}; + expected_latency_predictions.viz_breakdown_stages = { + base::Microseconds(330000), base::Microseconds(23000), + base::Microseconds(170000), base::Microseconds(280000), + base::Microseconds(30000), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0)}; expected_latency_predictions.total_latency = base::Microseconds(850500); + expected_latency_predictions.total_blink_latency = base::Microseconds(0); + expected_latency_predictions.total_viz_latency = base::Microseconds(833000); pipeline_reporter_->CalculateCompositorLatencyPrediction( actual_latency_predictions, kLatencyPredictionDeviationThreshold); - EXPECT_EQ(expected_latency_predictions.top_level_stages, - actual_latency_predictions.top_level_stages); - EXPECT_EQ(expected_latency_predictions.total_latency, - actual_latency_predictions.total_latency); + VerifyLatencyInfo(expected_latency_predictions, actual_latency_predictions); // Second compositor reporter (without subtmit stage) pipeline_reporter_ = CreatePipelineReporter(); @@ -1106,15 +1238,25 @@ base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), base::Microseconds(1500), base::Microseconds(833000)}; + expected_latency_predictions.blink_breakdown_stages = { + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0)}; + expected_latency_predictions.viz_breakdown_stages = { + base::Microseconds(330000), base::Microseconds(23000), + base::Microseconds(170000), base::Microseconds(280000), + base::Microseconds(30000), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0)}; expected_latency_predictions.total_latency = base::Microseconds(850500); + expected_latency_predictions.total_blink_latency = base::Microseconds(0); + expected_latency_predictions.total_viz_latency = base::Microseconds(833000); pipeline_reporter_->CalculateCompositorLatencyPrediction( actual_latency_predictions, kLatencyPredictionDeviationThreshold); - EXPECT_EQ(expected_latency_predictions.top_level_stages, - actual_latency_predictions.top_level_stages); - EXPECT_EQ(expected_latency_predictions.total_latency, - actual_latency_predictions.total_latency); + VerifyLatencyInfo(expected_latency_predictions, actual_latency_predictions); // Third compositor reporter (prediction and actual latency does not differ // by 8) @@ -1134,7 +1276,14 @@ kSubmitCompositorFrameToPresentationCompositorFrame, Now()); - AdvanceNowByUs(833000); + viz_breakdown.received_compositor_frame_timestamp = AdvanceNowByUs(330000); + viz_breakdown.draw_start_timestamp = AdvanceNowByUs(23000); + viz_breakdown.swap_timings.swap_start = AdvanceNowByUs(170000); + viz_breakdown.swap_timings.swap_end = AdvanceNowByUs(280000); + viz_breakdown.presentation_feedback.timestamp = AdvanceNowByUs(30000); + + pipeline_reporter_->SetVizBreakdown(viz_breakdown); + pipeline_reporter_->TerminateFrame( CompositorFrameReporter::FrameTerminationStatus::kPresentedFrame, Now()); @@ -1143,15 +1292,25 @@ base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), base::Microseconds(1625), base::Microseconds(833000)}; + expected_latency_predictions.blink_breakdown_stages = { + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0)}; + expected_latency_predictions.viz_breakdown_stages = { + base::Microseconds(330000), base::Microseconds(23000), + base::Microseconds(170000), base::Microseconds(280000), + base::Microseconds(30000), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0)}; expected_latency_predictions.total_latency = base::Microseconds(850750); + expected_latency_predictions.total_blink_latency = base::Microseconds(0); + expected_latency_predictions.total_viz_latency = base::Microseconds(833000); pipeline_reporter_->CalculateCompositorLatencyPrediction( actual_latency_predictions, kLatencyPredictionDeviationThreshold); - EXPECT_EQ(expected_latency_predictions.top_level_stages, - actual_latency_predictions.top_level_stages); - EXPECT_EQ(expected_latency_predictions.total_latency, - actual_latency_predictions.total_latency); + VerifyLatencyInfo(expected_latency_predictions, actual_latency_predictions); // Fourth compositor reporter (total duration is 0) pipeline_reporter_ = CreatePipelineReporter(); @@ -1187,15 +1346,25 @@ base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), base::Microseconds(1625), base::Microseconds(833000)}; + expected_latency_predictions.blink_breakdown_stages = { + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0)}; + expected_latency_predictions.viz_breakdown_stages = { + base::Microseconds(330000), base::Microseconds(23000), + base::Microseconds(170000), base::Microseconds(280000), + base::Microseconds(30000), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0)}; expected_latency_predictions.total_latency = base::Microseconds(850750); + expected_latency_predictions.total_blink_latency = base::Microseconds(0); + expected_latency_predictions.total_viz_latency = base::Microseconds(833000); pipeline_reporter_->CalculateCompositorLatencyPrediction( actual_latency_predictions, kLatencyPredictionDeviationThreshold); - EXPECT_EQ(expected_latency_predictions.top_level_stages, - actual_latency_predictions.top_level_stages); - EXPECT_EQ(expected_latency_predictions.total_latency, - actual_latency_predictions.total_latency); + VerifyLatencyInfo(expected_latency_predictions, actual_latency_predictions); // Fifth compositor reporter (prediction and actual latency differ by a lot) pipeline_reporter_ = CreatePipelineReporter(); @@ -1207,7 +1376,25 @@ pipeline_reporter_->StartStage( CompositorFrameReporter::StageType::kSendBeginMainFrameToCommit, Now()); - AdvanceNowByUs(60000); + AdvanceNowByUs(4000); + base::TimeTicks begin_main_frame_start_time = Now(); + + auto blink_breakdown = std::make_unique<BeginMainFrameMetrics>(); + blink_breakdown->handle_input_events = base::Microseconds(12000); + blink_breakdown->animate = base::Microseconds(3000); + blink_breakdown->style_update = base::Microseconds(7000); + blink_breakdown->layout_update = base::Microseconds(19000); + blink_breakdown->accessibility = base::Microseconds(800); + blink_breakdown->prepaint = base::Microseconds(4100); + blink_breakdown->compositing_inputs = base::Microseconds(5100); + blink_breakdown->paint = base::Microseconds(1500); + blink_breakdown->composite_commit = base::Microseconds(1500); + blink_breakdown->update_layers = base::Microseconds(2000); + AdvanceNowByUs(56000); + + pipeline_reporter_->SetBlinkBreakdown(std::move(blink_breakdown), + begin_main_frame_start_time); + pipeline_reporter_->StartStage(CompositorFrameReporter::StageType::kCommit, Now()); @@ -1230,30 +1417,48 @@ kSubmitCompositorFrameToPresentationCompositorFrame, Now()); - AdvanceNowByUs(833000); + viz_breakdown.received_compositor_frame_timestamp = AdvanceNowByUs(340000); + viz_breakdown.draw_start_timestamp = AdvanceNowByUs(20000); + viz_breakdown.swap_timings.swap_start = AdvanceNowByUs(160000); + viz_breakdown.swap_timings.swap_end = AdvanceNowByUs(283000); + viz_breakdown.presentation_feedback.timestamp = AdvanceNowByUs(30000); + + pipeline_reporter_->SetVizBreakdown(viz_breakdown); + pipeline_reporter_->TerminateFrame( - CompositorFrameReporter::FrameTerminationStatus::kDidNotProduceFrame, - Now()); + CompositorFrameReporter::FrameTerminationStatus::kPresentedFrame, Now()); expected_latency_predictions.top_level_stages = { base::Microseconds(16093), base::Microseconds(15000), base::Microseconds(1500), base::Microseconds(750), base::Microseconds(75), base::Microseconds(10968), base::Microseconds(833000)}; + expected_latency_predictions.blink_breakdown_stages = { + base::Microseconds(12000), base::Microseconds(3000), + base::Microseconds(7000), base::Microseconds(19000), + base::Microseconds(800), base::Microseconds(4100), + base::Microseconds(5100), base::Microseconds(1500), + base::Microseconds(1500), base::Microseconds(2000), + base::Microseconds(4000)}; + expected_latency_predictions.viz_breakdown_stages = { + base::Microseconds(332500), base::Microseconds(22250), + base::Microseconds(167500), base::Microseconds(280750), + base::Microseconds(30000), base::Microseconds(0), + base::Microseconds(0), base::Microseconds(0), + base::Microseconds(0)}; expected_latency_predictions.total_latency = base::Microseconds(877387); + expected_latency_predictions.total_blink_latency = base::Microseconds(60000); + expected_latency_predictions.total_viz_latency = base::Microseconds(833000); std::vector<std::string> expected_latency_attributions = { - "SendBeginMainFrameToCommit"}; + "EndActivateToSubmitCompositorFrame"}; pipeline_reporter_->CalculateCompositorLatencyPrediction( actual_latency_predictions, kLatencyPredictionDeviationThreshold); std::vector<std::string> actual_latency_attributions = pipeline_reporter_->high_latency_substages_for_testing_(); - EXPECT_EQ(expected_latency_predictions.top_level_stages, - actual_latency_predictions.top_level_stages); - EXPECT_EQ(expected_latency_predictions.total_latency, - actual_latency_predictions.total_latency); + VerifyLatencyInfo(expected_latency_predictions, actual_latency_predictions); EXPECT_EQ(expected_latency_attributions, actual_latency_attributions); pipeline_reporter_ = nullptr; @@ -1294,7 +1499,7 @@ base::TimeDelta expected_total1 = base::Microseconds(2100); CompositorFrameReporter::EventLatencyInfo actual_predictions1 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); pipeline_reporter_->CalculateEventLatencyPrediction( actual_predictions1, kLatencyPredictionDeviationThreshold); @@ -1307,7 +1512,7 @@ base::TimeDelta expected_total2 = base::Microseconds(2339); CompositorFrameReporter::EventLatencyInfo actual_predictions2 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); IntToTimeDeltaVector(actual_predictions2.dispatch_durations, std::vector<int>{250, 300, 450, 200, 500}); actual_predictions2.transition_duration = base::Microseconds(420); @@ -1323,7 +1528,7 @@ base::TimeDelta expected_total3 = base::Microseconds(2295); CompositorFrameReporter::EventLatencyInfo actual_predictions3 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); IntToTimeDeltaVector(actual_predictions3.dispatch_durations, std::vector<int>{400, 500, 300, -1, -1}); actual_predictions3.transition_duration = base::Microseconds(260); @@ -1386,7 +1591,7 @@ base::TimeDelta expected_total1 = base::Microseconds(2470); CompositorFrameReporter::EventLatencyInfo actual_predictions1 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); pipeline_reporter_->CalculateEventLatencyPrediction( actual_predictions1, kLatencyPredictionDeviationThreshold); @@ -1399,7 +1604,7 @@ base::TimeDelta expected_total2 = base::Microseconds(2502); CompositorFrameReporter::EventLatencyInfo actual_predictions2 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); IntToTimeDeltaVector(actual_predictions2.dispatch_durations, std::vector<int>{200, 300, 400, 200, 500}); actual_predictions2.transition_duration = base::Microseconds(380); @@ -1415,7 +1620,7 @@ base::TimeDelta expected_total3 = base::Microseconds(2462); CompositorFrameReporter::EventLatencyInfo actual_predictions3 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); IntToTimeDeltaVector(actual_predictions3.dispatch_durations, std::vector<int>{400, 500, 760, -1, -1}); actual_predictions3.transition_duration = base::Microseconds(500); @@ -1485,14 +1690,14 @@ IntToTimeDeltaVector(expected_dispatch1, std::vector<int>{300, 300, 300, 300, 300}); base::TimeDelta expected_transition1 = base::Microseconds(300); - std::vector<base::TimeDelta> expected_compositor1(kNumOfStages, + std::vector<base::TimeDelta> expected_compositor1(kNumOfCompositorStages, base::Microseconds(-1)); IntToTimeDeltaVector(expected_compositor1, std::vector<int>{300, -1, -1, -1, -1, 300, 300}); base::TimeDelta expected_total1 = base::Microseconds(2700); CompositorFrameReporter::EventLatencyInfo actual_predictions1 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); pipeline_reporter_->CalculateEventLatencyPrediction( actual_predictions1, kLatencyPredictionDeviationThreshold); @@ -1502,14 +1707,14 @@ IntToTimeDeltaVector(expected_dispatch2, std::vector<int>{262, 300, 412, 225, 450}); base::TimeDelta expected_transition2 = base::Microseconds(390); - std::vector<base::TimeDelta> expected_compositor2(kNumOfStages, + std::vector<base::TimeDelta> expected_compositor2(kNumOfCompositorStages, base::Microseconds(-1)); IntToTimeDeltaVector(expected_compositor2, std::vector<int>{465, 500, 90, 720, 410, 742, 390}); base::TimeDelta expected_total2 = base::Microseconds(5356); CompositorFrameReporter::EventLatencyInfo actual_predictions2 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); IntToTimeDeltaVector(actual_predictions2.dispatch_durations, std::vector<int>{250, 300, 450, 200, 500}); actual_predictions2.transition_duration = base::Microseconds(420); @@ -1524,14 +1729,14 @@ IntToTimeDeltaVector(expected_dispatch3, std::vector<int>{375, 450, 300, 300, 300}); base::TimeDelta expected_transition3 = base::Microseconds(270); - std::vector<base::TimeDelta> expected_compositor3(kNumOfStages, + std::vector<base::TimeDelta> expected_compositor3(kNumOfCompositorStages, base::Microseconds(-1)); IntToTimeDeltaVector(expected_compositor3, std::vector<int>{300, 500, -1, -1, 410, 742, 390}); base::TimeDelta expected_total3 = base::Microseconds(4337); CompositorFrameReporter::EventLatencyInfo actual_predictions3 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); IntToTimeDeltaVector(actual_predictions3.dispatch_durations, std::vector<int>{400, 500, 300, -1, -1}); actual_predictions3.transition_duration = base::Microseconds(260); @@ -1545,7 +1750,7 @@ EXPECT_EQ(expected_dispatch2[i], actual_predictions2.dispatch_durations[i]); EXPECT_EQ(expected_dispatch3[i], actual_predictions3.dispatch_durations[i]); } - for (int i = 0; i < kNumOfStages; i++) { + for (int i = 0; i < kNumOfCompositorStages; i++) { EXPECT_EQ(expected_compositor1[i], actual_predictions1.compositor_durations[i]); EXPECT_EQ(expected_compositor2[i], @@ -1618,7 +1823,7 @@ std::vector<int>{300, 300, 300, 300, 300}); base::TimeDelta expected_transition1 = base::Microseconds(300) + kTouchEventTransition; - std::vector<base::TimeDelta> expected_compositor1(kNumOfStages, + std::vector<base::TimeDelta> expected_compositor1(kNumOfCompositorStages, base::Microseconds(-1)); IntToTimeDeltaVector(expected_compositor1, std::vector<int>{300, -1, -1, -1, -1, 300, 300}); @@ -1626,7 +1831,7 @@ base::Microseconds(2700) + kTouchEventTransition; CompositorFrameReporter::EventLatencyInfo actual_predictions1 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); pipeline_reporter_->CalculateEventLatencyPrediction( actual_predictions1, kLatencyPredictionDeviationThreshold); @@ -1636,14 +1841,14 @@ IntToTimeDeltaVector(expected_dispatch2, std::vector<int>{262, 300, 412, 225, 450}); base::TimeDelta expected_transition2 = base::Microseconds(393); - std::vector<base::TimeDelta> expected_compositor2(kNumOfStages, + std::vector<base::TimeDelta> expected_compositor2(kNumOfCompositorStages, base::Microseconds(-1)); IntToTimeDeltaVector(expected_compositor2, std::vector<int>{465, 500, 90, 720, 410, 742, 390}); base::TimeDelta expected_total2 = base::Microseconds(5359); CompositorFrameReporter::EventLatencyInfo actual_predictions2 = CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages); + kNumOfCompositorStages); IntToTimeDeltaVector(actual_predictions2.dispatch_durations, std::vector<int>{250, 300, 450, 200, 500}); actual_predictions2.transition_duration = base::Microseconds(420); @@ -1656,7 +1861,7 @@ EXPECT_EQ(expected_dispatch1[i], actual_predictions1.dispatch_durations[i]); EXPECT_EQ(expected_dispatch2[i], actual_predictions2.dispatch_durations[i]); } - for (int i = 0; i < kNumOfStages; i++) { + for (int i = 0; i < kNumOfCompositorStages; i++) { EXPECT_EQ(expected_compositor1[i], actual_predictions1.compositor_durations[i]); EXPECT_EQ(expected_compositor2[i],
diff --git a/cc/metrics/compositor_frame_reporting_controller.cc b/cc/metrics/compositor_frame_reporting_controller.cc index 5e7816e..b05992c 100644 --- a/cc/metrics/compositor_frame_reporting_controller.cc +++ b/cc/metrics/compositor_frame_reporting_controller.cc
@@ -23,7 +23,8 @@ using FrameTerminationStatus = CompositorFrameReporter::FrameTerminationStatus; constexpr char kTraceCategory[] = "cc,benchmark"; -constexpr int kNumOfStages = static_cast<int>(StageType::kStageTypeCount) - 1; +constexpr int kNumOfCompositorStages = + static_cast<int>(StageType::kStageTypeCount) - 1; constexpr int kNumDispatchStages = static_cast<int>(EventMetrics::DispatchStage::kMaxValue); constexpr base::TimeDelta kDefaultLatencyPredictionDeviationThreshold = @@ -41,7 +42,7 @@ previous_latency_predictions_impl_(base::Microseconds(-1)), event_latency_predictions_( CompositorFrameReporter::EventLatencyInfo(kNumDispatchStages, - kNumOfStages)) { + kNumOfCompositorStages)) { if (should_report_ukm) { // UKM metrics should be reported if and only if `latency_ukm_reporter` is // set on `global_trackers_`.
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index 24496e3..c98c868b 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -2173,6 +2173,71 @@ } } // namespace +TEST_F(OopPixelTest, CopySubTexture) { + const gfx::Size size(16, 16); + auto* ri = raster_context_provider_->RasterInterface(); + auto* sii = raster_context_provider_->SharedImageInterface(); + const gfx::ColorSpace source_color_space = gfx::ColorSpace::CreateSRGB(); + const gfx::ColorSpace dest_color_space = + gfx::ColorSpace::CreateDisplayP3D65(); + + // Create data to upload in sRGB (solid green). + SkBitmap upload_bitmap; + { + upload_bitmap.allocPixels(SkImageInfo::MakeN32Premul( + size.width(), size.height(), source_color_space.ToSkColorSpace())); + SkCanvas canvas(upload_bitmap, SkSurfaceProps{}); + SkPaint paint; + paint.setColor(SkColors::kGreen); + canvas.drawRect(SkRect::MakeWH(size.width(), size.height()), paint); + } + + // Create an sRGB SharedImage and upload to it. + gpu::Mailbox source_mailbox; + { + RasterOptions options(size); + options.target_color_params.color_space = source_color_space; + source_mailbox = CreateMailboxSharedImage(ri, sii, options, + viz::ResourceFormat::RGBA_8888); + ri->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData()); + + ri->WritePixels(source_mailbox, 0, 0, GL_TEXTURE_2D, + upload_bitmap.rowBytes(), upload_bitmap.info(), + upload_bitmap.getPixels()); + } + + // Create a DisplayP3 SharedImage and copy to it. + gpu::Mailbox dest_mailbox; + { + RasterOptions options(size); + options.target_color_params.color_space = dest_color_space; + dest_mailbox = CreateMailboxSharedImage(ri, sii, options, + viz::ResourceFormat::RGBA_8888); + ri->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData()); + + ri->CopySubTexture(source_mailbox, dest_mailbox, GL_TEXTURE_2D, 0, 0, 0, 0, + size.width(), size.height(), + /*unpack_flip_y=*/GL_FALSE, + /*unpack_premultiply_alpha=*/GL_FALSE); + } + + // Read the data back as DisplayP3, from the Display P3 SharedImage. + SkBitmap readback_bitmap; + { + readback_bitmap.allocPixels(SkImageInfo::MakeN32Premul( + size.width(), size.height(), dest_color_space.ToSkColorSpace())); + + ri->ReadbackImagePixels(dest_mailbox, readback_bitmap.info(), + readback_bitmap.rowBytes(), 0, 0, + readback_bitmap.getPixels()); + } + + // The pixel value should be unchanged, even though the source and dest are + // in different color spaces. No color conversion (which would change the + // pixel value) should have happened. + EXPECT_EQ(*upload_bitmap.getAddr32(0, 0), *readback_bitmap.getAddr32(0, 0)); +} + TEST_F(OopPixelTest, ConvertYUVToRGB) { RasterOptions options(gfx::Size(16, 16)); RasterOptions uv_options(gfx::Size(options.resource_size.width() / 2,
diff --git a/cc/paint/paint_filter.cc b/cc/paint/paint_filter.cc index be1ffb0..8f8c217 100644 --- a/cc/paint/paint_filter.cc +++ b/cc/paint/paint_filter.cc
@@ -1322,7 +1322,7 @@ orig_flags.setDither(dither_ == SkImageFilters::Dither::kYes); ScopedRasterFlags raster_flags(&orig_flags, image_provider, SkMatrix::I(), 0, - 255u); + 1.0f); const PaintFlags* snapshot = raster_flags.flags(); if (snapshot) { // Ref the updated paint shader so that it can outlive ScopedRasterFlags
diff --git a/cc/paint/paint_flags.h b/cc/paint/paint_flags.h index 5618f9e..ba137d0 100644 --- a/cc/paint/paint_flags.h +++ b/cc/paint/paint_flags.h
@@ -51,9 +51,14 @@ ALWAYS_INLINE uint8_t getAlpha() const { return SkColorGetA(color_.toSkColor()); } + ALWAYS_INLINE float getAlphaf() const { return color_.fA; } ALWAYS_INLINE void setAlpha(uint8_t a) { color_ = SkColor4f::FromColor(SkColorSetA(color_.toSkColor(), a)); } + template <class F, class = std::enable_if_t<std::is_same_v<F, float>>> + ALWAYS_INLINE void setAlphaf(F a) { + color_.fA = a; + } ALWAYS_INLINE void setBlendMode(SkBlendMode mode) { blend_mode_ = static_cast<uint32_t>(mode); }
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc index 98c3fde..17c9f42 100644 --- a/cc/paint/paint_op_buffer.cc +++ b/cc/paint/paint_op_buffer.cc
@@ -1918,9 +1918,9 @@ // See PaintOp::kUnsetRect bool unset = op->bounds.left() == SK_ScalarInfinity; absl::optional<SkPaint> paint; - if (op->alpha != 0xFF) { + if (op->alpha != 1.0f) { paint.emplace(); - paint->setAlpha(op->alpha); + paint->setAlpha(op->alpha * 255.0f); } SkCanvas::SaveLayerRec rec(unset ? nullptr : &op->bounds, base::OptionalOrNullptr(paint)); @@ -3059,7 +3059,7 @@ PaintOpBuffer::PlaybackFoldingIterator::~PlaybackFoldingIterator() = default; void PaintOpBuffer::PlaybackFoldingIterator::FindNextOp() { - current_alpha_ = 255u; + current_alpha_ = 1.0f; for (current_op_ = NextUnfoldedOp(); current_op_; current_op_ = NextUnfoldedOp()) { if (current_op_->GetType() != PaintOpType::SaveLayerAlpha) @@ -3100,7 +3100,7 @@ auto* draw_color_op = static_cast<const DrawColorOp*>(draw_op); SkColor4f color = draw_color_op->color; folded_draw_color_.color = {color.fR, color.fG, color.fB, - save_op->alpha / 255 * color.fA}; + save_op->alpha * color.fA}; current_op_ = &folded_draw_color_; break; } @@ -3183,7 +3183,7 @@ auto* context = canvas->recordingContext(); const ScopedRasterFlags scoped_flags( &flags_op->flags, new_params.image_provider, canvas->getTotalMatrix(), - context ? context->maxTextureSize() : 0, iter.alpha()); + context ? context->maxTextureSize() : 0, iter.alpha() / 255.0f); if (const auto* raster_flags = scoped_flags.flags()) flags_op->RasterWithFlags(canvas, raster_flags, new_params); } else {
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h index d67f489a..d0a7b24 100644 --- a/cc/paint/paint_op_buffer.h +++ b/cc/paint/paint_op_buffer.h
@@ -963,7 +963,8 @@ class CC_PAINT_EXPORT SaveLayerAlphaOp final : public PaintOp { public: static constexpr PaintOpType kType = PaintOpType::SaveLayerAlpha; - SaveLayerAlphaOp(const SkRect* bounds, uint8_t alpha) + template <class F, class = std::enable_if_t<std::is_same_v<F, float>>> + SaveLayerAlphaOp(const SkRect* bounds, F alpha) : PaintOp(kType), bounds(bounds ? *bounds : kUnsetRect), alpha(alpha) {} static void Raster(const SaveLayerAlphaOp* op, SkCanvas* canvas, @@ -975,7 +976,7 @@ HAS_SERIALIZATION_FUNCTIONS(); SkRect bounds; - uint8_t alpha; + float alpha; private: SaveLayerAlphaOp() : PaintOp(kType) {} @@ -1403,7 +1404,9 @@ operator bool() const { return !!current_op_; } // Guaranteed to be 255 for all ops without flags. - uint8_t alpha() const { return current_alpha_; } + uint8_t alpha() const { + return static_cast<uint8_t>(current_alpha_ * 255.0f); + } private: void FindNextOp(); @@ -1419,7 +1422,7 @@ // analysis of sampling profiler data and tab_search:top100:2020). RAW_PTR_EXCLUSION const PaintOp* current_op_ = nullptr; - uint8_t current_alpha_ = 255; + float current_alpha_ = 1.0f; }; private:
diff --git a/cc/paint/paint_op_buffer_serializer.cc b/cc/paint/paint_op_buffer_serializer.cc index 9a4abe41..8d04117 100644 --- a/cc/paint/paint_op_buffer_serializer.cc +++ b/cc/paint/paint_op_buffer_serializer.cc
@@ -320,9 +320,9 @@ uint8_t alpha) { // We use a null |image_provider| here because images are decoded during // serialization. - const ScopedRasterFlags scoped_flags(&flags_op->flags, nullptr, - canvas->getTotalMatrix(), - options_.max_texture_size, alpha); + const ScopedRasterFlags scoped_flags( + &flags_op->flags, nullptr, canvas->getTotalMatrix(), + options_.max_texture_size, alpha / 255.0f); const PaintFlags* flags_to_serialize = scoped_flags.flags(); if (!flags_to_serialize) return true;
diff --git a/cc/paint/paint_op_buffer_unittest.cc b/cc/paint/paint_op_buffer_unittest.cc index ec2b7a57..615a06ec 100644 --- a/cc/paint/paint_op_buffer_unittest.cc +++ b/cc/paint/paint_op_buffer_unittest.cc
@@ -231,12 +231,13 @@ TEST(PaintOpBufferTest, SaveDrawRestore) { PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); + int paint_flags_alpha = 50; PaintFlags draw_flags; - draw_flags.setColor(SK_ColorMAGENTA); - draw_flags.setAlpha(50); + draw_flags.setColor(SkColors::kMagenta); + draw_flags.setAlpha(paint_flags_alpha); EXPECT_TRUE(draw_flags.SupportsFoldingAlpha()); SkRect rect = SkRect::MakeXYWH(1, 2, 3, 4); buffer.push<DrawRectOp>(rect, draw_flags); @@ -251,15 +252,15 @@ // Expect the alpha from the draw and the save layer to be folded together. // Since alpha is stored in a uint8_t and gets rounded, so use tolerance. - float expected_alpha = alpha * 50 / 255.f; - EXPECT_LE(std::abs(expected_alpha - canvas.paint_.getAlpha()), 1.f); + float expected_alpha = alpha * paint_flags_alpha / 255.0f; + EXPECT_LE(std::abs(expected_alpha - canvas.paint_.getAlphaf()), 0.01f); } // Verify that we don't optimize SaveLayerAlpha / DrawTextBlob / Restore. TEST(PaintOpBufferTest, SaveDrawTextBlobRestore) { PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); PaintFlags paint_flags; @@ -281,11 +282,11 @@ TEST(PaintOpBufferTest, SaveDrawRestoreFail_BadFlags) { PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); PaintFlags draw_flags; - draw_flags.setColor(SK_ColorMAGENTA); + draw_flags.setColor(SkColors::kMagenta); draw_flags.setAlpha(50); draw_flags.setBlendMode(SkBlendMode::kSrc); EXPECT_FALSE(draw_flags.SupportsFoldingAlpha()); @@ -308,11 +309,11 @@ TEST(PaintOpBufferTest, SaveDrawRestore_BadFlags255Alpha) { PaintOpBuffer buffer; - uint8_t alpha = 255; + float alpha = 1.0f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); PaintFlags draw_flags; - draw_flags.setColor(SK_ColorMAGENTA); + draw_flags.setColor(SkColors::kMagenta); draw_flags.setAlpha(50); draw_flags.setBlendMode(SkBlendMode::kColorBurn); EXPECT_FALSE(draw_flags.SupportsFoldingAlpha()); @@ -333,11 +334,11 @@ TEST(PaintOpBufferTest, SaveDrawRestoreFail_TooManyOps) { PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); PaintFlags draw_flags; - draw_flags.setColor(SK_ColorMAGENTA); + draw_flags.setColor(SkColors::kMagenta); draw_flags.setAlpha(50); draw_flags.setBlendMode(SkBlendMode::kSrcOver); EXPECT_TRUE(draw_flags.SupportsFoldingAlpha()); @@ -360,7 +361,7 @@ TEST(PaintOpBufferTest, SaveDrawRestore_SingleOpNotADrawOp) { PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); buffer.push<NoopOp>(); @@ -378,9 +379,10 @@ TEST(PaintOpBufferTest, SaveDrawRestore_SingleOpRecordWithSingleOp) { sk_sp<PaintRecord> record = sk_make_sp<PaintRecord>(); + int paint_flags_alpha = 50; PaintFlags draw_flags; - draw_flags.setColor(SK_ColorMAGENTA); - draw_flags.setAlpha(50); + draw_flags.setColor(SkColors::kMagenta); + draw_flags.setAlpha(paint_flags_alpha); EXPECT_TRUE(draw_flags.SupportsFoldingAlpha()); SkRect rect = SkRect::MakeXYWH(1, 2, 3, 4); record->push<DrawRectOp>(rect, draw_flags); @@ -388,7 +390,7 @@ PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); buffer.push<DrawRecordOp>(std::move(record)); buffer.push<RestoreOp>(); @@ -400,8 +402,8 @@ EXPECT_EQ(0, canvas.restore_count_); EXPECT_EQ(rect, canvas.draw_rect_); - float expected_alpha = alpha * 50 / 255.f; - EXPECT_LE(std::abs(expected_alpha - canvas.paint_.getAlpha()), 1.f); + float expected_alpha = alpha * paint_flags_alpha / 255.f; + EXPECT_LE(std::abs(expected_alpha - canvas.paint_.getAlphaf()), 0.01f); } // The same as the above SingleOpRecord test, but the single op is not @@ -416,7 +418,7 @@ PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); buffer.push<DrawRecordOp>(std::move(record)); buffer.push<RestoreOp>(); @@ -430,7 +432,7 @@ TEST(PaintOpBufferTest, SaveLayerRestore_DrawColor) { PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; SkColor original = SkColorSetA(50, SK_ColorRED); buffer.push<SaveLayerAlphaOp>(nullptr, alpha); @@ -820,7 +822,7 @@ push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); - uint8_t alpha = 100; + float alpha = 0.4f; push_op<SaveLayerAlphaOp>(nullptr, alpha); push_op<RestoreOp>(); push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); @@ -846,7 +848,7 @@ push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); - uint8_t alpha = 100; + float alpha = 0.4f; push_op<SaveLayerAlphaOp>(nullptr, alpha); push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); @@ -896,7 +898,7 @@ add_draw_rect(0u); add_draw_rect(1u); - uint8_t alpha = 100; + float alpha = 0.4f; push_op<SaveLayerAlphaOp>(nullptr, alpha); add_draw_rect(2u); push_op<RestoreOp>(); @@ -929,7 +931,7 @@ add_draw_rect(0u); add_draw_rect(1u); - uint8_t alpha = 100; + float alpha = 0.4f; push_op<SaveLayerAlphaOp>(nullptr, alpha); add_draw_rect(2u); add_draw_rect(3u); @@ -988,7 +990,7 @@ }; add_draw_rect(&buffer, 0u); - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); add_draw_rect(&buffer, 1u); buffer.push<RestoreOp>(); @@ -1017,7 +1019,7 @@ // Push 2 saves. - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); add_draw_rect(&buffer, 0u); buffer.push<SaveLayerAlphaOp>(nullptr, alpha); @@ -1728,12 +1730,12 @@ } void PushSaveLayerAlphaOps(PaintOpBuffer* buffer) { - size_t len = std::min(test_uint8s.size(), test_rects.size()); + size_t len = std::min(test_floats.size(), test_rects.size()); for (size_t i = 0; i < len; ++i) - buffer->push<SaveLayerAlphaOp>(&test_rects[i], test_uint8s[i]); + buffer->push<SaveLayerAlphaOp>(&test_rects[i], test_floats[i]); // Test optional args. - buffer->push<SaveLayerAlphaOp>(nullptr, test_uint8s[0]); + buffer->push<SaveLayerAlphaOp>(nullptr, test_floats[0]); ValidateOps<SaveLayerAlphaOp>(buffer); } @@ -2446,11 +2448,11 @@ TEST(PaintOpBufferSerializationTest, AlphaFoldingDuringSerialization) { PaintOpBuffer buffer; - uint8_t alpha = 100; + float alpha = 0.4f; buffer.push<SaveLayerAlphaOp>(nullptr, alpha); PaintFlags draw_flags; - draw_flags.setColor(SK_ColorMAGENTA); + draw_flags.setColor(SkColors::kMagenta); draw_flags.setAlpha(50); SkRect rect = SkRect::MakeXYWH(1, 2, 3, 4); buffer.push<DrawRectOp>(rect, draw_flags); @@ -2500,7 +2502,7 @@ ASSERT_EQ(op->GetType(), PaintOpType::DrawRect); // Expect the alpha from the draw and the save layer to be folded together. // Since alpha is stored in a uint8_t and gets rounded, so use tolerance. - float expected_alpha = alpha * 50 / 255.f; + float expected_alpha = alpha * 50; EXPECT_LE(std::abs(expected_alpha - static_cast<const DrawRectOp*>(op)->flags.getAlpha()), 1.f); @@ -2733,7 +2735,7 @@ buffer.push<DrawRectOp>(bad_rect, test_flags[0]); buffer.push<SaveLayerOp>(&bad_rect, nullptr); buffer.push<SaveLayerOp>(&bad_rect, &test_flags[0]); - buffer.push<SaveLayerAlphaOp>(&bad_rect, test_uint8s[0]); + buffer.push<SaveLayerAlphaOp>(&bad_rect, test_floats[0]); TestOptionsProvider options_provider; @@ -4144,7 +4146,7 @@ TEST(PaintOpBufferTest, NeedsAdditionalInvalidationForLCDText) { auto buffer1 = sk_make_sp<PaintOpBuffer>(); - buffer1->push<SaveLayerAlphaOp>(nullptr, uint8_t{100}); + buffer1->push<SaveLayerAlphaOp>(nullptr, 0.4f); EXPECT_FALSE(buffer1->has_draw_text_ops()); EXPECT_TRUE(buffer1->has_save_layer_alpha_ops()); EXPECT_FALSE(buffer1->has_effects_preventing_lcd_text_for_save_layer_alpha());
diff --git a/cc/paint/paint_op_helper_unittest.cc b/cc/paint/paint_op_helper_unittest.cc index 8a4aa431..9c66ff0 100644 --- a/cc/paint/paint_op_helper_unittest.cc +++ b/cc/paint/paint_op_helper_unittest.cc
@@ -272,7 +272,7 @@ TEST(PaintOpHelper, SaveLayerAlphaToString) { SkRect bounds = SkRect::MakeXYWH(1, 2, 3, 4); - SaveLayerAlphaOp op(&bounds, 255); + SaveLayerAlphaOp op(&bounds, 1.0f); std::string str = PaintOpHelper::ToString(&op); EXPECT_EQ(str, "SaveLayerAlphaOp(bounds=[1.000,2.000 3.000x4.000], alpha=255)");
diff --git a/cc/paint/record_paint_canvas.cc b/cc/paint/record_paint_canvas.cc index d9c21d7..1ddabced 100644 --- a/cc/paint/record_paint_canvas.cc +++ b/cc/paint/record_paint_canvas.cc
@@ -95,7 +95,7 @@ } int RecordPaintCanvas::saveLayerAlpha(const SkRect* bounds, uint8_t alpha) { - push<SaveLayerAlphaOp>(bounds, alpha); + push<SaveLayerAlphaOp>(bounds, static_cast<float>(alpha / 255.0f)); return GetCanvas()->saveLayerAlpha(bounds, alpha); }
diff --git a/cc/paint/scoped_raster_flags.cc b/cc/paint/scoped_raster_flags.cc index 171b551..b626030 100644 --- a/cc/paint/scoped_raster_flags.cc +++ b/cc/paint/scoped_raster_flags.cc
@@ -4,41 +4,14 @@ #include "cc/paint/scoped_raster_flags.h" +#include <utility> + #include "cc/paint/image_provider.h" #include "cc/paint/image_transfer_cache_entry.h" #include "cc/paint/paint_filter.h" #include "cc/paint/paint_image_builder.h" namespace cc { -ScopedRasterFlags::ScopedRasterFlags(const PaintFlags* flags, - ImageProvider* image_provider, - const SkMatrix& ctm, - int max_texture_size, - uint8_t alpha) - : original_flags_(flags) { - if (image_provider) { - decode_stashing_image_provider_.emplace(image_provider); - - // We skip the op if any images fail to decode. - DecodeImageShader(ctm); - if (decode_failed_) - return; - DecodeRecordShader(ctm, max_texture_size); - if (decode_failed_) - return; - DecodeFilter(); - if (decode_failed_) - return; - } - - if (alpha != 255) { - DCHECK(flags->SupportsFoldingAlpha()); - MutableFlags()->setAlpha(SkMulDiv255Round(flags->getAlpha(), alpha)); - } - - AdjustStrokeIfNeeded(ctm); -} - ScopedRasterFlags::~ScopedRasterFlags() = default; void ScopedRasterFlags::DecodeImageShader(const SkMatrix& ctm) {
diff --git a/cc/paint/scoped_raster_flags.h b/cc/paint/scoped_raster_flags.h index 792cbc1..0c2dcf01 100644 --- a/cc/paint/scoped_raster_flags.h +++ b/cc/paint/scoped_raster_flags.h
@@ -18,11 +18,35 @@ class CC_PAINT_EXPORT ScopedRasterFlags { public: // |flags| and |image_provider| must outlive this class. + template <class F, class = std::enable_if_t<std::is_same_v<F, float>>> ScopedRasterFlags(const PaintFlags* flags, ImageProvider* image_provider, const SkMatrix& ctm, int max_texture_size, - uint8_t alpha); + F alpha) + : original_flags_(flags) { + if (image_provider) { + decode_stashing_image_provider_.emplace(image_provider); + + // We skip the op if any images fail to decode. + DecodeImageShader(ctm); + if (decode_failed_) + return; + DecodeRecordShader(ctm, max_texture_size); + if (decode_failed_) + return; + DecodeFilter(); + if (decode_failed_) + return; + } + + if (alpha != 1.0f) { + DCHECK(flags->SupportsFoldingAlpha()); + MutableFlags()->setAlphaf(flags->getAlphaf() * alpha); + } + + AdjustStrokeIfNeeded(ctm); + } ScopedRasterFlags(const ScopedRasterFlags&) = delete; ~ScopedRasterFlags();
diff --git a/cc/paint/scoped_raster_flags_unittest.cc b/cc/paint/scoped_raster_flags_unittest.cc index 232bf0e..78e1f3e 100644 --- a/cc/paint/scoped_raster_flags_unittest.cc +++ b/cc/paint/scoped_raster_flags_unittest.cc
@@ -81,7 +81,7 @@ flags.setShader(shader); MockPaintWorkletImageProvider provider; - ScopedRasterFlags scoped_flags(&flags, &provider, SkMatrix::I(), 0, 255); + ScopedRasterFlags scoped_flags(&flags, &provider, SkMatrix::I(), 0, 1.0f); ASSERT_TRUE(scoped_flags.flags()); EXPECT_TRUE(scoped_flags.flags()->getShader()->shader_type() == PaintShader::Type::kPaintRecord); @@ -104,7 +104,7 @@ PaintFlags flags; flags.setShader(record_shader); { - ScopedRasterFlags scoped_flags(&flags, &provider, SkMatrix::I(), 0, 255); + ScopedRasterFlags scoped_flags(&flags, &provider, SkMatrix::I(), 0, 1.0f); ASSERT_TRUE(scoped_flags.flags()); EXPECT_NE(scoped_flags.flags(), &flags); SkPaint paint = scoped_flags.flags()->ToSkPaint(); @@ -116,13 +116,13 @@ TEST(ScopedRasterFlagsTest, NoImageProvider) { PaintFlags flags; - flags.setAlpha(255); + flags.setAlphaf(1.0f); flags.setShader(PaintShader::MakeImage( CreateDiscardablePaintImage(gfx::Size(10, 10)), SkTileMode::kClamp, SkTileMode::kClamp, &SkMatrix::I())); - ScopedRasterFlags scoped_flags(&flags, nullptr, SkMatrix::I(), 0, 10); + ScopedRasterFlags scoped_flags(&flags, nullptr, SkMatrix::I(), 0, 0.1f); EXPECT_NE(scoped_flags.flags(), &flags); - EXPECT_EQ(scoped_flags.flags()->getAlpha(), SkMulDiv255Round(255, 10)); + EXPECT_EQ(scoped_flags.flags()->getAlphaf(), 1.0f * 0.1f); } TEST(ScopedRasterFlagsTest, ThinAliasedStroke) { @@ -133,21 +133,21 @@ struct { SkMatrix ctm; - uint8_t alpha; + float alpha; bool expect_same_flags; bool expect_aa; float expect_stroke_width; - uint8_t expect_alpha; + float expect_alpha; } tests[] = { // No downscaling => no stroke change. - {SkMatrix::Scale(1.0f, 1.0f), 255, true, false, 1.0f, 0xFF}, + {SkMatrix::Scale(1.0f, 1.0f), 1.0f, true, false, 1.0f, 1.0f}, // Symmetric downscaling => modulated hairline stroke. - {SkMatrix::Scale(0.5f, 0.5f), 255, false, false, 0.0f, 0x80}, + {SkMatrix::Scale(0.5f, 0.5f), 1.0f, false, false, 0.0f, 0.5f}, // Symmetric downscaling w/ alpha => modulated hairline stroke. - {SkMatrix::Scale(0.5f, 0.5f), 127, false, false, 0.0f, 0x40}, + {SkMatrix::Scale(0.5f, 0.5f), 0.5f, false, false, 0.0f, 0.25f}, // Anisotropic scaling => AA stroke. - {SkMatrix::Scale(0.5f, 1.5f), 255, false, true, 1.0f, 0xFF}, + {SkMatrix::Scale(0.5f, 1.5f), 1.0f, false, true, 1.0f, 1.0f}, }; for (const auto& test : tests) { @@ -157,7 +157,8 @@ EXPECT_EQ(scoped_flags.flags() == &flags, test.expect_same_flags); EXPECT_EQ(scoped_flags.flags()->isAntiAlias(), test.expect_aa); EXPECT_EQ(scoped_flags.flags()->getStrokeWidth(), test.expect_stroke_width); - EXPECT_EQ(scoped_flags.flags()->getAlpha(), test.expect_alpha); + EXPECT_LE(std::abs(scoped_flags.flags()->getAlphaf() - test.expect_alpha), + 0.01f); } }
diff --git a/cc/paint/skia_paint_canvas.cc b/cc/paint/skia_paint_canvas.cc index 2916a8b..bd49fa4 100644 --- a/cc/paint/skia_paint_canvas.cc +++ b/cc/paint/skia_paint_canvas.cc
@@ -175,7 +175,7 @@ const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; @@ -189,7 +189,7 @@ void SkiaPaintCanvas::drawRect(const SkRect& rect, const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk( @@ -201,7 +201,7 @@ void SkiaPaintCanvas::drawIRect(const SkIRect& rect, const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk( @@ -213,7 +213,7 @@ void SkiaPaintCanvas::drawOval(const SkRect& oval, const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk( @@ -225,7 +225,7 @@ void SkiaPaintCanvas::drawRRect(const SkRRect& rrect, const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk( @@ -239,7 +239,7 @@ const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk( @@ -255,7 +255,7 @@ const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk( @@ -270,7 +270,7 @@ UsePaintCache) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk( @@ -288,7 +288,7 @@ absl::optional<ScopedRasterFlags> scoped_flags; if (flags) { scoped_flags.emplace(flags, image_provider_, canvas_->getTotalMatrix(), - GetMaxTextureSize(), 255u); + GetMaxTextureSize(), 1.0f); if (!scoped_flags->flags()) return; } @@ -309,7 +309,7 @@ absl::optional<ScopedRasterFlags> scoped_flags; if (flags) { scoped_flags.emplace(flags, image_provider_, canvas_->getTotalMatrix(), - GetMaxTextureSize(), 255u); + GetMaxTextureSize(), 1.0f); if (!scoped_flags->flags()) return; } @@ -347,7 +347,7 @@ const PaintFlags& flags) { ScopedRasterFlags raster_flags(&flags, image_provider_, canvas_->getTotalMatrix(), GetMaxTextureSize(), - 255u); + 1.0f); if (!raster_flags.flags()) return; raster_flags.flags()->DrawToSk(canvas_,
diff --git a/cc/test/paint_op_helper.h b/cc/test/paint_op_helper.h index 21d1a95..937bb294 100644 --- a/cc/test/paint_op_helper.h +++ b/cc/test/paint_op_helper.h
@@ -196,8 +196,7 @@ const auto* op = static_cast<const SaveLayerAlphaOp*>(base_op); str << "SaveLayerAlphaOp(bounds=" << PaintOpHelper::SkiaTypeToString(op->bounds) - << ", alpha=" << static_cast<uint32_t>(op->alpha) - << ")"; + << ", alpha=" << static_cast<uint32_t>(op->alpha * 255) << ")"; break; } case PaintOpType::Scale: {
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index f477b6b..3867c5f8 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1785,6 +1785,7 @@ "//third_party/android_sdk:android_test_runner_java", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", + "//third_party/androidx:androidx_activity_activity_java", "//third_party/androidx:androidx_browser_browser_java", "//third_party/androidx:androidx_collection_collection_java", "//third_party/androidx:androidx_preference_preference_java",
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java index 6d2c1c6..fab1599 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java
@@ -5,7 +5,7 @@ package org.chromium.chrome.browser.tasks.tab_management; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isEnabled; import static androidx.test.espresso.matcher.ViewMatchers.withId; @@ -33,7 +33,6 @@ import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CallbackHelper; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -239,7 +238,6 @@ @Test @MediumTest - @DisabledTest(message = "https://crbug.com/1348710") public void testSingleActionView_Click() throws Exception { List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { @@ -266,9 +264,7 @@ () -> { actions.get(0).addActionObserver(observer); }); when(mSelectionDelegate.getSelectedItems()) .thenReturn(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_1}))); - - onView(allOf(withId(R.id.tab_selection_editor_action_view), isDisplayed(), isEnabled())) - .perform(click()); + clickActionView(R.id.tab_selection_editor_action_view); helper.waitForCallback(0); Assert.assertEquals(1, processedTabs.size()); @@ -323,12 +319,12 @@ @Test @MediumTest - @DisabledTest(message = "https://crbug.com/1348666") public void testSingleMenuItem_Click() throws Exception { + final int menuId = 50; // Arbitrary. List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { - actions.add(new FakeTabSelectionEditorAction(getActivity(), /*menuId=*/0, - ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START, + actions.add(new FakeTabSelectionEditorAction(getActivity(), menuId, ShowMode.MENU_ONLY, + ButtonType.TEXT, IconPosition.START, R.string.tab_suggestion_close_tab_action_button, R.drawable.ic_group_icon_16dp)); configureMenuWithActions(actions); @@ -351,7 +347,7 @@ mToolbar.showOverflowMenu(); actions.get(0).addActionObserver(observer); }); - onView(allOf(withText("Close"), isDisplayed(), isEnabled())).perform(click()); + clickMenuItem(menuId, "Close"); helper.waitForCallback(0); Assert.assertEquals(1, processedTabs.size()); @@ -437,4 +433,19 @@ mToolbar.hideOverflowMenu(); }); } + + private void clickActionView(int id) { + onView(withId(id)).check(matches(allOf(isDisplayed(), isEnabled()))); + // On Android 12 perform(click()) sometimes fails to trigger the click so force the click on + // the view object instead. + TestThreadUtils.runOnUiThreadBlocking(() -> { mToolbar.findViewById(id).performClick(); }); + } + + private void clickMenuItem(int id, String text) { + onView(withText(text)).check(matches(allOf(isDisplayed(), isEnabled()))); + // On Android 12 perform(click()) works poorly for this as the menu item is flakily reported + // as < 90% visible. + TestThreadUtils.runOnUiThreadBlocking( + () -> { mToolbar.getMenu().performIdentifierAction(id, /*flags=*/0); }); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index 1f3b894f..47536d82 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -100,6 +100,7 @@ add(ChromeFeatureList.sInstantStart); add(ChromeFeatureList.sInterestFeedV2); add(ChromeFeatureList.sNewWindowAppMenu); + add(ChromeFeatureList.sOmniboxModernizeVisualUpdate); add(ChromeFeatureList.sOptimizationGuidePushNotifications); add(ChromeFeatureList.sPaintPreviewDemo); add(ChromeFeatureList.sPaintPreviewShowOnStartup);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java index e2c33f1..d68dedc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java
@@ -225,7 +225,7 @@ mActiveTab = null; } - if (BackPressManager.isEnabled()) { + if (mBackPressManager.has(Type.TAB_MODAL_HANDLER)) { mManager.removeObserver(this); mBackPressManager.removeHandler(Type.TAB_MODAL_HANDLER); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java index dfa36e9b..0dc357f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -31,6 +31,7 @@ import org.chromium.chrome.browser.WebContentsFactory; import org.chromium.chrome.browser.app.omnibox.OmniboxPedalDelegateImpl; import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton; +import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.contextmenu.ContextMenuPopulatorFactory; import org.chromium.chrome.browser.crash.ChromePureJavaExceptionReporter; import org.chromium.chrome.browser.customtabs.CustomTabsConnection; @@ -186,6 +187,12 @@ loadUrl(url, transition, postDataType, postData); return true; }; + + BackPressManager backPressManager = null; + if (BackPressManager.isEnabled()) { + backPressManager = new BackPressManager(); + getOnBackPressedDispatcher().addCallback(this, backPressManager.getCallback()); + } // clang-format off mLocationBarCoordinator = new LocationBarCoordinator(mSearchBox, anchorView, mProfileSupplier, PrivacyPreferencesManagerImpl.getInstance(), @@ -202,7 +209,7 @@ /*merchantTrustSignalsCoordinatorSupplier=*/null, new OmniboxPedalDelegateImpl(this, new OneshotSupplierImpl<>(), getModalDialogManagerSupplier()), null, - ChromePureJavaExceptionReporter::postReportJavaException); + ChromePureJavaExceptionReporter::postReportJavaException, backPressManager); // clang-format on mLocationBarCoordinator.setUrlBarFocusable(true); mLocationBarCoordinator.setShouldShowMicButtonWhenUnfocused(true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java index 6442a59..1725e1c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
@@ -3,6 +3,8 @@ // found in the LICENSE file. package org.chromium.chrome.browser.tab; +import android.text.TextUtils; + import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -12,6 +14,7 @@ import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge; import org.chromium.components.content_settings.ContentSettingValues; import org.chromium.components.content_settings.ContentSettingsType; +import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.ukm.UkmRecorder; import org.chromium.content_public.browser.BrowserContextHandle; import org.chromium.url.GURL; @@ -27,6 +30,8 @@ "default_on_display_size_threshold_inches"; private static final double DEFAULT_GLOBAL_SETTING_DEFAULT_ON_DISPLAY_SIZE_THRESHOLD_INCHES = 12.0; + private static final String ANY_SUBDOMAIN_PATTERN = "[*.]"; + private static final String SITE_WILDCARD = "*"; // Note: these values must match the UserAgentRequestType enum in enums.xml. @IntDef({UserAgentRequestType.REQUEST_DESKTOP, UserAgentRequestType.REQUEST_MOBILE}) @@ -81,7 +86,8 @@ } /** - * Set or remove a site exception with URL for {@link ContentSettingsType.REQUEST_DESKTOP_SITE}. + * Set or remove a domain level exception with URL for {@link + * ContentSettingsType.REQUEST_DESKTOP_SITE}. Clear the subdomain level exception if any. * @param browserContextHandle Target browser context whose content settings needs to be * updated. * @param url {@link GURL} for the site that changes in desktop user agent. @@ -89,6 +95,20 @@ */ public static void setRequestDesktopSiteContentSettingsForUrl( BrowserContextHandle browserContextHandle, GURL url, boolean useDesktopUserAgent) { + String domainAndRegistry = + UrlUtilities.getDomainAndRegistry(url.getSpec(), /*includePrivateRegistries*/ true); + // Use host only (no scheme/port/path) for ContentSettings to ensure consistency. + String hostPattern; + if (TextUtils.isEmpty(domainAndRegistry)) { + // Use host directly if fails to extract domain from url (e.g. ip address). + hostPattern = url.getHost(); + } else { + hostPattern = ANY_SUBDOMAIN_PATTERN + domainAndRegistry; + // Clear subdomain level exception if any. + WebsitePreferenceBridge.setContentSettingCustomScope(browserContextHandle, + ContentSettingsType.REQUEST_DESKTOP_SITE, url.getHost(), + /*secondaryPattern*/ SITE_WILDCARD, ContentSettingValues.DEFAULT); + } @ContentSettingValues int defaultValue = WebsitePreferenceBridge.getDefaultContentSetting( browserContextHandle, ContentSettingsType.REQUEST_DESKTOP_SITE); @@ -106,8 +126,11 @@ contentSettingValue = blockDesktopGlobally ? ContentSettingValues.DEFAULT : ContentSettingValues.BLOCK; } - WebsitePreferenceBridge.setContentSettingDefaultScope(browserContextHandle, - ContentSettingsType.REQUEST_DESKTOP_SITE, url, url, contentSettingValue); + + // Set or remove a domain level exception. + WebsitePreferenceBridge.setContentSettingCustomScope(browserContextHandle, + ContentSettingsType.REQUEST_DESKTOP_SITE, hostPattern, + /*secondaryPattern*/ SITE_WILDCARD, contentSettingValue); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 641f82f1..70c117e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -632,7 +632,7 @@ VoiceToolbarButtonController::isToolbarMicEnabled, jankTracker, merchantTrustSignalsCoordinatorSupplier, omniboxPedalDelegate, mControlsVisibilityDelegate, - ChromePureJavaExceptionReporter::postReportJavaException); + ChromePureJavaExceptionReporter::postReportJavaException, backPressManager); // clang-format on toolbarLayout.setLocationBarCoordinator(locationBarCoordinator); toolbarLayout.setBrowserControlsVisibilityDelegate(mControlsVisibilityDelegate);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java index 998ebf6..1162c22 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java
@@ -45,6 +45,7 @@ import org.chromium.base.CommandLine; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeTabbedActivity; @@ -62,6 +63,8 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.OmniboxTestUtils; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.search_engines.TemplateUrl; import org.chromium.components.search_engines.TemplateUrlService; @@ -81,6 +84,7 @@ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1", "ignore-certificate-errors"}) +@DoNotBatch(reason = "Test start up behaviors.") public class LocationBarTest { private static final String TEST_QUERY = "testing query"; private static final List<String> TEST_PARAMS = Arrays.asList("foo=bar"); @@ -618,6 +622,41 @@ mOmnibox.checkFocus(false); } + /** + * Test that back press should make the omnibox unfocused. + */ + @Test + @MediumTest + @DisableFeatures({ChromeFeatureList.BACK_GESTURE_REFACTOR}) + @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) + public void testFocusLogic_backPress() { + startActivityNormally(); + + mOmnibox.requestFocus(); + mOmnibox.checkFocus(true); + TestThreadUtils.runOnUiThreadBlocking(() -> mLocationBarMediator.backKeyPressed()); + mOmnibox.checkFocus(false); + } + + /** + * Same with {@link #testFocusLogic_backPress()}, but with predictive back gesture enabled. + */ + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.BACK_GESTURE_REFACTOR}) + @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) + public void testFocusLogic_backPress_Refactored() { + startActivityNormally(); + + mOmnibox.requestFocus(); + mOmnibox.checkFocus(true); + Assert.assertTrue(mLocationBarMediator.getHandleBackPressChangedSupplier().get()); + TestThreadUtils.runOnUiThreadBlocking( + () -> mActivity.getOnBackPressedDispatcher().onBackPressed()); + Assert.assertFalse(mLocationBarMediator.getHandleBackPressChangedSupplier().get()); + mOmnibox.checkFocus(false); + } + @Test @SmallTest @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java index 2198b2a2..8928247 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
@@ -17,6 +17,7 @@ import android.graphics.Bitmap; import android.net.Uri; import android.support.test.InstrumentationRegistry; +import android.support.test.runner.lifecycle.Stage; import android.view.KeyEvent; import androidx.test.filters.MediumTest; @@ -37,6 +38,7 @@ import org.chromium.base.ContentUriUtils; import org.chromium.base.IntentUtils; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.test.util.ApplicationTestUtils; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; @@ -44,6 +46,7 @@ import org.chromium.base.test.util.CriteriaNotSatisfiedException; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.FlakyTest; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeTabbedActivity; @@ -51,6 +54,7 @@ import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.app.metrics.LaunchCauseMetrics; import org.chromium.chrome.browser.document.ChromeLauncherActivity; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.locale.LocaleManagerDelegate; @@ -75,6 +79,8 @@ import org.chromium.chrome.test.util.ActivityTestUtils; import org.chromium.chrome.test.util.OmniboxTestUtils; import org.chromium.chrome.test.util.OmniboxTestUtils.SuggestionInfo; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.browser_ui.share.ClipboardImageFileProvider; import org.chromium.components.omnibox.AutocompleteMatch; import org.chromium.components.omnibox.AutocompleteMatchBuilder; @@ -105,6 +111,7 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +@DoNotBatch(reason = "Test start up behaviors.") public class SearchActivityTest { private static final long OMNIBOX_SHOW_TIMEOUT_MS = 5000L; private static final String TEST_PNG_IMAGE_FILE_EXTENSION = ".png"; @@ -219,6 +226,53 @@ @Test @SmallTest + @DisableIf.Device(type = {UiDisableIf.TABLET}) // see crbug.com/1177417 + @DisableFeatures({ChromeFeatureList.BACK_GESTURE_REFACTOR}) + public void testBackPressFinishActivity() throws Exception { + SearchActivity searchActivity = startSearchActivity(); + + // Wait for the Activity to fully load. + mTestDelegate.shouldDelayNativeInitializationCallback.waitForCallback(0); + mTestDelegate.showSearchEngineDialogIfNeededCallback.waitForCallback(0); + mTestDelegate.onFinishDeferredInitializationCallback.waitForCallback(0); + + // Type in anything. It should force the suggestions to appear. + mOmnibox.requestFocus(); + mOmnibox.typeText("anything", false); + mOmnibox.checkSuggestionsShown(); + searchActivity.handleBackKeyPressed(); + + ApplicationTestUtils.waitForActivityState( + "Back press should finish the activity", searchActivity, Stage.DESTROYED); + } + + /** + * Same with {@link #testBackPressFinishActivity()}, but with predictive back gesture enabled. + */ + @Test + @SmallTest + @DisableIf.Device(type = {UiDisableIf.TABLET}) // see crbug.com/1177417 + @EnableFeatures({ChromeFeatureList.BACK_GESTURE_REFACTOR}) + public void testBackPressFinishActivity_BackRefactored() throws Exception { + SearchActivity searchActivity = startSearchActivity(); + + // Wait for the Activity to fully load. + mTestDelegate.shouldDelayNativeInitializationCallback.waitForCallback(0); + mTestDelegate.showSearchEngineDialogIfNeededCallback.waitForCallback(0); + mTestDelegate.onFinishDeferredInitializationCallback.waitForCallback(0); + + // Type in anything. It should force the suggestions to appear. + mOmnibox.requestFocus(); + mOmnibox.typeText("anything", false); + mOmnibox.checkSuggestionsShown(); + searchActivity.getOnBackPressedDispatcher().onBackPressed(); + + ApplicationTestUtils.waitForActivityState( + "Back press should finish the activity", searchActivity, Stage.DESTROYED); + } + + @Test + @SmallTest public void testStartsBrowserAfterUrlSubmitted_aboutblank() throws Exception { verifyUrlLoads(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java index 3b0fee09..79ade91 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java
@@ -5,7 +5,9 @@ package org.chromium.chrome.browser.tab; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; @@ -24,77 +26,144 @@ import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni; import org.chromium.components.content_settings.ContentSettingValues; import org.chromium.components.content_settings.ContentSettingsType; +import org.chromium.components.embedder_support.util.UrlUtilities; +import org.chromium.components.embedder_support.util.UrlUtilitiesJni; import org.chromium.content_public.browser.BrowserContextHandle; import org.chromium.url.GURL; +import org.chromium.url.JUnitTestGURLs; +import org.chromium.url.ShadowGURL; + +import java.util.HashMap; +import java.util.Map; /** * Unit tests for {@link RequestDesktopUtils}. */ @RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -@SuppressWarnings("DoNotMock") // Mocking GURL +@Config(manifest = Config.NONE, shadows = {ShadowGURL.class}) public class RequestDesktopUtilsUnitTest { @Rule public JniMocker mJniMocker = new JniMocker(); @Mock - WebsitePreferenceBridge.Natives mWebsitePreferenceBridgeJniMock; + private WebsitePreferenceBridge.Natives mWebsitePreferenceBridgeJniMock; @Mock - BrowserContextHandle mBrowserContextHandleMock; + private UrlUtilities.Natives mUrlUtilitiesJniMock; @Mock - GURL mGurlMock; + private BrowserContextHandle mBrowserContextHandleMock; private @ContentSettingValues int mRdsDefaultValue; - private @ContentSettingValues int mLastRdsContentSettingExceptionValue; + private final Map<String, Integer> mContentSettingMap = new HashMap<>(); + private final GURL mGoogleUrl = new GURL(JUnitTestGURLs.GOOGLE_URL); + private final GURL mMapsUrl = new GURL(JUnitTestGURLs.MAPS_URL); + private static final String GOOGLE_COM = "[*.]google.com/"; @Before public void setup() { MockitoAnnotations.initMocks(this); mJniMocker.mock(WebsitePreferenceBridgeJni.TEST_HOOKS, mWebsitePreferenceBridgeJniMock); + mJniMocker.mock(UrlUtilitiesJni.TEST_HOOKS, mUrlUtilitiesJniMock); doAnswer(invocation -> mRdsDefaultValue) .when(mWebsitePreferenceBridgeJniMock) .getDefaultContentSetting(any(), eq(ContentSettingsType.REQUEST_DESKTOP_SITE)); - doAnswer(invocation -> { - mLastRdsContentSettingExceptionValue = invocation.getArgument(4); + mContentSettingMap.put(invocation.getArgument(2), invocation.getArgument(4)); return null; }) .when(mWebsitePreferenceBridgeJniMock) - .setContentSettingDefaultScope(any(), eq(ContentSettingsType.REQUEST_DESKTOP_SITE), - any(), any(), anyInt()); - doAnswer(invocation -> mLastRdsContentSettingExceptionValue) - .when(mWebsitePreferenceBridgeJniMock) - .getContentSetting( - any(), eq(ContentSettingsType.REQUEST_DESKTOP_SITE), any(), any()); + .setContentSettingCustomScope(any(), eq(ContentSettingsType.REQUEST_DESKTOP_SITE), + anyString(), anyString(), anyInt()); + doAnswer(invocation -> getDomainAndRegistry(invocation.getArgument(0))) + .when(mUrlUtilitiesJniMock) + .getDomainAndRegistry(anyString(), anyBoolean()); } @Test - public void testSetRequestDesktopSiteContentSettingsForUrl_DefaultBlock() { + public void testSetRequestDesktopSiteContentSettingsForUrl_DefaultBlock_SiteBlock() { mRdsDefaultValue = ContentSettingValues.BLOCK; + // Pre-existing subdomain setting. + mContentSettingMap.put(mGoogleUrl.getHost(), ContentSettingValues.BLOCK); RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( - mBrowserContextHandleMock, mGurlMock, true); - Assert.assertEquals("Request Desktop Site content settings Exception is not set correctly.", - ContentSettingValues.ALLOW, mLastRdsContentSettingExceptionValue); + mBrowserContextHandleMock, mGoogleUrl, true); + Assert.assertEquals("Request Desktop Site domain level setting is not set correctly.", + ContentSettingValues.ALLOW, mContentSettingMap.get(GOOGLE_COM).intValue()); + Assert.assertEquals("Request Desktop Site subdomain level setting should be removed.", + ContentSettingValues.DEFAULT, + mContentSettingMap.get(mGoogleUrl.getHost()).intValue()); RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( - mBrowserContextHandleMock, mGurlMock, false); - Assert.assertEquals("Request Desktop Site content settings should be removed.", - ContentSettingValues.DEFAULT, mLastRdsContentSettingExceptionValue); + mBrowserContextHandleMock, mMapsUrl, false); + Assert.assertEquals("Request Desktop Site domain level setting should be removed.", + ContentSettingValues.DEFAULT, mContentSettingMap.get(GOOGLE_COM).intValue()); } @Test - public void testSetRequestDesktopSiteContentSettingsForUrl_DefaultAllow() { - mRdsDefaultValue = ContentSettingValues.ALLOW; + public void testSetRequestDesktopSiteContentSettingsForUrl_DefaultBlock_SiteAllow() { + mRdsDefaultValue = ContentSettingValues.BLOCK; + // Pre-existing subdomain setting. + mContentSettingMap.put(mGoogleUrl.getHost(), ContentSettingValues.ALLOW); RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( - mBrowserContextHandleMock, mGurlMock, false); - Assert.assertEquals("Request Desktop Site content settings Exception is not set correctly.", - ContentSettingValues.BLOCK, mLastRdsContentSettingExceptionValue); + mBrowserContextHandleMock, mGoogleUrl, false); + Assert.assertEquals("Request Desktop Site domain level setting should be removed.", + ContentSettingValues.DEFAULT, mContentSettingMap.get(GOOGLE_COM).intValue()); + Assert.assertEquals("Request Desktop Site subdomain level setting should be removed.", + ContentSettingValues.DEFAULT, + mContentSettingMap.get(mGoogleUrl.getHost()).intValue()); RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( - mBrowserContextHandleMock, mGurlMock, true); - Assert.assertEquals("Request Desktop Site content settings should be removed.", - ContentSettingValues.DEFAULT, mLastRdsContentSettingExceptionValue); + mBrowserContextHandleMock, mMapsUrl, true); + Assert.assertEquals("Request Desktop Site domain level setting is not set correctly.", + ContentSettingValues.ALLOW, mContentSettingMap.get(GOOGLE_COM).intValue()); + } + + @Test + public void testSetRequestDesktopSiteContentSettingsForUrl_DefaultAllow_SiteAllow() { + mRdsDefaultValue = ContentSettingValues.ALLOW; + // Pre-existing subdomain setting. + mContentSettingMap.put(mGoogleUrl.getHost(), ContentSettingValues.ALLOW); + RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( + mBrowserContextHandleMock, mGoogleUrl, false); + Assert.assertEquals("Request Desktop Site domain level setting is not set correctly.", + ContentSettingValues.BLOCK, mContentSettingMap.get(GOOGLE_COM).intValue()); + Assert.assertEquals("Request Desktop Site subdomain level setting should be removed.", + ContentSettingValues.DEFAULT, + mContentSettingMap.get(mGoogleUrl.getHost()).intValue()); + + RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( + mBrowserContextHandleMock, mMapsUrl, true); + Assert.assertEquals("Request Desktop Site domain level setting should be removed.", + ContentSettingValues.DEFAULT, mContentSettingMap.get(GOOGLE_COM).intValue()); + } + + @Test + public void testSetRequestDesktopSiteContentSettingsForUrl_DefaultAllow_SiteBlock() { + mRdsDefaultValue = ContentSettingValues.ALLOW; + // Pre-existing subdomain setting. + mContentSettingMap.put(mGoogleUrl.getHost(), ContentSettingValues.BLOCK); + RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( + mBrowserContextHandleMock, mGoogleUrl, true); + Assert.assertEquals("Request Desktop Site domain level setting should be removed.", + ContentSettingValues.DEFAULT, mContentSettingMap.get(GOOGLE_COM).intValue()); + Assert.assertEquals("Request Desktop Site subdomain level setting should be removed.", + ContentSettingValues.DEFAULT, + mContentSettingMap.get(mGoogleUrl.getHost()).intValue()); + + RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl( + mBrowserContextHandleMock, mMapsUrl, false); + Assert.assertEquals("Request Desktop Site domain level setting is not set correctly.", + ContentSettingValues.BLOCK, mContentSettingMap.get(GOOGLE_COM).intValue()); + } + + /** + * Helper to get organization-identifying host from URLs. The real implementation calls + * {@link UrlUtilities}. It's not useful to actually reimplement it, so just return a string in + * a trivial way. + * @param origin A URL. + * @return The organization-identifying host from the given URL. + */ + private String getDomainAndRegistry(String origin) { + return origin.replaceAll(".*\\.(.+\\.[^.]+$)", "$1"); } }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index eda9012..c5ee49c8 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -3058,9 +3058,6 @@ <message name="IDS_CREATE_SHORTCUTS_START_MENU_CHKBOX" desc="Label of the checkbox to create an application shortcut in the start menu."> Start menu </message> - <message name="IDS_CREATE_SHORTCUTS_QUICK_LAUNCH_BAR_CHKBOX" desc="Label of the checkbox to create an application shortcut in quick launch bar."> - Quick launch bar - </message> <message name="IDS_PIN_TO_TASKBAR_CHKBOX" desc="Label of the checkbox to pin an application shortcut to taskbar."> Pin to Taskbar </message>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 93436e8..c078732e 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1325,7 +1325,10 @@ Offer to translate pages in this language </message> <message name="IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE" desc="The label of the check-box that enables the prompt to translate a page."> - Offer to translate pages that aren't in a language you read + Use Google Translate + </message> + <message name="IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE_SUBLABEL" desc="The sublabel of the check-box that enables the prompt to translate a page."> + When on, Google Translate will offer to translate sites into your preferred language. It can also automatically translate sites. </message> <message name="IDS_SETTINGS_LANGUAGES_TRANSLATE_TARGET" desc="The label under a language's name in a list of enabled languages indicating that pages will be translated to this language."> This language is used when translating pages
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE.png.sha1 new file mode 100644 index 0000000..1515bd73 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE.png.sha1
@@ -0,0 +1 @@ +d9c1579a383f2e96c333c2421b7c8428a41ef109 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE_SUBLABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE_SUBLABEL.png.sha1 new file mode 100644 index 0000000..72061f06 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE_SUBLABEL.png.sha1
@@ -0,0 +1 @@ +d358b2600e522ed02a2df235a554ed7b58d18094 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 3f1940b..4078492 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -5068,7 +5068,6 @@ ] deps += [ "//ash", - "//ash/components/account_manager", "//ash/components/arc", "//ash/components/arc:arc_base", "//ash/components/arc:arc_base_utils", @@ -5181,6 +5180,7 @@ "//chrome/services/sharing/public/cpp", "//chrome/services/sharing/public/proto", "//chrome/services/speech:lib", + "//chromeos/ash/components/account_manager", "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/attestation", "//chromeos/ash/components/dbus/attestation:attestation_proto",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index e1676eb..6f51568 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -556,9 +556,6 @@ "browser_process_impl.cc": [ "+ui/message_center/message_center.h", ], - "browser_process_platform_part_chromeos.cc": [ - "+ash/components/account_manager", - ], "input_method_engine.cc": [ # For GetVirtualKeyboardController. "+ash/keyboard/ui/keyboard_ui_controller.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 43660a8..cc717b16 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -3643,6 +3643,9 @@ flag_descriptions::kCellularUseSecondEuiccName, flag_descriptions::kCellularUseSecondEuiccDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kCellularUseSecondEuicc)}, + {"cros-privacy-hub-future", flag_descriptions::kCrosPrivacyHubFutureName, + flag_descriptions::kCrosPrivacyHubFutureDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrosPrivacyHubFuture)}, {"enable-cros-privacy-hub", flag_descriptions::kCrosPrivacyHubName, flag_descriptions::kCrosPrivacyHubDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kCrosPrivacyHub)},
diff --git a/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc b/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc index 1a38920e..5013ca4f 100644 --- a/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc +++ b/chrome/browser/accessibility/accessibility_extension_api_chromeos.cc
@@ -864,6 +864,12 @@ } ExtensionFunction::ResponseAction +AccessibilityPrivateSilenceSpokenFeedbackFunction::Run() { + ash::AccessibilityController::Get()->SilenceSpokenFeedback(); + return RespondNow(NoArguments()); +} + +ExtensionFunction::ResponseAction AccessibilityPrivateInstallPumpkinForDictationFunction::Run() { AccessibilityManager::Get()->InstallPumpkinForDictation( base::BindOnce(&AccessibilityPrivateInstallPumpkinForDictationFunction::
diff --git a/chrome/browser/accessibility/accessibility_extension_api_chromeos.h b/chrome/browser/accessibility/accessibility_extension_api_chromeos.h index f1d63bc..2de9e2f 100644 --- a/chrome/browser/accessibility/accessibility_extension_api_chromeos.h +++ b/chrome/browser/accessibility/accessibility_extension_api_chromeos.h
@@ -258,6 +258,15 @@ ACCESSIBILITY_PRIVATE_UPDATEDICTATIONBUBBLE) }; +// API function that silences ChromeVox. +class AccessibilityPrivateSilenceSpokenFeedbackFunction + : public ExtensionFunction { + ~AccessibilityPrivateSilenceSpokenFeedbackFunction() override = default; + ResponseAction Run() override; + DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.silenceSpokenFeedback", + ACCESSIBILITY_PRIVATE_SILENCESPOKENFEEDBACK) +}; + // API function that initiates a Pumpkin download for Dictation. class AccessibilityPrivateInstallPumpkinForDictationFunction : public ExtensionFunction {
diff --git a/chrome/browser/android/ntp/recent_tabs_page_prefs.cc b/chrome/browser/android/ntp/recent_tabs_page_prefs.cc index b63cc84d..cc5f37d 100644 --- a/chrome/browser/android/ntp/recent_tabs_page_prefs.cc +++ b/chrome/browser/android/ntp/recent_tabs_page_prefs.cc
@@ -71,9 +71,9 @@ jboolean RecentTabsPagePrefs::GetForeignSessionCollapsed( JNIEnv* env, const JavaParamRef<jstring>& session_tag) { - const base::Value* dict = - profile_->GetPrefs()->GetDictionary(prefs::kNtpCollapsedForeignSessions); - return dict && dict->FindKey(ConvertJavaStringToUTF8(env, session_tag)); + const base::Value::Dict& dict = + profile_->GetPrefs()->GetValueDict(prefs::kNtpCollapsedForeignSessions); + return dict.contains(ConvertJavaStringToUTF8(env, session_tag)); } void RecentTabsPagePrefs::SetForeignSessionCollapsed(
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index d082fe4..11c4ea9 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1744,7 +1744,6 @@ deps = [ "//apps", - "//ash/components/account_manager", "//ash/components/arc:arc_features", "//ash/components/arc:prefs", "//ash/components/arc/input_overlay/resources", @@ -1817,6 +1816,7 @@ "//chrome/common:channel_info", "//chrome/common:non_code_constants", "//chrome/common/net", + "//chromeos/ash/components/account_manager", "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus:plugin_vm_service_proto", "//chromeos/ash/components/dbus:vm_disk_management_proto",
diff --git a/chrome/browser/ash/accessibility/dictation_browsertest.cc b/chrome/browser/ash/accessibility/dictation_browsertest.cc index fe17258..36413881 100644 --- a/chrome/browser/ash/accessibility/dictation_browsertest.cc +++ b/chrome/browser/ash/accessibility/dictation_browsertest.cc
@@ -621,6 +621,26 @@ WaitForCommitText(kFinalSpeechResult16); } +IN_PROC_BROWSER_TEST_P(DictationTest, ChromeVoxSilencedWhenToggledOn) { + // Set up ChromeVox. + test::SpeechMonitor sm; + EXPECT_FALSE(GetManager()->IsSpokenFeedbackEnabled()); + extensions::ExtensionHostTestHelper host_helper( + browser()->profile(), extension_misc::kChromeVoxExtensionId); + EnableChromeVox(); + host_helper.WaitForHostCompletedFirstLoad(); + EXPECT_TRUE(GetManager()->IsSpokenFeedbackEnabled()); + + // Not yet forced to stop. + EXPECT_EQ(0, sm.stop_count()); + + ToggleDictationWithKeystroke(); + WaitForRecognitionStarted(); + + // Assert ChromeVox was asked to stop speaking at the toggle. + EXPECT_EQ(1, sm.stop_count()); +} + IN_PROC_BROWSER_TEST_P(DictationTest, EntersInterimSpeechWhenToggledOff) { InstallMockInputContextHandler();
diff --git a/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc b/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc index c2349ae6..fdd78aa 100644 --- a/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc +++ b/chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include <string> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/ash_pref_names.h" #include "base/bind.h" #include "base/callback.h" @@ -17,6 +16,7 @@ #include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_id/account_id.h" #include "components/account_manager_core/account.h" #include "components/account_manager_core/account_manager_facade.h"
diff --git a/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc b/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc index 76a650d..da481522 100644 --- a/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc +++ b/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc
@@ -9,10 +9,10 @@ #include <memory> #include <utility> -#include "ash/components/account_manager/account_manager_factory.h" #include "base/no_destructor.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_ash.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account_manager_facade_impl.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
diff --git a/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc b/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc index 0eb785fa..a543ef2 100644 --- a/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc +++ b/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/account_manager/account_manager_factory.h" #include "base/files/scoped_temp_dir.h" #include "base/run_loop.h" #include "base/test/bind.h" @@ -17,6 +16,7 @@ #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account.h" #include "components/account_manager_core/account_manager_facade.h" #include "components/account_manager_core/chromeos/account_manager.h"
diff --git a/chrome/browser/ash/account_manager/account_manager_policy_controller_factory.cc b/chrome/browser/ash/account_manager/account_manager_policy_controller_factory.cc index 53a241c7..7efd57d 100644 --- a/chrome/browser/ash/account_manager/account_manager_policy_controller_factory.cc +++ b/chrome/browser/ash/account_manager/account_manager_policy_controller_factory.cc
@@ -4,13 +4,13 @@ #include "chrome/browser/ash/account_manager/account_manager_policy_controller_factory.h" -#include "ash/components/account_manager/account_manager_factory.h" #include "base/no_destructor.h" #include "chrome/browser/ash/account_manager/account_manager_policy_controller.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/profiles/profile.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account_manager_facade.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h"
diff --git a/chrome/browser/ash/account_manager/account_manager_util.cc b/chrome/browser/ash/account_manager/account_manager_util.cc index 5030275f..9265cc2 100644 --- a/chrome/browser/ash/account_manager/account_manager_util.cc +++ b/chrome/browser/ash/account_manager/account_manager_util.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "ash/components/account_manager/account_manager_factory.h" #include "chrome/browser/ash/account_manager/account_manager_ui_impl.h" #include "chrome/browser/ash/net/delay_network_call.h" #include "chrome/browser/ash/profiles/profile_helper.h" @@ -15,6 +14,7 @@ #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profiles_state.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_mojo_service.h" #include "components/account_manager_core/chromeos/account_manager_ui.h"
diff --git a/chrome/browser/ash/authpolicy/authpolicy_credentials_manager.cc b/chrome/browser/ash/authpolicy/authpolicy_credentials_manager.cc index 8742ffa..93bff26 100644 --- a/chrome/browser/ash/authpolicy/authpolicy_credentials_manager.cc +++ b/chrome/browser/ash/authpolicy/authpolicy_credentials_manager.cc
@@ -7,7 +7,6 @@ #include <memory> #include <utility> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/notifier_catalogs.h" #include "ash/public/cpp/notification_utils.h" #include "base/bind.h" @@ -27,6 +26,7 @@ #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/ash/components/dbus/authpolicy/authpolicy_client.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_state.h"
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index 813a3a1..ed8d45d 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -235,7 +235,6 @@ deps = [ "//ash", - "//ash/components/account_manager", "//ash/components/arc:arc_base_utils", "//ash/components/arc/mojom", "//ash/components/arc/session", @@ -265,6 +264,7 @@ "//chrome/common", "//chrome/common:channel_info", "//chrome/common:constants", + "//chromeos/ash/components/account_manager", "//chromeos/ash/components/dbus/cros_disks", "//chromeos/ash/components/dbus/lorgnette_manager:lorgnette_proto", "//chromeos/ash/components/dbus/resourced",
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc index 5a453d8..b150648 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.cc +++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -8,7 +8,6 @@ #include <utility> #include <vector> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/display/cros_display_config.h" #include "ash/public/ash_interfaces.h" #include "base/dcheck_is_on.h" @@ -108,6 +107,7 @@ #include "chrome/browser/ui/ash/holding_space/holding_space_keyed_service_factory.h" #include "chrome/browser/web_applications/web_app_utils.h" #include "chrome/common/chrome_features.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/components/cdm_factory_daemon/cdm_factory_daemon_proxy_ash.h" #include "chromeos/components/sensors/ash/sensor_hal_dispatcher.h" #include "chromeos/crosapi/mojom/drive_integration_service.mojom.h"
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc index 632043e..c17d879e 100644 --- a/chrome/browser/ash/crosapi/crosapi_util.cc +++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -7,6 +7,7 @@ #include <sys/mman.h> #include "ash/components/arc/arc_util.h" +#include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/cros_settings_provider.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" @@ -674,6 +675,30 @@ ? MojoOptionalBool::kTrue : MojoOptionalBool::kFalse; } + + bool report_device_network_status = true; + if (cros_settings->GetBoolean(ash::kReportDeviceNetworkStatus, + &report_device_network_status)) { + result->report_device_network_status = report_device_network_status + ? MojoOptionalBool::kTrue + : MojoOptionalBool::kFalse; + } + + int report_upload_frequency; + if (cros_settings->GetInteger(ash::kReportUploadFrequency, + &report_upload_frequency)) { + result->report_upload_frequency = + crosapi::mojom::NullableInt64::New(report_upload_frequency); + } + + int report_device_network_telemetry_collection_rate_ms; + if (cros_settings->GetInteger( + ash::kReportDeviceNetworkTelemetryCollectionRateMs, + &report_device_network_telemetry_collection_rate_ms)) { + result->report_device_network_telemetry_collection_rate_ms = + crosapi::mojom::NullableInt64::New( + report_device_network_telemetry_collection_rate_ms); + } } else { LOG(WARNING) << "Unexpected crossettings trusted values status: " << trusted_result;
diff --git a/chrome/browser/ash/crosapi/crosapi_util_unittest.cc b/chrome/browser/ash/crosapi/crosapi_util_unittest.cc index 379751f..d68c1aa 100644 --- a/chrome/browser/ash/crosapi/crosapi_util_unittest.cc +++ b/chrome/browser/ash/crosapi/crosapi_util_unittest.cc
@@ -6,6 +6,8 @@ #include <string> +#include "ash/components/settings/cros_settings_names.h" +#include "base/time/time.h" #include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" @@ -14,6 +16,7 @@ #include "chromeos/crosapi/mojom/keystore_service.mojom.h" #include "components/user_manager/scoped_user_manager.h" #include "content/public/test/browser_task_environment.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using user_manager::User; @@ -125,6 +128,11 @@ crosapi::mojom::DeviceSettings::OptionalBool::kUnset); EXPECT_EQ(settings->device_restricted_managed_guest_session_enabled, crosapi::mojom::DeviceSettings::OptionalBool::kUnset); + EXPECT_EQ(settings->report_device_network_status, + crosapi::mojom::DeviceSettings::OptionalBool::kUnset); + EXPECT_TRUE(settings->report_upload_frequency.is_null()); + EXPECT_TRUE( + settings->report_device_network_telemetry_collection_rate_ms.is_null()); } TEST_F(CrosapiUtilTest, DeviceSettingsWithData) { @@ -142,6 +150,21 @@ testing_profile_.ScopedCrosSettingsTestHelper() ->GetStubbedProvider() ->SetBoolean(ash::kDeviceRestrictedManagedGuestSessionEnabled, true); + testing_profile_.ScopedCrosSettingsTestHelper() + ->GetStubbedProvider() + ->SetBoolean(ash::kReportDeviceNetworkStatus, true); + + const int64_t kReportUploadFrequencyMs = base::Hours(1).InMilliseconds(); + testing_profile_.ScopedCrosSettingsTestHelper() + ->GetStubbedProvider() + ->SetInteger(ash::kReportUploadFrequency, kReportUploadFrequencyMs); + + const int64_t kReportDeviceNetworkTelemetryCollectionRateMs = + base::Minutes(15).InMilliseconds(); + testing_profile_.ScopedCrosSettingsTestHelper() + ->GetStubbedProvider() + ->SetInteger(ash::kReportDeviceNetworkTelemetryCollectionRateMs, + kReportDeviceNetworkTelemetryCollectionRateMs); base::Value allowlist(base::Value::Type::LIST); base::Value ids(base::Value::Type::DICTIONARY); @@ -173,6 +196,11 @@ true); EXPECT_EQ(settings->usb_detachable_allow_list->usb_device_ids[0]->product_id, 3); + EXPECT_EQ(settings->report_device_network_status, + crosapi::mojom::DeviceSettings::OptionalBool::kTrue); + EXPECT_EQ(settings->report_upload_frequency->value, kReportUploadFrequencyMs); + EXPECT_EQ(settings->report_device_network_telemetry_collection_rate_ms->value, + kReportDeviceNetworkTelemetryCollectionRateMs); } } // namespace crosapi
diff --git a/chrome/browser/ash/input_method/assistive_window_controller.cc b/chrome/browser/ash/input_method/assistive_window_controller.cc index 13eec891..30f7e45 100644 --- a/chrome/browser/ash/input_method/assistive_window_controller.cc +++ b/chrome/browser/ash/input_method/assistive_window_controller.cc
@@ -23,6 +23,8 @@ namespace ash { namespace input_method { +constexpr base::TimeDelta kShowSuggestionDelayMs = base::Milliseconds(5); + namespace { gfx::NativeView GetParentView() { gfx::NativeView parent = nullptr; @@ -45,6 +47,7 @@ : delegate_(delegate), accessibility_view_(accessibility_view) {} AssistiveWindowController::~AssistiveWindowController() { + ClearPendingSuggestionTimer(); if (suggestion_window_view_ && suggestion_window_view_->GetWidget()) suggestion_window_view_->GetWidget()->RemoveObserver(this); if (undo_window_ && undo_window_->GetWidget()) @@ -101,6 +104,7 @@ } void AssistiveWindowController::OnWidgetDestroying(views::Widget* widget) { + ClearPendingSuggestionTimer(); if (suggestion_window_view_ && widget == suggestion_window_view_->GetWidget()) { widget->RemoveObserver(this); @@ -143,6 +147,7 @@ void AssistiveWindowController::HideSuggestion() { suggestion_text_ = base::EmptyString16(); confirmed_length_ = 0; + ClearPendingSuggestionTimer(); if (suggestion_window_view_) suggestion_window_view_->GetWidget()->Close(); if (grammar_suggestion_window_) @@ -150,17 +155,17 @@ } void AssistiveWindowController::SetBounds(const Bounds& bounds) { + if (bounds == bounds_) + return; + bounds_ = bounds; - // Sets suggestion_window_view_'s bounds here for most up-to-date cursor - // position. This is different from UndoWindow because UndoWindow gets cursors - // position before showing. - // TODO(crbug/1112982): Investigate getting bounds to suggester before sending - // show suggestion request. - if (suggestion_window_view_) { - suggestion_window_view_->SetAnchorRect(bounds.caret); - } - if (grammar_suggestion_window_) { + if (suggestion_window_view_) + suggestion_window_view_->SetAnchorRect(bounds_.caret); + if (grammar_suggestion_window_) grammar_suggestion_window_->SetBounds(bounds_.caret); + if (pending_suggestion_timer_ && pending_suggestion_timer_->IsRunning()) { + pending_suggestion_timer_->FireNow(); + pending_suggestion_timer_ = nullptr; } } @@ -172,13 +177,18 @@ void AssistiveWindowController::ShowSuggestion( const ui::ime::SuggestionDetails& details) { - if (!suggestion_window_view_) - // Since there is only one suggestion text in ShowSuggestion, we default to - // vertical layout. - InitSuggestionWindow(ui::ime::SuggestionWindowView::Orientation::kVertical); suggestion_text_ = details.text; confirmed_length_ = details.confirmed_length; - suggestion_window_view_->Show(details); + // Delay the showing of a completion suggestion. This is required to solve + // b/241321719, where we receive a ShowSuggestion call prior to a + // corresponding SetBounds call. Delaying allows any relevant SetBounds calls + // to be received before we show the suggestion to the user. + ClearPendingSuggestionTimer(); + pending_suggestion_timer_ = std::make_unique<base::OneShotTimer>(); + pending_suggestion_timer_->Start( + FROM_HERE, kShowSuggestionDelayMs, + base::BindOnce(&AssistiveWindowController::DisplayCompletionSuggestion, + weak_ptr_factory_.GetWeakPtr(), details)); } void AssistiveWindowController::SetButtonHighlighted( @@ -246,6 +256,11 @@ void AssistiveWindowController::SetAssistiveWindowProperties( const AssistiveWindowProperties& window) { window_ = window; + + // Make sure any pending timers are cleared before we attempt to show, or + // update, another assistive window. + ClearPendingSuggestionTimer(); + switch (window.type) { case ui::ime::AssistiveWindowType::kUndoWindow: if (!undo_window_) @@ -292,6 +307,22 @@ Announce(window.announce_string); } +void AssistiveWindowController::DisplayCompletionSuggestion( + const ui::ime::SuggestionDetails& details) { + if (!suggestion_window_view_) + InitSuggestionWindow(ui::ime::SuggestionWindowView::Orientation::kVertical); + suggestion_window_view_->SetAnchorRect(bounds_.caret); + suggestion_window_view_->Show(details); +} + +void AssistiveWindowController::ClearPendingSuggestionTimer() { + if (pending_suggestion_timer_) { + if (pending_suggestion_timer_->IsRunning()) + pending_suggestion_timer_->Stop(); + pending_suggestion_timer_ = nullptr; + } +} + void AssistiveWindowController::AssistiveWindowButtonClicked( const ui::ime::AssistiveWindowButton& button) const { delegate_->AssistiveWindowButtonClicked(button);
diff --git a/chrome/browser/ash/input_method/assistive_window_controller.h b/chrome/browser/ash/input_method/assistive_window_controller.h index c996b53e..3ca03a09 100644 --- a/chrome/browser/ash/input_method/assistive_window_controller.h +++ b/chrome/browser/ash/input_method/assistive_window_controller.h
@@ -6,7 +6,10 @@ #define CHROME_BROWSER_ASH_INPUT_METHOD_ASSISTIVE_WINDOW_CONTROLLER_H_ #include <memory> +#include <optional> +#include "base/memory/weak_ptr.h" +#include "base/timer/timer.h" #include "chrome/browser/ash/input_method/assistive_window_properties.h" #include "chrome/browser/ash/input_method/ui/assistive_accessibility_view.h" #include "chrome/browser/ash/input_method/ui/assistive_delegate.h" @@ -73,6 +76,8 @@ void InitUndoWindow(); void InitGrammarSuggestionWindow(); void InitAccessibilityView(); + void DisplayCompletionSuggestion(const ui::ime::SuggestionDetails& details); + void ClearPendingSuggestionTimer(); const AssistiveWindowControllerDelegate* delegate_; AssistiveWindowProperties window_; @@ -83,6 +88,9 @@ std::u16string suggestion_text_; size_t confirmed_length_ = 0; Bounds bounds_; + std::unique_ptr<base::OneShotTimer> pending_suggestion_timer_; + + base::WeakPtrFactory<AssistiveWindowController> weak_ptr_factory_{this}; }; } // namespace input_method
diff --git a/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc b/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc index 9077f9b1..df255fef 100644 --- a/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc +++ b/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/test/base/chrome_ash_test_base.h" #include "chrome/test/base/testing_profile.h" +#include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/window.h" #include "ui/base/ime/ash/ime_assistive_window_handler_interface.h" @@ -31,6 +32,8 @@ namespace ash { namespace input_method { +constexpr size_t kShowSuggestionDelayMs = 5; + class MockDelegate : public AssistiveWindowControllerDelegate { public: ~MockDelegate() override = default; @@ -53,7 +56,10 @@ class AssistiveWindowControllerTest : public ChromeAshTestBase { protected: - AssistiveWindowControllerTest() = default; + AssistiveWindowControllerTest() + : ChromeAshTestBase(std::make_unique<content::BrowserTaskEnvironment>( + base::test::TaskEnvironment::TimeSource::MOCK_TIME)) {} + ~AssistiveWindowControllerTest() override = default; void SetUp() override { @@ -105,6 +111,11 @@ /*disabled_features=*/{}); } + void WaitForSuggestionWindowDelay() { + task_environment()->FastForwardBy( + base::Milliseconds(kShowSuggestionDelayMs + 1)); + } + base::test::ScopedFeatureList feature_list_; std::unique_ptr<AssistiveWindowController> controller_; std::unique_ptr<MockDelegate> delegate_ = std::make_unique<MockDelegate>(); @@ -115,10 +126,42 @@ std::unique_ptr<TestAccessibilityView> accessibility_view_; }; +TEST_F(AssistiveWindowControllerTest, ShowSuggestionDelaysWindowDisplay) { + ui::ime::SuggestionDetails details; + details.text = u"asdf"; + details.confirmed_length = 3; + + controller_->ShowSuggestion(details); + ui::ime::SuggestionWindowView* window_before_delay = + controller_->GetSuggestionWindowViewForTesting(); + WaitForSuggestionWindowDelay(); + ui::ime::SuggestionWindowView* window_after_delay = + controller_->GetSuggestionWindowViewForTesting(); + + EXPECT_EQ(window_before_delay, nullptr); + EXPECT_NE(window_after_delay, nullptr); +} + +TEST_F(AssistiveWindowControllerTest, + SetBoundsAfterShowSuggestionCancelsDelay) { + ui::ime::SuggestionDetails details; + details.text = u"asdf"; + details.confirmed_length = 3; + gfx::Rect caret_bounds(0, 0, 100, 100); + + controller_->ShowSuggestion(details); + controller_->SetBounds(Bounds{.caret = caret_bounds}); + ui::ime::SuggestionWindowView* suggestion_window_view = + controller_->GetSuggestionWindowViewForTesting(); + + EXPECT_NE(suggestion_window_view, nullptr); +} + TEST_F(AssistiveWindowControllerTest, ShowSuggestionSetsConfirmedLength) { ui::ime::SuggestionDetails details; details.text = u"asdf"; details.confirmed_length = 3; + controller_->ShowSuggestion(details); EXPECT_EQ(controller_->GetConfirmedLength(), 3u); @@ -128,16 +171,18 @@ ui::ime::SuggestionDetails details; details.text = suggestion_; details.confirmed_length = 0; + controller_->ShowSuggestion(details); + WaitForSuggestionWindowDelay(); ui::ime::SuggestionWindowView* suggestion_view = controller_->GetSuggestionWindowViewForTesting(); + ASSERT_NE(suggestion_view, nullptr); gfx::Rect current_bounds = suggestion_view->GetAnchorRect(); gfx::Rect caret_bounds(0, 0, 100, 100); Bounds bounds; bounds.caret = caret_bounds; controller_->SetBounds(bounds); - EXPECT_NE(suggestion_view->GetAnchorRect(), current_bounds); EXPECT_EQ(suggestion_view->GetAnchorRect(), caret_bounds); } @@ -146,16 +191,18 @@ ui::ime::SuggestionDetails details; details.text = suggestion_; details.confirmed_length = 1; + controller_->ShowSuggestion(details); + WaitForSuggestionWindowDelay(); ui::ime::SuggestionWindowView* suggestion_view = controller_->GetSuggestionWindowViewForTesting(); + ASSERT_NE(suggestion_view, nullptr); gfx::Rect current_bounds = suggestion_view->GetAnchorRect(); gfx::Rect caret_bounds(0, 0, 100, 100); Bounds bounds; bounds.caret = caret_bounds; controller_->SetBounds(bounds); - EXPECT_NE(suggestion_view->GetAnchorRect(), current_bounds); EXPECT_EQ(suggestion_view->GetAnchorRect(), caret_bounds); } @@ -164,10 +211,13 @@ ui::ime::SuggestionDetails details; details.text = suggestion_; details.confirmed_length = 0; + controller_->ShowSuggestion(details); + WaitForSuggestionWindowDelay(); ui::ime::SuggestionWindowView* suggestion_view = controller_->GetSuggestionWindowViewForTesting(); + ASSERT_NE(suggestion_view, nullptr); gfx::Rect current_bounds = suggestion_view->GetAnchorRect(); gfx::Rect caret_bounds_after_one_key(current_bounds.width() + 1, current_bounds.height()); @@ -194,7 +244,9 @@ ui::ime::SuggestionDetails details; details.text = suggestion_; details.confirmed_length = 1; + controller_->ShowSuggestion(details); + WaitForSuggestionWindowDelay(); gfx::Rect current_bounds = controller_->GetSuggestionWindowViewForTesting()->GetAnchorRect();
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc index 9ccdad9..97662ab2 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
@@ -942,16 +942,9 @@ } }; -// Flake on ASAN: crbug.com/1340982 -#if defined(ADDRESS_SANITIZER) || !defined(NDEBUG) -#define MAYBE_VariantCountryCodeRegionDefaultCountryIsSet \ - DISABLED_VariantCountryCodeRegionDefaultCountryIsSet -#else -#define MAYBE_VariantCountryCodeRegionDefaultCountryIsSet \ - VariantCountryCodeRegionDefaultCountryIsSet -#endif +// Flaky test: crbug.com/1340982, crbug.com/1147265 IN_PROC_BROWSER_TEST_F(DemoSetupVariantCountryCodeRegionTest, - MAYBE_VariantCountryCodeRegionDefaultCountryIsSet) { + DISABLED_VariantCountryCodeRegionDefaultCountryIsSet) { // Simulate successful online setup. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION); @@ -992,7 +985,8 @@ }; // Flake on ASAN: crbug.com/1340618 -#if defined(ADDRESS_SANITIZER) || !defined(NDEBUG) +// Flake on Linux Chrome OS: crbug.com/1351186 +#if defined(ADDRESS_SANITIZER) || !defined(NDEBUG) || BUILDFLAG(IS_CHROMEOS) #define MAYBE_VirtualSetCountryCodeRegionPlaceholderIsSet \ DISABLED_VirtualSetCountryCodeRegionPlaceholderIsSet #else @@ -1029,16 +1023,9 @@ } }; -// TODO(crbug.com/1320444): Re-enable the test in debug. -#if defined(ADDRESS_SANITIZER) || !defined(NDEBUG) -#define MAYBE_RegionCodeNotExistPlaceholderIsSet \ - DISABLED_RegionCodeNotExistPlaceholderIsSet -#else -#define MAYBE_RegionCodeNotExistPlaceholderIsSet \ - RegionCodeNotExistPlaceholderIsSet -#endif +// TODO(crbug.com/1320444): Flaky test. IN_PROC_BROWSER_TEST_F(DemoSetupRegionCodeNotExistTest, - MAYBE_RegionCodeNotExistPlaceholderIsSet) { + DISABLED_RegionCodeNotExistPlaceholderIsSet) { // Simulate successful online setup. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION);
diff --git a/chrome/browser/ash/login/saml/saml_browsertest.cc b/chrome/browser/ash/login/saml/saml_browsertest.cc index e7c8cb5..1c4dc61 100644 --- a/chrome/browser/ash/login/saml/saml_browsertest.cc +++ b/chrome/browser/ash/login/saml/saml_browsertest.cc
@@ -906,8 +906,9 @@ // Verifies that if the authenticated user's e-mail address cannot be retrieved, // an error message is shown. +// TODO(crbug.com/1348198): Flaky. IN_PROC_BROWSER_TEST_P(SamlTestWithFeatures, - FailToRetrieveAutenticatedUserEmailAddress) { + DISABLED_FailToRetrieveAutenticatedUserEmailAddress) { fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html"); StartSamlAndWaitForIdpPageLoad( saml_test_users::kFirstUserCorpExampleComEmail);
diff --git a/chrome/browser/ash/login/session/chrome_session_manager.cc b/chrome/browser/ash/login/session/chrome_session_manager.cc index b57fb72..baf3934 100644 --- a/chrome/browser/ash/login/session/chrome_session_manager.cc +++ b/chrome/browser/ash/login/session/chrome_session_manager.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" @@ -54,6 +53,7 @@ #include "chrome/browser/ui/webui/chromeos/shimless_rma_dialog.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/ash/components/dbus/rmad/rmad_client.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" #include "components/account_id/account_id.h"
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc index 2d21801..d07f6dde 100644 --- a/chrome/browser/ash/login/session/user_session_manager.cc +++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -14,7 +14,6 @@ #include <utility> #include <vector> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/components/arc/arc_prefs.h" #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/login/auth/auth_session_authenticator.h" @@ -127,6 +126,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/logging_chrome.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" #include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
diff --git a/chrome/browser/ash/login/signin/OWNERS b/chrome/browser/ash/login/signin/OWNERS index 4a33d9a3..99a8ac2f 100644 --- a/chrome/browser/ash/login/signin/OWNERS +++ b/chrome/browser/ash/login/signin/OWNERS
@@ -1 +1 @@ -per-file *signin_error_notifier*=file://ash/components/account_manager/OWNERS +per-file *signin_error_notifier*=file://chromeos/ash/components/account_manager/OWNERS
diff --git a/chrome/browser/ash/login/signin/signin_error_notifier.cc b/chrome/browser/ash/login/signin/signin_error_notifier.cc index 6b72426..4e2c005 100644 --- a/chrome/browser/ash/login/signin/signin_error_notifier.cc +++ b/chrome/browser/ash/login/signin/signin_error_notifier.cc
@@ -7,7 +7,6 @@ #include <memory> #include <string> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/notifier_catalogs.h" #include "ash/public/cpp/notification_utils.h" #include "base/bind.h" @@ -37,6 +36,7 @@ #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/ui/vector_icons/vector_icons.h" #include "components/account_id/account_id.h" #include "components/account_manager_core/account.h"
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc index a04c5e2..0d4ce4bd 100644 --- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc +++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
@@ -178,12 +178,10 @@ std::string MaybeConvertToTestUrl(std::string url) { if (base::CommandLine::ForCurrentProcess()->HasSwitch( ash::switches::kTestWallpaperServer)) { - base::ReplaceFirstSubstringAfterOffset(&url, 0, "clients3", - "chromecast-dev.sandbox"); + base::ReplaceFirstSubstringAfterOffset(&url, 0, "clients3", "clients1"); } else if (base::FeatureList::IsEnabled( chromeos::features::kUseWallpaperStagingUrl)) { - base::ReplaceFirstSubstringAfterOffset(&url, 0, "clients3", - "chromecast-staging.sandbox"); + base::ReplaceFirstSubstringAfterOffset(&url, 0, "clients3", "clients2"); } return url; }
diff --git a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManager.java b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManager.java index f86993a..00b7a18 100644 --- a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManager.java +++ b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManager.java
@@ -49,6 +49,7 @@ put(Type.SHOW_READING_LIST, 14); put(Type.MINIMIZE_APP_AND_CLOSE_TAB, 15); put(Type.FIND_TOOLBAR, 16); + put(Type.LOCATION_BAR, 17); // Add new one here. } };
diff --git a/chrome/browser/bookmarks/url_and_id.h b/chrome/browser/bookmarks/url_and_id.h index 0cb5b479..c9032b7 100644 --- a/chrome/browser/bookmarks/url_and_id.h +++ b/chrome/browser/bookmarks/url_and_id.h
@@ -9,7 +9,7 @@ struct UrlAndId { GURL url; - int64_t id; + int64_t id = -1; }; #endif // CHROME_BROWSER_BOOKMARKS_URL_AND_ID_H_
diff --git a/chrome/browser/browser_process_platform_part_ash.cc b/chrome/browser/browser_process_platform_part_ash.cc index 7c7cf10..26fba0e8 100644 --- a/chrome/browser/browser_process_platform_part_ash.cc +++ b/chrome/browser/browser_process_platform_part_ash.cc
@@ -7,7 +7,6 @@ #include <memory> #include <utility> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/components/arc/enterprise/arc_data_snapshotd_manager.h" #include "ash/components/arc/enterprise/snapshot_hours_policy_service.h" #include "ash/components/geolocation/simple_geolocation_provider.h" @@ -37,6 +36,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/metadata_table_chromeos.h" #include "chrome/common/chrome_switches.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h" #include "components/keep_alive_registry/keep_alive_types.h" #include "components/keep_alive_registry/scoped_keep_alive.h"
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index 4a9c37b..333789dc1 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -606,6 +606,12 @@ if (auto* share_ranking = sharing::ShareRanking::Get(profile_)) share_ranking->Clear(delete_begin_, delete_end_); #endif + + // Also clear the last used time in bookmarks. + auto* bookmark_model = BookmarkModelFactory::GetForBrowserContext(profile_); + if (bookmark_model && bookmark_model->loaded()) { + bookmark_model->ClearLastUsedTimeInRange(delete_begin, delete_end); + } } //////////////////////////////////////////////////////////////////////////////
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 2faeef2..879eeb4e 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
@@ -67,10 +67,6 @@ #include "chrome/browser/subresource_filter/subresource_filter_profile_context_factory.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/translate/chrome_translate_client.h" -#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" -#include "chrome/browser/web_applications/test/web_app_test_utils.h" -#include "chrome/browser/web_applications/web_app.h" -#include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "chrome/browser/web_data_service_factory.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_features.h" @@ -172,10 +168,17 @@ #include "chrome/browser/android/webapps/webapp_registry.h" #include "components/feed/buildflags.h" #else -#include "chrome/browser/web_applications/test/fake_web_app_provider.h" #include "content/public/browser/host_zoom_map.h" #endif // BUILDFLAG(IS_ANDROID) +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chrome/browser/web_applications/test/fake_web_app_provider.h" +#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" +#include "chrome/browser/web_applications/web_app.h" +#include "chrome/browser/web_applications/web_app_sync_bridge.h" +#endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_LACROS) + #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/ash/login/users/mock_user_manager.h" #include "chromeos/ash/components/dbus/attestation/fake_attestation_client.h" @@ -1832,6 +1835,23 @@ EXPECT_EQ(0u, bookmark_model->bookmark_bar_node()->children().size()); } +TEST_F(ChromeBrowsingDataRemoverDelegateTest, DeleteBookmarkHistory) { + GURL bookmarked_page("http://a"); + + TestingProfile* profile = GetProfile(); + bookmarks::BookmarkModel* bookmark_model = + BookmarkModelFactory::GetForBrowserContext(profile); + bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model); + const bookmarks::BookmarkNode* node = bookmark_model->AddURL( + bookmark_model->bookmark_bar_node(), 0, u"a", bookmarked_page); + bookmark_model->UpdateLastUsedTime(node, base::Time::Now()); + + BlockUntilBrowsingDataRemoved(base::Time(), base::Time::Max(), + constants::DATA_TYPE_HISTORY, false); + + EXPECT_EQ(base::Time(), node->date_last_used()); +} + // Verifies deleting does not crash if BookmarkModel has not been loaded. // Regression test for: https://crbug.com/1207632. TEST_F(ChromeBrowsingDataRemoverDelegateTest,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index f791bfe..34c97cd 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -83,7 +83,6 @@ "../ash/guest_os:guest_os_diagnostics_mojom", "//apps", "//ash", - "//ash/components/account_manager", "//ash/components/arc", "//ash/components/arc/enterprise", "//ash/components/arc/input_overlay/resources:resources_grit", @@ -247,6 +246,7 @@ "//chrome/services/printing/public/mojom", "//chrome/services/wilco_dtc_supportd/public/mojom", "//chromeos:chromeos_export", + "//chromeos/ash/components/account_manager", "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/dbus:metrics_event_proto",
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos_unittest.cc b/chrome/browser/component_updater/cros_component_installer_chromeos_unittest.cc index 7869b1c66..1195433 100644 --- a/chrome/browser/component_updater/cros_component_installer_chromeos_unittest.cc +++ b/chrome/browser/component_updater/cros_component_installer_chromeos_unittest.cc
@@ -27,7 +27,6 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/image_loader/fake_image_loader_client.h" #include "chromeos/ash/components/dbus/image_loader/image_loader_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "components/component_updater/mock_component_updater_service.h" #include "components/update_client/utils.h" #include "components/user_manager/scoped_user_manager.h" @@ -211,7 +210,6 @@ tmp_unpack_dir_ = base_component_paths_.GetPath().AppendASCII("tmp_unpack"); - chromeos::DBusThreadManager::Initialize(); ash::ImageLoaderClient::InitializeFake(); image_loader_client_ = static_cast<ash::FakeImageLoaderClient*>(ash::ImageLoaderClient::Get()); @@ -220,7 +218,6 @@ void TearDown() override { image_loader_client_ = nullptr; ash::ImageLoaderClient::Shutdown(); - chromeos::DBusThreadManager::Shutdown(); preinstalled_components_path_override_.reset(); user_components_path_override_.reset(); }
diff --git a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java index 4b1021b..c5fbd535 100644 --- a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java +++ b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java
@@ -10,7 +10,6 @@ import android.content.pm.PackageManager; import android.os.Handler; import android.os.Looper; -import android.os.SystemClock; import androidx.annotation.VisibleForTesting; @@ -76,7 +75,6 @@ new AsyncTask<OwnedState>() { // TODO: Unit test this function. https://crbug.com/1099262 private OwnedState calculateIsRunningOnManagedProfile(Context context) { - long startTime = SystemClock.elapsedRealtime(); boolean hasProfileOwnerApp = false; boolean hasDeviceOwnerApp = false; PackageManager packageManager = context.getPackageManager(); @@ -100,11 +98,6 @@ if (hasProfileOwnerApp && hasDeviceOwnerApp) break; } - long endTime = SystemClock.elapsedRealtime(); - RecordHistogram.recordTimesHistogram( - "EnterpriseCheck.IsRunningOnManagedProfileDuration", - endTime - startTime); - return new OwnedState(hasDeviceOwnerApp, hasProfileOwnerApp); }
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc index 067f00bf..fab3f50 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc
@@ -28,7 +28,7 @@ public: void SetUpInProcessBrowserTestFixture() override { ExtensionApiTest::SetUpInProcessBrowserTestFixture(); - test_utils_.SetUp(true); + test_utils_.SetUp(); ASSERT_TRUE(test_utils_.FillFile(test_utils_.GetImagePath(), image_writer::kImagePattern,
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.cc b/chrome/browser/extensions/api/image_writer_private/test_utils.cc index b2f2c62..18c263b 100644 --- a/chrome/browser/extensions/api/image_writer_private/test_utils.cc +++ b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
@@ -222,10 +222,6 @@ #endif void ImageWriterTestUtils::SetUp() { - SetUp(false); -} - -void ImageWriterTestUtils::SetUp(bool is_browser_test) { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); ASSERT_TRUE( base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &test_image_path_)); @@ -236,17 +232,14 @@ ASSERT_TRUE(FillFile(test_device_path_, kDevicePattern, kTestFileSize)); #if BUILDFLAG(IS_CHROMEOS_ASH) - if (!chromeos::DBusThreadManager::IsInitialized()) { - if (!is_browser_test) { - // For browser tests, chromeos::InitializeDBus() automatically does the - // same. - chromeos::DBusThreadManager::Initialize(); - ash::ConciergeClient::InitializeFake( - /*fake_cicerone_client=*/nullptr); - } - image_burner_client_ = std::make_unique<ImageWriterFakeImageBurnerClient>(); - ash::ImageBurnerClient::SetInstanceForTest(image_burner_client_.get()); + // Browser tests might have already initialized ConciergeClient. + if (!ash::ConciergeClient::Get()) { + ash::ConciergeClient::InitializeFake( + /*fake_cicerone_client=*/nullptr); + concierge_client_initialized_ = true; } + image_burner_client_ = std::make_unique<ImageWriterFakeImageBurnerClient>(); + ash::ImageBurnerClient::SetInstanceForTest(image_burner_client_.get()); FakeDiskMountManager* disk_manager = new FakeDiskMountManager(); ash::disks::DiskMountManager::InitializeForTesting(disk_manager); @@ -269,11 +262,9 @@ ash::ImageBurnerClient::SetInstanceForTest(nullptr); image_burner_client_.reset(); - if (chromeos::DBusThreadManager::IsInitialized()) { - // When in browser_tests, this path is not taken. These clients have already - // been shut down by chromeos::ShutdownDBus(). + if (concierge_client_initialized_) { ash::ConciergeClient::Shutdown(); - chromeos::DBusThreadManager::Shutdown(); + concierge_client_initialized_ = false; } ash::disks::DiskMountManager::Shutdown(); #else
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.h b/chrome/browser/extensions/api/image_writer_private/test_utils.h index 9b4b136..fcedd01 100644 --- a/chrome/browser/extensions/api/image_writer_private/test_utils.h +++ b/chrome/browser/extensions/api/image_writer_private/test_utils.h
@@ -170,14 +170,7 @@ const int length); // Set up the test utils, creating temporary folders and such. - // Note that browser tests should use the alternate form and pass "true" as an - // argument. virtual void SetUp(); - // Set up the test utils, creating temporary folders and such. If - // |is_browser_test| is true then it will use alternate initialization - // appropriate for a browser test. This should be run in - // |SetUpInProcessBrowserTestFixture|. - virtual void SetUp(bool is_browser_test); virtual void TearDown(); @@ -192,6 +185,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) std::unique_ptr<ImageWriterFakeImageBurnerClient> image_burner_client_; + bool concierge_client_initialized_ = false; #else scoped_refptr<FakeImageWriterClient> client_; ImageWriterUtilityClient::ImageWriterUtilityClientFactory
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc index debfa02..07031d70 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
@@ -42,6 +42,7 @@ #include "components/password_manager/core/browser/leak_detection/bulk_leak_check.h" #include "components/password_manager/core/browser/leak_detection/encryption_utils.h" #include "components/password_manager/core/browser/password_change_success_tracker.h" +#include "components/password_manager/core/browser/password_feature_manager_impl.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" #include "components/password_manager/core/browser/password_manager_util.h" @@ -261,6 +262,10 @@ int, password_manager::CredentialUIEntry::Less>* id_generator) : profile_(profile), + password_feature_manager_( + std::make_unique<password_manager::PasswordFeatureManagerImpl>( + profile->GetPrefs(), + SyncServiceFactory::GetForProfile(profile))), saved_passwords_presenter_(presenter), insecure_credentials_manager_(presenter, PasswordStoreFactory::GetForProfile( @@ -669,15 +674,10 @@ bool PasswordCheckDelegate::IsAutomatedPasswordChangeFromSettingsEnabled() const { - // Do not offer password change to non-syncing users, as it is required - // for generating passwords. - if (password_manager_util::GetPasswordSyncState( - SyncServiceFactory::GetForProfile(profile_)) == - password_manager::SyncState::kNotSyncing) { - return false; - } - return base::FeatureList::IsEnabled( - password_manager::features::kPasswordChange); + return password_feature_manager_ + ->AreRequirementsForAutomatedPasswordChangeFulfilled() && + base::FeatureList::IsEnabled( + password_manager::features::kPasswordChange); } } // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate.h b/chrome/browser/extensions/api/passwords_private/password_check_delegate.h index 42ba7b46..484d407 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.h +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORD_CHECK_DELEGATE_H_ #define CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORD_CHECK_DELEGATE_H_ +#include <memory> + #include "base/callback.h" #include "base/callback_helpers.h" #include "base/memory/raw_ptr.h" @@ -28,6 +30,7 @@ namespace password_manager { class PasswordChangeSuccessTracker; +class PasswordFeatureManager; class PasswordScriptsFetcher; } // namespace password_manager @@ -176,6 +179,11 @@ // Raw pointer to the underlying profile. Needs to outlive this instance. raw_ptr<Profile> profile_ = nullptr; + // A password feature manager instance used to determine whether to offer + // automated password changes. + const std::unique_ptr<password_manager::PasswordFeatureManager> + password_feature_manager_; + // Used by `insecure_credentials_manager_` to obtain the list of saved // passwords. raw_ptr<password_manager::SavedPasswordsPresenter>
diff --git a/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java b/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java index b1178ae0..d8ec0d8 100644 --- a/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java +++ b/chrome/browser/feature_engagement/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java
@@ -29,6 +29,7 @@ */ public static Tracker getTrackerForProfile(Profile profile) { if (sTestTracker != null) return sTestTracker; + if (profile == null) return null; return TrackerFactoryJni.get().getTrackerForProfile(profile); }
diff --git a/chrome/browser/feedback/system_logs/log_sources/crash_ids_source_unittest.cc b/chrome/browser/feedback/system_logs/log_sources/crash_ids_source_unittest.cc index a103b7d..7941f03 100644 --- a/chrome/browser/feedback/system_logs/log_sources/crash_ids_source_unittest.cc +++ b/chrome/browser/feedback/system_logs/log_sources/crash_ids_source_unittest.cc
@@ -12,7 +12,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h" #include "chromeos/ash/components/dbus/debug_daemon/fake_debug_daemon_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" // nogncheck #endif namespace system_logs { @@ -57,7 +56,6 @@ TEST(CrashIdsSourceTest, CallsCrashSender) { content::BrowserTaskEnvironment task_environment; - chromeos::DBusThreadManager::Initialize(); TestDebugDaemonClient test_debug_client; ash::DebugDaemonClient::SetInstanceForTest(&test_debug_client); @@ -71,7 +69,6 @@ EXPECT_EQ(1, test_debug_client.upload_crashes_called()); ash::DebugDaemonClient::SetInstanceForTest(nullptr); - chromeos::DBusThreadManager::Shutdown(); } #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 18849f9b..1afb375f 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -1085,6 +1085,11 @@ "expiry_milestone": 110 }, { + "name": "cros-privacy-hub-future", + "owners": [ "chromeos-privacyhub@google.com" ], + "expiry_milestone": 120 + }, + { "name": "crosh-swa", "owners": [ "joelhockey", "benwells" ], "expiry_milestone": 110
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 952dd37..3c7fe532 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -5940,6 +5940,11 @@ const char kCrosPrivacyHubName[] = "Enable ChromeOS Privacy Hub"; const char kCrosPrivacyHubDescription[] = "Enables ChromeOS Privacy Hub."; +const char kCrosPrivacyHubFutureName[] = + "Enable ChromeOS Privacy Hub future features"; +const char kCrosPrivacyHubFutureDescription[] = + "Enables ChromeOS Privacy Hub future features."; + const char kDeprecateLowUsageCodecsName[] = "Deprecates low usage media codecs"; const char kDeprecateLowUsageCodecsDescription[] = "Deprecates low usage codecs. Disable this feature to allow playback of "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index ed87a64..4163b8a 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -3398,6 +3398,9 @@ extern const char kCrosPrivacyHubName[]; extern const char kCrosPrivacyHubDescription[]; +extern const char kCrosPrivacyHubFutureName[]; +extern const char kCrosPrivacyHubFutureDescription[]; + extern const char kCrOSEnforceSystemAecName[]; extern const char kCrOSEnforceSystemAecDescription[];
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java index 945e3006..ff0ecfd5 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -81,6 +81,7 @@ .put(ChromeFeatureList.LENS_CAMERA_ASSISTED_SEARCH, false) .put(ChromeFeatureList.NEW_WINDOW_APP_MENU, true) .put(ChromeFeatureList.OMNIBOX_ANDROID_AUXILIARY_SEARCH, false) + .put(ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE, false) .put(ChromeFeatureList.OPTIMIZATION_GUIDE_PUSH_NOTIFICATIONS, false) .put(ChromeFeatureList.PAINT_PREVIEW_DEMO, false) .put(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP, false)
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 d80854c..b83c738 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
@@ -653,6 +653,8 @@ public static final CachedFlag sLensCameraAssistedSearch = new CachedFlag(LENS_CAMERA_ASSISTED_SEARCH, false); public static final CachedFlag sNewWindowAppMenu = new CachedFlag(NEW_WINDOW_APP_MENU, true); + public static final CachedFlag sOmniboxModernizeVisualUpdate = + new CachedFlag(OMNIBOX_MODERNIZE_VISUAL_UPDATE, false); public static final CachedFlag sOptimizationGuidePushNotifications = new CachedFlag(OPTIMIZATION_GUIDE_PUSH_NOTIFICATIONS, false); public static final CachedFlag sPaintPreviewDemo = new CachedFlag(PAINT_PREVIEW_DEMO, false);
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index 40694da..ce85ecfac 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -4192,8 +4192,7 @@ (override)); MOCK_METHOD(void, PasswordFormsRendered, - (const std::vector<autofill::FormData>& visible_form_data, - bool load_completed), + (const std::vector<autofill::FormData>& visible_form_data), (override)); MOCK_METHOD(void, PasswordFormSubmitted, @@ -4259,9 +4258,8 @@ }); ON_CALL(*this, PasswordFormsRendered) .WillByDefault( - [this](const std::vector<autofill::FormData>& visible_form_data, - bool load_completed) { - impl_->PasswordFormsRendered(visible_form_data, load_completed); + [this](const std::vector<autofill::FormData>& visible_form_data) { + impl_->PasswordFormsRendered(visible_form_data); RemoveWaitType(WAIT_FOR_PASSWORD_FORMS::WAIT_FOR_RENDERED); }); ON_CALL(*this, PasswordFormSubmitted)
diff --git a/chrome/browser/payments/android/payment_app_service_bridge_unittest.cc b/chrome/browser/payments/android/payment_app_service_bridge_unittest.cc index c46d4529..3cda200 100644 --- a/chrome/browser/payments/android/payment_app_service_bridge_unittest.cc +++ b/chrome/browser/payments/android/payment_app_service_bridge_unittest.cc
@@ -52,10 +52,7 @@ MOCK_CONST_METHOD0(GetId, std::string()); MOCK_CONST_METHOD0(GetLabel, std::u16string()); MOCK_CONST_METHOD0(GetSublabel, std::u16string()); - MOCK_CONST_METHOD3(IsValidForModifier, - bool(const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks)); + MOCK_CONST_METHOD1(IsValidForModifier, bool(const std::string& method)); MOCK_METHOD0(AsWeakPtr, base::WeakPtr<PaymentApp>()); MOCK_CONST_METHOD0(HandlesShippingAddress, bool()); MOCK_CONST_METHOD0(HandlesPayerName, bool()); @@ -106,7 +103,6 @@ /*number_of_factories=*/3, web_contents_->GetPrimaryMainFrame(), top_origin_, spec.AsWeakPtr(), /*twa_package_name=*/GetParam(), web_data_service_, - /*may_crawl_for_installable_payment_apps=*/true, /*is_off_the_record=*/false, base::BindRepeating(&MockCallback::NotifyCanMakePaymentCalculated, base::Unretained(&mock_callback)), @@ -131,7 +127,6 @@ EXPECT_EQ(2U, bridge->GetMethodData().size()); EXPECT_EQ("basic-card", bridge->GetMethodData()[0]->supported_method); EXPECT_EQ("https://ph.example", bridge->GetMethodData()[1]->supported_method); - EXPECT_TRUE(bridge->MayCrawlForInstallablePaymentApps()); auto app = std::make_unique<MockApp>(); EXPECT_CALL(mock_callback, NotifyPaymentAppCreated(::testing::_));
diff --git a/chrome/browser/payments/service_worker_payment_app_finder_browsertest.cc b/chrome/browser/payments/service_worker_payment_app_finder_browsertest.cc index 4799bdd..e046b5a3 100644 --- a/chrome/browser/payments/service_worker_payment_app_finder_browsertest.cc +++ b/chrome/browser/payments/service_worker_payment_app_finder_browsertest.cc
@@ -204,7 +204,6 @@ GetPaymentManifestWebDataServiceForBrowserContext( context, ServiceAccessType::EXPLICIT_ACCESS), std::move(method_data), - /*may_crawl_for_installable_payment_apps=*/true, base::BindOnce( &ServiceWorkerPaymentAppFinderBrowserTest::OnGotAllPaymentApps, base::Unretained(this)),
diff --git a/chrome/browser/policy/BUILD.gn b/chrome/browser/policy/BUILD.gn index 6bff7bc..09a1c52d 100644 --- a/chrome/browser/policy/BUILD.gn +++ b/chrome/browser/policy/BUILD.gn
@@ -252,11 +252,10 @@ } if (!is_android && !is_chromeos) { - sources += [ "test/network_time_policy_browsertest.cc" ] - - if (!is_fuchsia) { - sources += [ "policy_startup_browsertest.cc" ] - } + sources += [ + "policy_startup_browsertest.cc", + "test/network_time_policy_browsertest.cc", + ] } if (!is_chromeos) {
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 69fd90bc..537bf3c 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -716,14 +716,16 @@ { key::kDefaultGeolocationSetting, prefs::kManagedDefaultGeolocationSetting, base::Value::Type::INTEGER }, -#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) \ + || BUILDFLAG(IS_FUCHSIA) { key::kRequireOnlineRevocationChecksForLocalAnchors, prefs::kCertRevocationCheckingRequiredLocalAnchors, base::Value::Type::BOOLEAN }, { key::kFullscreenAllowed, prefs::kFullscreenAllowed, base::Value::Type::BOOLEAN }, -#endif // #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) +#endif // #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + // || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) { key::kAuthSchemes, prefs::kAuthSchemes, base::Value::Type::STRING }, @@ -1398,7 +1400,8 @@ prefs::kBackgroundModeEnabled, base::Value::Type::BOOLEAN }, #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) \ + || BUILDFLAG(IS_FUCHSIA) { key::kDefaultBrowserSettingEnabled, prefs::kDefaultBrowserSettingEnabled, base::Value::Type::BOOLEAN }, @@ -1409,11 +1412,14 @@ prefs::kDesktopSharingHubEnabled, base::Value::Type::BOOLEAN }, #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + // || BUILDFLAG(IS_FUCHSIA) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) \ + || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) { key::kAutoplayAllowed, prefs::kAutoplayAllowed, base::Value::Type::BOOLEAN }, -#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + // || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) // First run import. { key::kImportBookmarks, @@ -1596,11 +1602,11 @@ base::Value::Type::BOOLEAN }, #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) -#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_FUCHSIA) && BUILDFLAG(ENABLE_EXTENSIONS) +#if !BUILDFLAG(IS_MAC) && BUILDFLAG(ENABLE_EXTENSIONS) { key::kFullscreenAllowed, extensions::pref_names::kAppFullscreenAllowed, base::Value::Type::BOOLEAN }, -#endif // !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_FUCHSIA) && BUILDFLAG(ENABLE_EXTENSIONS) +#endif // !BUILDFLAG(IS_MAC) && BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS) { key::kSecurityKeyPermitAttestation, @@ -1648,7 +1654,8 @@ base::Value::Type::BOOLEAN }, #endif // BUILDFLAG(IS_CHROMEOS_ASH) -#if BUILDFLAG(ENABLE_EXTENSIONS) && (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)) +#if BUILDFLAG(ENABLE_EXTENSIONS) && (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) \ + || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA)) { key::kChromeAppsEnabled, extensions::pref_names::kChromeAppsEnabled, base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/policy/test/autoplay_policy_browsertest.cc b/chrome/browser/policy/test/autoplay_policy_browsertest.cc index 447daaa..da9e769e 100644 --- a/chrome/browser/policy/test/autoplay_policy_browsertest.cc +++ b/chrome/browser/policy/test/autoplay_policy_browsertest.cc
@@ -82,7 +82,6 @@ net::EmbeddedTestServer embedded_test_server2_; }; -#if !BUILDFLAG(IS_FUCHSIA) IN_PROC_BROWSER_TEST_F(AutoplayPolicyTest, AutoplayAllowedByPolicy) { NavigateToTestPage(); @@ -100,7 +99,6 @@ EXPECT_TRUE(TryAutoplay(GetPrimaryMainFrame())); EXPECT_TRUE(TryAutoplay(GetChildFrame())); } -#endif // !BUILDFLAG(IS_FUCHSIA) // Flaky on Linux. See: crbug.com/1189597. #if BUILDFLAG(IS_LINUX)
diff --git a/chrome/browser/prefs/DEPS b/chrome/browser/prefs/DEPS index 3d650c4..ca72ca4 100644 --- a/chrome/browser/prefs/DEPS +++ b/chrome/browser/prefs/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+ash/components/account_manager", "+ash/components/audio", "+services/preferences/public/mojom", ]
diff --git a/chrome/browser/profiles/DEPS b/chrome/browser/profiles/DEPS index dbdc3fe9..b9055d4 100644 --- a/chrome/browser/profiles/DEPS +++ b/chrome/browser/profiles/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+ash/components/account_manager", "+components/live_caption:constants", "+components/profile_metrics", ]
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc index 3ceac6b..3128d5a8 100644 --- a/chrome/browser/profiles/profile_impl.cc +++ b/chrome/browser/profiles/profile_impl.cc
@@ -178,7 +178,6 @@ #include "ui/base/l10n/l10n_util.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/account_manager/account_manager_factory.h" #include "chrome/browser/app_mode/app_mode_utils.h" #include "chrome/browser/ash/account_manager/account_manager_util.h" #include "chrome/browser/ash/app_mode/app_launch_utils.h" @@ -194,6 +193,7 @@ #include "chrome/browser/ash/secure_channel/secure_channel_client_provider.h" #include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/signin/chrome_device_id_helper.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/session_manager/core/session_manager.h" #include "components/user_manager/user.h"
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js index 4cbb4ee..66bfdbc 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js
@@ -144,6 +144,13 @@ /** @private */ startDictation_() { this.active_ = true; + if (this.chromeVoxEnabled_) { + // Silence ChromeVox in case it was speaking. It can speak over the start + // tone and also cause a feedback loop if the user is not using + // headphones. This does not stop ChromeVox from speaking additional + // utterances added to the queue later. + chrome.accessibilityPrivate.silenceSpokenFeedback(); + } this.startTone_.play(); this.setStopTimeout_( Dictation.Timeouts.NO_FOCUSED_IME_MS,
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js index 72f035b..57ff2339 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js
@@ -237,3 +237,40 @@ await this.assertCommittedText('New line'); this.mockInputIme.clearLastParameters(); }); + +AX_TEST_F( + 'DictationE2ETest', 'SilencesSpokenFeedbackWhenStarting', async function() { + assertEquals( + 0, this.mockAccessibilityPrivate.getSpokenFeedbackSilencedCount()); + + // Turn on ChromeVox + await this.setPref(Dictation.SPOKEN_FEEDBACK_PREF, true); + // Wait for the callbacks to Dictation. + await this.getPref(Dictation.SPOKEN_FEEDBACK_PREF); + + // Now silenceSpokenFeedback should get called when toggling Dictation on. + this.toggleDictationOn(); + assertEquals( + 1, this.mockAccessibilityPrivate.getSpokenFeedbackSilencedCount()); + + // It should not be called when turning Dictation off. + this.toggleDictationOff(); + assertEquals( + 1, this.mockAccessibilityPrivate.getSpokenFeedbackSilencedCount()); + }); + +AX_TEST_F( + 'DictationE2ETest', 'DoesNotSilenceSpokenFeedbackUnnecessarily', + async function() { + assertEquals( + 0, this.mockAccessibilityPrivate.getSpokenFeedbackSilencedCount()); + + // Check that when ChromeVox is disabled we don't try to silence it when + // Dictation gets toggled. + this.toggleDictationOn(); + assertEquals( + 0, this.mockAccessibilityPrivate.getSpokenFeedbackSilencedCount()); + this.toggleDictationOff(); + assertEquals( + 0, this.mockAccessibilityPrivate.getSpokenFeedbackSilencedCount()); + });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn index 7f5a74d..c5d36be 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -20,7 +20,6 @@ # These files all use older Closure provide/require support for dependency management and will be transitioned to ES6 modules (see below). chromevox_modules = [ "../common/automation_predicate.js", - "../common/automation_util.js", "../common/constants.js", "../common/cursors/recovery_strategy.js", "../common/tree_walker.js", @@ -29,7 +28,6 @@ "common/abstract_earcons.js", "common/extension_bridge.js", "common/panel_menu_data.js", - "common/tree_dumper.js", "common/tts_interface.js", "injected/api_implementation.js", "injected/extension_bridge.js", @@ -41,6 +39,7 @@ # ES6 modules. chromevox_es6_modules = [ + "../common/automation_util.js", "../common/cursors/cursor.js", "../common/cursors/range.js", "../common/event_generator.js", @@ -139,6 +138,7 @@ "common/panel_bridge.js", "common/panel_command.js", "common/spannable.js", + "common/tree_dumper.js", "common/tts_base.js", "learn_mode/learn_mode.js", "log_page/log.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js index d3e995633..a3ac1b3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/auto_scroll_handler.js
@@ -5,6 +5,7 @@ /** * @fileoverview Handles auto scrolling on navigation. */ +import {AutomationUtil} from '../../common/automation_util.js'; import {CursorUnit} from '../../common/cursors/cursor.js'; import {CursorRange} from '../../common/cursors/range.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index ce08398..e173636a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {AutomationUtil} from '../../common/automation_util.js'; import {CursorRange} from '../../common/cursors/range.js'; import {InstanceChecker} from '../../common/instance_checker.js'; import {ExtensionBridge} from '../common/extension_bridge.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index 26b74da..c2576d4d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -15,6 +15,7 @@ async setUpDeferred() { await super.setUpDeferred(); + await importModule('AutomationUtil', '/common/automation_util.js'); await importModule( 'BackgroundKeyboardHandler', '/chromevox/background/keyboard_handler.js');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js index 7e380ef..f65f203 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -5,6 +5,7 @@ /** * @fileoverview ChromeVox commands. */ +import {AutomationUtil} from '../../common/automation_util.js'; import {Cursor, CursorUnit} from '../../common/cursors/cursor.js'; import {CursorRange} from '../../common/cursors/range.js'; import {EventGenerator} from '../../common/event_generator.js'; @@ -21,6 +22,7 @@ import {LogType} from '../common/log_types.js'; import {Msgs} from '../common/msgs.js'; import {PanelCommand, PanelCommandType} from '../common/panel_command.js'; +import {TreeDumper} from '../common/tree_dumper.js'; import {AutoScrollHandler} from './auto_scroll_handler.js'; import {BrailleBackground} from './braille/braille_background.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js index 6e8fe9a8..8e2a9c6f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
@@ -5,6 +5,7 @@ /** * @fileoverview Handles automation from a desktop automation node. */ +import {AutomationUtil} from '../../common/automation_util.js'; import {WrappingCursor} from '../../common/cursors/cursor.js'; import {CursorRange} from '../../common/cursors/range.js'; import {ChromeVoxEvent, CustomAutomationEvent} from '../common/custom_automation_event.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js index 8c462b4a..5c508ee9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
@@ -8,6 +8,7 @@ * (e.g. start/end offsets) get saved. Line: nodes/offsets at the beginning/end * of a line get saved. */ +import {AutomationUtil} from '../../../common/automation_util.js'; import {Cursor, CURSOR_NODE_INDEX, CursorMovement, CursorUnit} from '../../../common/cursors/cursor.js'; import {CursorRange} from '../../../common/cursors/range.js'; import {Spannable} from '../../common/spannable.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js index b9c31d34..fda3cc4 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
@@ -6,6 +6,7 @@ * @fileoverview Processes events related to editing text and emits the * appropriate spoken and braille feedback. */ +import {AutomationUtil} from '../../../common/automation_util.js'; import {Cursor, CursorMovement, CursorUnit} from '../../../common/cursors/cursor.js'; import {CursorRange} from '../../../common/cursors/range.js'; import {AbstractTts} from '../../common/abstract_tts.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js index 9ae71db..5510ff25 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js
@@ -6,6 +6,7 @@ * @fileoverview Handles automation intents for speech feedback. * Braille is *not* handled in this module. */ +import {AutomationUtil} from '../../../common/automation_util.js'; import {CursorRange} from '../../../common/cursors/range.js'; import {Output} from '../output/output.js'; import {OutputRoleInfo} from '../output/output_role_info.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js index 5b9ad2e..a1625575 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js
@@ -5,6 +5,7 @@ /** * @fileoverview Implements support for live regions in ChromeVox Next. */ +import {AutomationUtil} from '../../common/automation_util.js'; import {CursorRange} from '../../common/cursors/range.js'; import {ChromeVoxState} from './chromevox_state.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js index d9614b8..e69beae 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -10,13 +10,11 @@ goog.require('AncestryRecoveryStrategy'); goog.require('AutomationPredicate'); goog.require('AutomationTreeWalker'); -goog.require('AutomationUtil'); goog.require('JaPhoneticData'); goog.require('PanelNodeMenuData'); goog.require('PanelTabMenuItemData'); goog.require('QueueMode'); goog.require('RecoveryStrategy'); -goog.require('TreeDumper'); goog.require('TreePathRecoveryStrategy'); goog.require('TtsCategory'); goog.require('TtsInterface');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js index 64c37cd1..abc248d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js
@@ -9,6 +9,7 @@ import {BridgeConstants} from '../../common/bridge_constants.js'; import {BridgeHelper} from '../../common/bridge_helper.js'; import {BaseLog, LogType, TextLog, TreeLog} from '../../common/log_types.js'; +import {TreeDumper} from '../../common/tree_dumper.js'; export class LogStore { constructor() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js index b643516..008638db 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -5,6 +5,7 @@ /** * @fileoverview Provides output services for ChromeVox. */ +import {AutomationUtil} from '../../../common/automation_util.js'; import {Cursor, CURSOR_NODE_INDEX} from '../../../common/cursors/cursor.js'; import {CursorRange} from '../../../common/cursors/range.js'; import {NavBraille} from '../../common/braille/nav_braille.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_ancestry_info.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_ancestry_info.js index 90d4fd3..1a3a9b3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_ancestry_info.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_ancestry_info.js
@@ -6,6 +6,8 @@ * @fileoverview Provides a class which computes various types of ancestor * chains given the current node. */ +import {AutomationUtil} from '../../../common/automation_util.js'; + import {OutputRoleInfo} from './output_role_info.js'; import {OutputContextOrder} from './output_types.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js index 6b37e01..2e2de0b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js
@@ -109,6 +109,7 @@ ['OutputEarconAction', 'OutputNodeSpan', 'OutputSelectionSpan'], '/chromevox/background/output/output_types.js'); await importModule('Msgs', '/chromevox/common/msgs.js'); + await importModule('AutomationUtil', '/common/automation_util.js'); window.Dir = AutomationUtil.Dir; this.forceContextualLastOutput();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js index 787ebf8..5321c25e6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_types.js
@@ -106,12 +106,12 @@ /** * Wrapper for automation nodes as annotations. Since the - * {@code AutomationNode} constructor isn't exposed in the API, this class is - * used to allow instanceof checks on these annotations. + * {@code chrome.automation.AutomationNode} constructor isn't exposed in the + * API, this class is used to allow instanceof checks on these annotations. */ export class OutputNodeSpan { /** - * @param {!AutomationNode} node + * @param {!chrome.automation.AutomationNode} node * @param {number=} opt_offset Offsets into the node's text. Defaults to 0. */ constructor(node, opt_offset) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js index 1e4aa4252..ea5a6b2 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
@@ -5,6 +5,7 @@ /** * @fileoverview Handles page loading sounds based on automation events. */ +import {AutomationUtil} from '../../common/automation_util.js'; import {ChromeVoxEvent} from '../common/custom_automation_event.js'; import {BaseAutomationHandler} from './base_automation_handler.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search.js index 78fb412..ce3d9894 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/i_search.js
@@ -5,6 +5,7 @@ /** * @fileoverview The logic behind incremental search. */ +import {AutomationUtil} from '../../../common/automation_util.js'; import {Cursor} from '../../../common/cursors/cursor.js'; import {ISearchHandler} from './i_search_handler.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js index 8f28adc..f5b2d485 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js
@@ -6,6 +6,7 @@ * @fileoverview Calculates the menu items for the node menus in the ChromeVox * panel. */ +import {AutomationUtil} from '../../../common/automation_util.js'; import {CursorRange} from '../../../common/cursors/range.js'; import {Msgs} from '../../common/msgs.js'; import {PanelBridge} from '../../common/panel_bridge.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/pointer_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/pointer_handler.js index dae25cb6..1dddb28 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/pointer_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/pointer_handler.js
@@ -15,6 +15,7 @@ import {DesktopAutomationInterface} from './desktop_automation_interface.js'; import {Output} from './output/output.js'; +const AutomationNode = chrome.automation.AutomationNode; const AutomationEvent = chrome.automation.AutomationEvent; const EventType = chrome.automation.EventType; const RoleType = chrome.automation.RoleType;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js index 9c38219..022ced15 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
@@ -5,6 +5,7 @@ /** * @fileoverview Handles automation from ChromeVox's current range. */ +import {AutomationUtil} from '../../common/automation_util.js'; import {CursorRange} from '../../common/cursors/range.js'; import {ChromeVoxEvent, CustomAutomationEvent} from '../common/custom_automation_event.js'; import {Msgs} from '../common/msgs.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js index 430c0549..a6bbee2 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/smart_sticky_mode.js
@@ -7,6 +7,7 @@ * when the current range is over an editable; restores sticky mode when not on * an editable. */ +import {AutomationUtil} from '../../common/automation_util.js'; import {CursorRange} from '../../common/cursors/range.js'; import {ChromeVox} from './chromevox.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js index 13e3e637..86b6e405 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js
@@ -48,7 +48,8 @@ /** * Computes |this.currentLocale_| and |outputString|, and returns them. * @param {string} text - * @param {AutomationNode} contextNode The AutomationNode that owns |text|. + * @param {chrome.automation.AutomationNode} contextNode The AutomationNode + * that owns |text|. * @return {!{text: string, locale: string}} */ computeTextAndLocale(text, contextNode) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js index 341480f..6c1a0a49 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js
@@ -6,6 +6,8 @@ * @fileoverview Class definitions of log that are stored in LogStore */ +import {TreeDumper} from './tree_dumper.js'; + /** * List of all types of logs supported. * Note that filter type checkboxes are shown in this order at the log page.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/tree_dumper.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/tree_dumper.js index a008721..b888859 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/tree_dumper.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/tree_dumper.js
@@ -6,12 +6,9 @@ * @fileoverview Dumps a log of the accessibility tree. */ -goog.provide('SimpleAutomationNode'); -goog.provide('TreeDumper'); - const AutomationNode = chrome.automation.AutomationNode; -SimpleAutomationNode = class { +class SimpleAutomationNode { /** * @param {!AutomationNode} node */ @@ -57,14 +54,14 @@ return this.logStr; }; } -}; +} /** * Structure of accessibility tree. * This constructor will traverse whole tree to save the tree structure. * This should only be called when the user intended to do so. */ -TreeDumper = class { +export class TreeDumper { /** * @param {!AutomationNode} root */ @@ -116,4 +113,4 @@ const treeStr = this.createTreeRecursive_(this.rootNode, 0); return treeStr; } -}; +}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js index 941f1cac..b51373f1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js
@@ -8,4 +8,3 @@ */ goog.require('QueueMode'); -goog.require('TreeDumper');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js index 7daffde9..f8cd523e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
@@ -10,7 +10,6 @@ goog.require('BluetoothBrailleDisplayListener'); goog.require('BluetoothBrailleDisplayManager'); goog.require('QueueMode'); -goog.require('TreeDumper'); goog.require('TtsInterface'); goog.require('constants');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js index f35083d6..2ceea5b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
@@ -9,13 +9,11 @@ goog.require('AncestryRecoveryStrategy'); goog.require('AutomationPredicate'); goog.require('AutomationTreeWalker'); -goog.require('AutomationUtil'); goog.require('EarconDescription'); goog.require('PanelNodeMenuData'); goog.require('PanelNodeMenuItemData'); goog.require('QueueMode'); goog.require('RecoveryStrategy'); -goog.require('TreeDumper'); goog.require('TtsCategory'); goog.require('constants');
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_util.js b/chrome/browser/resources/chromeos/accessibility/common/automation_util.js index 6f87556..77e9304 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_util.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_util.js
@@ -6,18 +6,10 @@ * @fileoverview ChromeVox utilities for the automation extension API. */ -goog.provide('AutomationUtil'); - -goog.require('AutomationPredicate'); -goog.require('AutomationTreeWalker'); -goog.require('constants'); - -goog.scope(function() { const AutomationNode = chrome.automation.AutomationNode; -const Dir = constants.Dir; const RoleType = chrome.automation.RoleType; -AutomationUtil = class { +export class AutomationUtil { constructor() {} /** @@ -25,7 +17,7 @@ * traversal. * @param {AutomationNode} cur Node to begin the search * from. - * @param {Dir} dir + * @param {constants.Dir} dir * @param {AutomationPredicate.Unary} pred A predicate to apply * to a candidate node. * @return {AutomationNode} @@ -39,13 +31,14 @@ return cur; } - let child = dir === Dir.BACKWARD ? cur.lastChild : cur.firstChild; + let child = dir === constants.Dir.BACKWARD ? cur.lastChild : cur.firstChild; while (child) { const ret = AutomationUtil.findNodePre(child, dir, pred); if (ret) { return ret; } - child = dir === Dir.BACKWARD ? child.previousSibling : child.nextSibling; + child = dir === constants.Dir.BACKWARD ? child.previousSibling : + child.nextSibling; } return null; } @@ -55,7 +48,7 @@ * traversal. * @param {AutomationNode} cur Node to begin the search * from. - * @param {Dir} dir + * @param {constants.Dir} dir * @param {AutomationPredicate.Unary} pred A predicate to apply * to a candidate node. * @return {AutomationNode} @@ -65,13 +58,14 @@ return null; } - let child = dir === Dir.BACKWARD ? cur.lastChild : cur.firstChild; + let child = dir === constants.Dir.BACKWARD ? cur.lastChild : cur.firstChild; while (child) { const ret = AutomationUtil.findNodePost(child, dir, pred); if (ret) { return ret; } - child = dir === Dir.BACKWARD ? child.previousSibling : child.nextSibling; + child = dir === constants.Dir.BACKWARD ? child.previousSibling : + child.nextSibling; } if (pred(cur) && !AutomationPredicate.shouldIgnoreNode(cur)) { @@ -92,7 +86,7 @@ * from F. * @param {!AutomationNode} cur Node to begin the search * from. - * @param {Dir} dir + * @param {constants.Dir} dir * @param {AutomationPredicate.Unary} pred A predicate to apply * to a candidate node. * @param {AutomationTreeWalkerRestriction=} opt_restrictions |leaf|, |root|, @@ -122,7 +116,7 @@ * from F. * @param {!AutomationNode} cur Node to begin the search * from. - * @param {Dir} dir + * @param {constants.Dir} dir * @param {AutomationPredicate.Unary} pred A predicate to apply * to a candidate node. * @param {AutomationTreeWalkerRestriction=} opt_restrictions |leaf|, |root|, @@ -152,7 +146,7 @@ * |pred| to a_i and a_(i - 1) until |pred| is satisfied. Returns a_(i - 1) * or a_i (depending on opt_before) or null if no match was found. * @param {!AutomationNode} cur - * @param {Dir} dir + * @param {constants.Dir} dir * @param {AutomationPredicate.Binary} pred * @param {boolean=} opt_before True to return a_(i - 1); a_i otherwise. * Defaults to false. @@ -238,16 +232,16 @@ * document. * @param {!AutomationNode} nodeA * @param {!AutomationNode} nodeB - * @return {Dir} + * @return {constants.Dir} */ static getDirection(nodeA, nodeB) { const ancestorsA = AutomationUtil.getAncestors(nodeA); const ancestorsB = AutomationUtil.getAncestors(nodeB); const divergence = AutomationUtil.getDivergence(ancestorsA, ancestorsB); - // Default to Dir.FORWARD. + // Default to constants.Dir.FORWARD. if (divergence === -1) { - return Dir.FORWARD; + return constants.Dir.FORWARD; } const divA = ancestorsA[divergence]; @@ -258,20 +252,20 @@ // nodeB. nodeA > nodeB if nodeB is a descendant of nodeA. if (!divA) { - return Dir.FORWARD; + return constants.Dir.FORWARD; } if (!divB) { - return Dir.BACKWARD; + return constants.Dir.BACKWARD; } if (divA.parent === nodeB) { - return Dir.BACKWARD; + return constants.Dir.BACKWARD; } if (divB.parent === nodeA) { - return Dir.FORWARD; + return constants.Dir.FORWARD; } - return divA.indexInParent <= divB.indexInParent ? Dir.FORWARD : - Dir.BACKWARD; + return divA.indexInParent <= divB.indexInParent ? constants.Dir.FORWARD : + constants.Dir.BACKWARD; } /** @@ -453,16 +447,17 @@ if (shallowest) { return shallowest; } - } while (node = AutomationUtil.findNextNode(node, Dir.BACKWARD, pred)); + } while ( + node = AutomationUtil.findNextNode(node, constants.Dir.BACKWARD, pred)); return null; } -}; +} /** * @param {!AutomationNode} cur Node to begin the search * from. - * @param {Dir} dir + * @param {constants.Dir} dir * @param {AutomationPredicate.Unary} pred A predicate to apply * to a candidate node. * @param {AutomationTreeWalkerRestriction=} opt_restrictions |leaf|, |root|, @@ -495,5 +490,3 @@ return new AutomationTreeWalker(cur, dir, restrictions); } - -}); // goog.scope
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js b/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js index 1e1339dc..c9107ca2 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_util_test.js
@@ -18,6 +18,7 @@ async setUpDeferred() { await super.setUpDeferred(); await importModule('RectUtil', '/common/rect_util.js'); + await importModule('AutomationUtil', '/common/automation_util.js'); window.Dir = constants.Dir; window.RoleType = chrome.automation.RoleType;
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js index 18f6531..ad5fb51 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.js
@@ -13,6 +13,7 @@ const StateType = chrome.automation.StateType; import {StringUtil} from '../string_util.js'; +import {AutomationUtil} from '../automation_util.js'; /** * The special index that represents a cursor pointing to a node without
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js index d64318d..c1f50e1c 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js
@@ -40,6 +40,8 @@ await importModule( ['Cursor', 'CursorMovement', 'CursorUnit', 'WrappingCursor'], '/common/cursors/cursor.js'); + + await importModule('AutomationUtil', '/common/automation_util.js'); // Various aliases window.CHARACTER = CursorUnit.CHARACTER; window.WORD = CursorUnit.WORD;
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js b/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js index ba4b3d9..038c559 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/range.js
@@ -7,6 +7,8 @@ * the automation tree. */ +import {AutomationUtil} from '../automation_util.js'; + import {Cursor, CURSOR_NODE_INDEX, CursorMovement, CursorUnit, WrappingCursor} from './cursor.js'; const AutomationNode = chrome.automation.AutomationNode;
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js index 146389b..3b3d9679 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/mock_accessibility_private.js
@@ -83,6 +83,9 @@ /** @private {Set<string>} */ enabledFeatures_: new Set(), + /** @private {number} */ + spokenFeedbackSilenceCount_: 0, + // Methods from AccessibilityPrivate API. // onScrollableBoundsForPointRequested: { @@ -356,6 +359,16 @@ return MockAccessibilityPrivate.dictationBubbleProps_; }, + /** Simulates silencing ChromeVox */ + silenceSpokenFeedback() { + this.spokenFeedbackSilenceCount_++; + }, + + /** @return {number} */ + getSpokenFeedbackSilencedCount() { + return this.spokenFeedbackSilenceCount_; + }, + /** * Enables or disables a feature for testing, causing * MockAccessibilityPrivate.isFeatureEnabled to consider it enabled.
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/background.html b/chrome/browser/resources/chromeos/accessibility/select_to_speak/background.html index 159e263..f66164f8 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/background.html +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/background.html
@@ -2,7 +2,6 @@ <script src="/common/closure_shim.js"></script> <script src="/common/constants.js"></script> <script src="/common/automation_predicate.js"></script> -<script src="/common/automation_util.js"></script> <script src="/common/tree_walker.js"></script> <!-- Module entrypoint. -->
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils.js index b25c2162..f2990fa7 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_navigation_utils.js
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {AutomationUtil} from '../common/automation_util.js'; + import {NodeUtils} from './node_utils.js'; import {ParagraphUtils} from './paragraph_utils.js'; import {SentenceUtils} from './sentence_utils.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js index 06b6225..0cb9b069 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {AutomationUtil} from '../common/automation_util.js'; import {RectUtil} from '../common/rect_util.js'; import {ParagraphUtils} from './paragraph_utils.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js index 9373bb4..fe4abaa 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak.js
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {AutomationUtil} from '../common/automation_util.js'; + import {InputHandler} from './input_handler.js'; import {MetricsUtils} from './metrics_utils.js'; import {NodeNavigationUtils} from './node_navigation_utils.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js index 61e8402..c4f2c52e8 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_navigation_control_test.js
@@ -34,6 +34,7 @@ await importModule( 'SelectToSpeakConstants', '/select_to_speak/select_to_speak_constants.js'); + await importModule('AutomationUtil', '/common/automation_util.js'); selectToSpeak.prefsManager_.enhancedVoicesDialogShown_ = true; }
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/ui_manager.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/ui_manager.js index 09dce81..6756044 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/ui_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/ui_manager.js
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {AutomationUtil} from '../common/automation_util.js'; + import {ParagraphUtils} from './paragraph_utils.js'; import {PrefsManager} from './prefs_manager.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/background.html b/chrome/browser/resources/chromeos/accessibility/switch_access/background.html index d333ea0..aadd086 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/background.html +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/background.html
@@ -2,7 +2,6 @@ <script src="/common/closure_shim.js"></script> <script src="/common/constants.js"></script> <script src="/common/automation_predicate.js"></script> -<script src="/common/automation_util.js"></script> <script src="/common/event_handler.js"></script> <script src="/common/repeated_event_handler.js"></script> <script src="/common/repeated_tree_change_handler.js"></script>
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js index df6ab389..423b623 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {AutomationUtil} from '../common/automation_util.js'; import {EventGenerator} from '../common/event_generator.js'; import {RectUtil} from '../common/rect_util.js';
diff --git a/chrome/browser/resources/component_extension_resources.grd b/chrome/browser/resources/component_extension_resources.grd index 38912a3e..9f73a001 100644 --- a/chrome/browser/resources/component_extension_resources.grd +++ b/chrome/browser/resources/component_extension_resources.grd
@@ -26,7 +26,7 @@ </if> <!-- Contact Center Insights extension, enabled on managed ChromeOS devices --> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <include name="IDR_CONTACT_CENTER_INSIGHTS_BACKGROUND_JS" file="chromeos/contact_center_insights/background.js" type="BINDATA" /> <include name="IDR_CONTACT_CENTER_INSIGHTS_BACKGROUND_WRAPPER_JS" file="chromeos/contact_center_insights/background_wrapper.js" type="BINDATA" /> <!-- Generated dependency bundle used by the extension for reporting purposes -->
diff --git a/chrome/browser/resources/components/components.ts b/chrome/browser/resources/components/components.ts index e3351ca..cf2b2d2 100644 --- a/chrome/browser/resources/components/components.ts +++ b/chrome/browser/resources/components/components.ts
@@ -55,7 +55,7 @@ jstProcess(input, output); output.removeAttribute('hidden'); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> const crosUrlRedirectButton = $('os-link-href'); if (crosUrlRedirectButton) { crosUrlRedirectButton.onclick = crosUrlComponentRedirect; @@ -63,7 +63,7 @@ // </if> } -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> /** * Called when the user clicks on the os-link-href button. */
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/DIR_METADATA b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/DIR_METADATA new file mode 100644 index 0000000..5a353a5 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "UI>Shell>Notifications" +}
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/OWNERS b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/OWNERS new file mode 100644 index 0000000..9743938 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/OWNERS
@@ -0,0 +1 @@ +newcomer@chromium.org
diff --git a/chrome/browser/resources/settings/languages_page/translate_page.html b/chrome/browser/resources/settings/languages_page/translate_page.html index d284493e..c85bf67 100644 --- a/chrome/browser/resources/settings/languages_page/translate_page.html +++ b/chrome/browser/resources/settings/languages_page/translate_page.html
@@ -1,54 +1,59 @@ <style include="cr-shared-style settings-shared iron-flex"></style> <settings-toggle-button id="offerTranslateOtherLanguages" - pref="{{prefs.translate.enabled}}" label="$i18n{offerToEnableTranslate}" + pref="{{prefs.translate.enabled}}" + label="$i18n{offerToEnableTranslate}" + sub-label="$i18n{offerToEnableTranslateSublabel}" on-settings-boolean-control-change="onTranslateToggleChange_"> </settings-toggle-button> -<div class="cr-row continuation"> - <h2 class="flex">$i18n{automaticallyTranslateLanguages}</h2> - <cr-button id="addAlwaysTranslate" class="header-aligned-button" - on-click="onAddAlwaysTranslateLanguagesClick_"> - $i18n{addLanguages} - </cr-button> -</div> -<div class="list-frame"> - <div id="alwaysTranslateList" class="vertical-list"> - <template is="dom-repeat" items="[[languages.alwaysTranslate]]"> - <div class="list-item"> - <div class="start cr-padded-text">[[item.displayName]]</div> - <cr-icon-button class="icon-delete-gray" - on-click="onRemoveAlwaysTranslateLanguageClick_"> - </cr-icon-button> - </div> - </template> +<iron-collapse id="spellCheckCollapse" + opened="[[prefs.translate.enabled.value]]"> + <div class="cr-row continuation"> + <h2 class="flex">$i18n{automaticallyTranslateLanguages}</h2> + <cr-button id="addAlwaysTranslate" class="header-aligned-button" + on-click="onAddAlwaysTranslateLanguagesClick_"> + $i18n{addLanguages} + </cr-button> </div> - <div id="noAlwaysTranslateLabel" class="list-item" - hidden$="[[hasSome_(languages.alwaysTranslate)]]"> - $i18n{noLanguagesAdded} + <div class="list-frame"> + <div id="alwaysTranslateList" class="vertical-list"> + <template is="dom-repeat" items="[[languages.alwaysTranslate]]"> + <div class="list-item"> + <div class="start cr-padded-text">[[item.displayName]]</div> + <cr-icon-button class="icon-delete-gray" + on-click="onRemoveAlwaysTranslateLanguageClick_"> + </cr-icon-button> + </div> + </template> + </div> + <div id="noAlwaysTranslateLabel" class="list-item" + hidden$="[[hasSome_(languages.alwaysTranslate)]]"> + $i18n{noLanguagesAdded} + </div> </div> -</div> -<div class="cr-row continuation"> - <h2 class="flex">$i18n{neverTranslateLanguages}</h2> - <cr-button id="addNeverTranslate" class="header-aligned-button" - on-click="onAddNeverTranslateLanguagesClick_"> - $i18n{addLanguages} - </cr-button> -</div> -<div class="list-frame"> - <div id="neverTranslateList" class="vertical-list"> - <template is="dom-repeat" items="[[languages.neverTranslate]]"> - <div class="list-item"> - <div class="start cr-padded-text">[[item.displayName]]</div> - <cr-icon-button class="icon-delete-gray" value="[[item.code]]" - on-click="onRemoveNeverTranslateLanguageClick_"> - </cr-icon-button> - </div> - </template> + <div class="cr-row continuation"> + <h2 class="flex">$i18n{neverTranslateLanguages}</h2> + <cr-button id="addNeverTranslate" class="header-aligned-button" + on-click="onAddNeverTranslateLanguagesClick_"> + $i18n{addLanguages} + </cr-button> </div> - <div id="noNeverTranslateLabel" class="list-item" - hidden$="[[hasSome_(languages.neverTranslate)]]"> - $i18n{noLanguagesAdded} + <div class="list-frame"> + <div id="neverTranslateList" class="vertical-list"> + <template is="dom-repeat" items="[[languages.neverTranslate]]"> + <div class="list-item"> + <div class="start cr-padded-text">[[item.displayName]]</div> + <cr-icon-button class="icon-delete-gray" value="[[item.code]]" + on-click="onRemoveNeverTranslateLanguageClick_"> + </cr-icon-button> + </div> + </template> + </div> + <div id="noNeverTranslateLabel" class="list-item" + hidden$="[[hasSome_(languages.neverTranslate)]]"> + $i18n{noLanguagesAdded} + </div> </div> -</div> +</iron-collapse> <template is="dom-if" if="[[showAddAlwaysTranslateDialog_]]" restamp> <settings-add-languages-dialog languages="[[addLanguagesDialogLanguages_]]" id="alwaysTranslateDialog" on-close="onAlwaysTranslateDialogClose_"
diff --git a/chrome/browser/resources/settings/languages_page/translate_page.ts b/chrome/browser/resources/settings/languages_page/translate_page.ts index cf5a890..3275a0f 100644 --- a/chrome/browser/resources/settings/languages_page/translate_page.ts +++ b/chrome/browser/resources/settings/languages_page/translate_page.ts
@@ -12,6 +12,7 @@ import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; +import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js'; import './add_languages_dialog.js'; import './languages.js'; import '../controls/settings_toggle_button.js';
diff --git a/chrome/browser/resources/signin/signin_shared.css b/chrome/browser/resources/signin/signin_shared.css index 6cb6924d..4ed4c3f 100644 --- a/chrome/browser/resources/signin/signin_shared.css +++ b/chrome/browser/resources/signin/signin_shared.css
@@ -37,7 +37,7 @@ margin-inline-start: 8px; } -<if expr="is_macosx or is_linux or chromeos_ash or chromeos_lacros"> +<if expr="is_macosx or is_linux or is_chromeos"> .action-container { flex-flow: row-reverse; justify-content: flex-start;
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index 1f41d68c..c7833a5 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -602,7 +602,15 @@ EXPECT_EQ(Browser::TYPE_POPUP, active_browser_list_->get(1)->type()); } -IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreIndividualTabFromWindow) { +// Flaky on Mac. https://crbug.com/1334914. +#if BUILDFLAG(IS_MAC) +#define MAYBE_RestoreIndividualTabFromWindow \ + DISABLED_RestoreIndividualTabFromWindow +#else +#define MAYBE_RestoreIndividualTabFromWindow RestoreIndividualTabFromWindow +#endif +IN_PROC_BROWSER_TEST_F(SessionRestoreTest, + MAYBE_RestoreIndividualTabFromWindow) { GURL url1(ui_test_utils::GetTestUrl( base::FilePath(base::FilePath::kCurrentDirectory), base::FilePath(FILE_PATH_LITERAL("title1.html")))); @@ -683,7 +691,8 @@ } // Flaky on Linux. https://crbug.com/537592. -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +// Flaky on Mac. https://crbug.com/1334914. +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) #define MAYBE_WindowWithOneTab DISABLED_WindowWithOneTab #else #define MAYBE_WindowWithOneTab WindowWithOneTab
diff --git a/chrome/browser/signin/DEPS b/chrome/browser/signin/DEPS deleted file mode 100644 index e2cc84f..0000000 --- a/chrome/browser/signin/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+ash/components/account_manager", -]
diff --git a/chrome/browser/signin/identity_test_environment_profile_adaptor.cc b/chrome/browser/signin/identity_test_environment_profile_adaptor.cc index 16a7474..056d013 100644 --- a/chrome/browser/signin/identity_test_environment_profile_adaptor.cc +++ b/chrome/browser/signin/identity_test_environment_profile_adaptor.cc
@@ -10,9 +10,9 @@ #include "chrome/browser/signin/identity_manager_factory.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/account_manager/account_manager_factory.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h" #endif
diff --git a/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc b/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc index a157e05..c32c9aa7 100644 --- a/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc +++ b/chrome/browser/site_isolation/site_per_process_text_input_browsertest.cc
@@ -1173,7 +1173,7 @@ EXPECT_EQ(child, web_contents->GetFocusedFrame()); // Generate a couple of keystrokes, which will be routed to the subframe. - content::DOMMessageQueue msg_queue; + content::DOMMessageQueue msg_queue(web_contents); std::string reply; SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('1'), ui::DomCode::DIGIT1, ui::VKEY_1, false, false, false, false);
diff --git a/chrome/browser/speech/tts_ash.cc b/chrome/browser/speech/tts_ash.cc index 484c779..08f5d8a 100644 --- a/chrome/browser/speech/tts_ash.cc +++ b/chrome/browser/speech/tts_ash.cc
@@ -51,6 +51,17 @@ if (from_primary_profile) primary_profile_browser_context_id_ = browser_context_id; + // Note: This is a temporary workaround for enabling Lacros tts support in ash + // when running Lacros tts extension api lacros browser tests. + // TODO(crbug.com/1227543): Migrate to enable tts lacros support feature flag + // in Ash before running lacros browser tests once the Lacros testing + // infrasture adds that support. + if (!tts_crosapi_util::ShouldEnableLacrosTtsSupport()) { + // This code path is only called when running lacros browser tests. + content::TtsController::GetInstance()->SetRemoteTtsEngineDelegate( + CrosapiTtsEngineDelegateAsh::GetInstance()); + } + mojo::Remote<mojom::TtsClient> remote(std::move(client)); remote.set_disconnect_handler(base::BindOnce(&TtsAsh::TtsClientDisconnected, weak_ptr_factory_.GetWeakPtr(), @@ -60,9 +71,11 @@ void TtsAsh::VoicesChanged(const base::UnguessableToken& browser_context_id, std::vector<mojom::TtsVoicePtr> lacros_voices) { + if (!HasTtsClient()) + return; + // TODO(crbug.com/1251979): Support secondary profile. - DCHECK(HasTtsClient() && - browser_context_id == primary_profile_browser_context_id_); + DCHECK(browser_context_id == primary_profile_browser_context_id_); std::vector<content::VoiceData> voices; for (const auto& mojo_voice : lacros_voices)
diff --git a/chrome/browser/support_tool/ash/network_routes_data_collector_unittest.cc b/chrome/browser/support_tool/ash/network_routes_data_collector_unittest.cc index b86601c..5e9de76 100644 --- a/chrome/browser/support_tool/ash/network_routes_data_collector_unittest.cc +++ b/chrome/browser/support_tool/ash/network_routes_data_collector_unittest.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/support_tool/data_collector.h" #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h" #include "chromeos/ash/components/dbus/debug_daemon/fake_debug_daemon_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "components/feedback/pii_types.h" #include "components/feedback/redaction_tool.h" #include "testing/gmock/include/gmock/gmock-matchers.h" @@ -171,7 +170,6 @@ void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - chromeos::DBusThreadManager::Initialize(); ash::DebugDaemonClient::InitializeFake(); static_cast<ash::FakeDebugDaemonClient*>(ash::DebugDaemonClient::Get()) ->SetRoutesForTesting(fake_routes); @@ -183,7 +181,6 @@ EXPECT_TRUE(temp_dir_.Delete()); ash::DebugDaemonClient::Shutdown(); - chromeos::DBusThreadManager::Shutdown(); } protected:
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc index 3f4b166..7cebcba0 100644 --- a/chrome/browser/sync/chrome_sync_client.cc +++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -40,9 +40,6 @@ #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/themes/theme_syncable_service.h" #include "chrome/browser/ui/read_later/reading_list_model_factory.h" -#include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/browser/web_applications/web_app_sync_bridge.h" -#include "chrome/browser/web_applications/web_app_utils.h" #include "chrome/browser/web_data_service_factory.h" #include "chrome/common/buildflags.h" #include "chrome/common/channel_info.h" @@ -97,6 +94,9 @@ #include "chrome/browser/extensions/extension_sync_service.h" #include "chrome/browser/sync/glue/extension_model_type_controller.h" #include "chrome/browser/sync/glue/extension_setting_model_type_controller.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/browser/web_applications/web_app_sync_bridge.h" +#include "chrome/browser/web_applications/web_app_utils.h" #endif // BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
diff --git a/chrome/browser/sync/test/integration/DEPS b/chrome/browser/sync/test/integration/DEPS index 83d9e1a..7ed32be7 100644 --- a/chrome/browser/sync/test/integration/DEPS +++ b/chrome/browser/sync/test/integration/DEPS
@@ -1,7 +1,3 @@ -include_rules = [ - "+ash/components/account_manager", -] - specific_include_rules = { "two_client_web_apps_integration_test_base.h": [ "+chrome/browser/ui/views",
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index 5563e496..e32a96d 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -99,7 +99,6 @@ #include "url/url_constants.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/components/arc/test/arc_util_test_support.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" @@ -107,6 +106,7 @@ #include "chrome/browser/sync/test/integration/sync_arc_package_helper.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs_factory.h" #include "chrome/browser/ui/app_list/test/fake_app_list_model_updater.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/chromeos/account_manager.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 55e7b2c2..f3cbdc5 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -993,6 +993,8 @@ "bookmarks/bookmark_utils_desktop.h", "bookmarks/recently_used_folders_combo_model.cc", "bookmarks/recently_used_folders_combo_model.h", + "bookmarks/test_bookmark_navigation_wrapper.cc", + "bookmarks/test_bookmark_navigation_wrapper.h", "breadcrumb_manager_browser_agent.cc", "breadcrumb_manager_browser_agent.h", "browser.cc", @@ -3033,7 +3035,6 @@ "//ash/app_list", "//ash/assistant/model", "//ash/assistant/util", - "//ash/components/account_manager", "//ash/components/arc", "//ash/components/arc/video_accelerator:protected_native_pixmap_query_client", "//ash/components/audio", @@ -3149,6 +3150,7 @@ "//chrome/browser/web_applications", "//chrome/browser/webshare:storage", "//chrome/services/file_util/public/cpp", + "//chromeos/ash/components/account_manager", "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/audio", "//chromeos/ash/components/dbus/cryptohome",
diff --git a/chrome/browser/ui/android/management/OWNERS b/chrome/browser/ui/android/management/OWNERS index d762639..c89eeeb 100644 --- a/chrome/browser/ui/android/management/OWNERS +++ b/chrome/browser/ui/android/management/OWNERS
@@ -1,2 +1 @@ ftirelo@chromium.org -ogastorga@chromium.org
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn index fa395f8..9d84cbd 100644 --- a/chrome/browser/ui/android/omnibox/BUILD.gn +++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -59,6 +59,7 @@ "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/CachedZeroSuggestionsManager.java", + "java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemProcessor.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfo.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java", @@ -140,6 +141,7 @@ "//base:jni_java", "//build/android:build_java", "//chrome/browser/android/lifecycle:java", + "//chrome/browser/back_press/android:java", "//chrome/browser/browser_controls/android:java", "//chrome/browser/commerce/merchant_viewer/android:java", "//chrome/browser/device:java",
diff --git a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml index 958bb7c..33fc3fd 100644 --- a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml +++ b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
@@ -49,6 +49,7 @@ <dimen name="omnibox_suggestion_compact_height">48dp</dimen> <dimen name="omnibox_suggestion_semicompact_padding">8dp</dimen> <dimen name="omnibox_suggestion_compact_padding">6dp</dimen> + <dimen name="omnibox_suggestion_list_padding_side">16dp</dimen> <dimen name="omnibox_suggestion_list_padding_bottom">8dp</dimen> <dimen name="omnibox_suggestion_start_offset_without_icon">18dp</dimen> <dimen name="omnibox_carousel_suggestion_padding">12dp</dimen> @@ -71,6 +72,11 @@ <dimen name="omnibox_suggestion_refine_view_modern_end_padding">4dp</dimen> <dimen name="omnibox_suggestion_carousel_spacing_maximum">8dp</dimen> + <dimen name="omnibox_suggestion_bg_elevation">@dimen/default_elevation_1</dimen> + <dimen name="omnibox_suggestion_bg_round_corner_radius">16dp</dimen> + <dimen name="omnibox_suggestion_bg_rectangle_corner_radius">0dp</dimen> + <dimen name="omnibox_suggestion_vertical_spacing">2dp</dimen> + <!-- Adding search engine logo to the omnibox. --> <!-- Max size which will fit completely in the composed/rounded bg. --> <dimen name="omnibox_search_engine_logo_favicon_size">17dp</dimen>
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 1ac7e25a..15a4d0a 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
@@ -21,6 +21,7 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.lens.LensController; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; @@ -45,6 +46,7 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; import org.chromium.chrome.browser.tabmodel.TabWindowManager; +import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.base.DeviceFormFactor; @@ -123,7 +125,6 @@ * @param searchEngineLogoUtils Utils to query the state of the search engine logos feature. * @param launchAssistanceSettingsAction Runnable launching settings for voice assistance. * @param pageInfoAction Displays page info popup. - * @param spareRendererCallback Callback to warm up a spare renderer. * @param bringTabToFrontCallback Callback to bring the browser foreground and switch to a tab. * @param saveOfflineButtonState Whether the 'save offline' button should be enabled. * @param omniboxUma Interface for logging UMA histogram. @@ -135,6 +136,7 @@ * MerchantTrustSignalsCoordinator}. Can be null if a store icon shouldn't be shown, * such as when called from a search activity. * @param reportExceptionCallback A {@link Callback} to report exceptions. + * @param backPressManager The {@link BackPressManager} for intercepting back press. */ public LocationBarCoordinator(View locationBarLayout, View autocompleteAnchorView, ObservableSupplier<Profile> profileObservableSupplier, @@ -158,7 +160,8 @@ merchantTrustSignalsCoordinatorSupplier, @NonNull OmniboxPedalDelegate omniboxPedalDelegate, BrowserStateBrowserControlsVisibilityDelegate browserControlsVisibilityDelegate, - Callback<Throwable> reportExceptionCallback) { + Callback<Throwable> reportExceptionCallback, + @Nullable BackPressManager backPressManager) { mLocationBarLayout = (LocationBarLayout) locationBarLayout; mWindowDelegate = windowDelegate; mWindowAndroid = windowAndroid; @@ -176,6 +179,9 @@ isTablet() && isTabletLayout(), searchEngineLogoUtils, LensController.getInstance(), launchAssistanceSettingsAction, saveOfflineButtonState, omniboxUma, isToolbarMicEnabledSupplier); + if (backPressManager != null && BackPressManager.isEnabled()) { + backPressManager.addHandler(mLocationBarMediator, BackPressHandler.Type.LOCATION_BAR); + } final boolean isIncognito = incognitoStateProvider != null && incognitoStateProvider.isIncognitoSelected(); mUrlCoordinator =
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java index c92de7d..ea710e7 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java
@@ -30,9 +30,11 @@ import org.chromium.base.metrics.TimingMetric; import org.chromium.base.supplier.BooleanSupplier; import org.chromium.base.supplier.ObservableSupplier; +import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.task.PostTask; +import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -65,6 +67,7 @@ import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener; +import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.externalauth.ExternalAuthUtils; import org.chromium.components.metrics.OmniboxEventProtos.OmniboxEventProto.PageClassification; @@ -89,7 +92,7 @@ implements LocationBarDataProvider.Observer, OmniboxStub, VoiceRecognitionHandler.Delegate, VoiceRecognitionHandler.Observer, AssistantVoiceSearchService.Observer, UrlBarDelegate, OnKeyListener, ComponentCallbacks, - TemplateUrlService.TemplateUrlServiceObserver { + TemplateUrlService.TemplateUrlServiceObserver, BackPressHandler { private static final int ICON_FADE_ANIMATION_DURATION_MS = 150; private static final int ICON_FADE_ANIMATION_DELAY_MS = 75; private static final long NTP_KEYBOARD_FOCUS_DURATION_MS = 200; @@ -188,6 +191,8 @@ // Tracks if the location bar is laid out in a focused state due to an ntp scroll. private boolean mIsLocationBarFocusedFromNtpScroll; private @BrandedColorScheme int mBrandedColorScheme = BrandedColorScheme.APP_DEFAULT; + private ObservableSupplierImpl<Boolean> mBackPressStateSupplier = + new ObservableSupplierImpl<>(); /*package */ LocationBarMediator(@NonNull Context context, @NonNull LocationBarLayout locationBarLayout, @@ -267,6 +272,8 @@ /*package */ void onUrlFocusChange(boolean hasFocus) { setUrlFocusChangeInProgress(true); mUrlHasFocus = hasFocus; + // Intercept back press if it has focus. + mBackPressStateSupplier.set(mUrlHasFocus); updateButtonVisibility(); updateShouldAnimateIconChanges(); onPrimaryColorChanged(); @@ -1134,6 +1141,9 @@ if (mAutocompleteCoordinator.handleKeyEvent(keyCode, event)) { return true; } else if (keyCode == KeyEvent.KEYCODE_BACK) { + if (BackPressManager.isEnabled()) { + return false; + } if (KeyNavigationUtil.isActionDown(event) && event.getRepeatCount() == 0) { // Tell the framework to start tracking this event. mLocationBarLayout.getKeyDispatcherState().startTracking(event, this); @@ -1379,8 +1389,12 @@ return !mLocationBarDataProvider.isIncognito(); } + // Traditional way to intercept keycode_back, which is deprecated from T. @Override public void backKeyPressed() { + if (!BackPressManager.isEnabled()) { + BackPressManager.record(BackPressHandler.Type.LOCATION_BAR); + } if (mBackKeyBehavior.handleBackKeyPressed()) { return; } @@ -1397,6 +1411,18 @@ : OmniboxFocusReason.OMNIBOX_TAP); } + // BackPressHandler implementation. + // Modern way to intercept back press starting from T. + @Override + public void handleBackPress() { + backKeyPressed(); + } + + @Override + public ObservableSupplier<Boolean> getHandleBackPressChangedSupplier() { + return mBackPressStateSupplier; + } + // OnKeyListener implementation. @Override public boolean onKey(View view, int keyCode, KeyEvent event) {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java index 20f3099a..32fffd5 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java
@@ -32,6 +32,7 @@ import android.content.res.Configuration; import android.graphics.Color; import android.graphics.Rect; +import android.os.Build.VERSION_CODES; import android.text.TextUtils; import android.util.Property; import android.view.ContextThemeWrapper; @@ -60,6 +61,7 @@ import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.JniMocker; import org.chromium.build.BuildConfig; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -570,7 +572,9 @@ verify(mUrlCoordinator).clearFocus(); } + // KEYCODE_BACK will not be sent from Android OS starting from T. @Test + @DisableIf.Build(sdk_is_greater_than = VERSION_CODES.S_V2) public void testOnKey_autocompleteHandles() { doReturn(true) .when(mAutocompleteCoordinator) @@ -580,6 +584,7 @@ } @Test + @DisableIf.Build(sdk_is_greater_than = VERSION_CODES.S_V2) public void testOnKey_back() { doReturn(mKeyDispatcherState).when(mLocationBarLayout).getKeyDispatcherState(); doReturn(KeyEvent.ACTION_DOWN).when(mKeyEvent).getAction();
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java index dfc736d2..037232a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -281,6 +281,10 @@ mTextContextMenuDelegate = delegate; } + /** + * When predictive back gesture is enabled, keycode_back will not be sent from Android OS + * starting from T. {@link LocationBarMediator} will intercept the back press instead. + */ @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (KeyEvent.KEYCODE_BACK == keyCode && event.getAction() == KeyEvent.ACTION_UP) {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java index 64abd8c8..d1db0db 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
@@ -27,6 +27,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import androidx.annotation.VisibleForTesting; import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.omnibox.R; @@ -83,6 +84,7 @@ private BrowserStateBrowserControlsVisibilityDelegate mBrowserControlsVisibilityDelegate; private int mShowBrowserControlsToken = TokenHolder.INVALID_TOKEN; + private Integer mIconAnimationDurationForTests; public StatusView(Context context, AttributeSet attributes) { super(context, attributes); @@ -160,7 +162,7 @@ mIconView.setVisibility(View.VISIBLE); mIconView.animate() .alpha(1.0f) - .setDuration(ICON_ANIMATION_DURATION_MS) + .setDuration(getIconAnimationDuration()) .withEndAction(() -> { mAnimatingStatusIconShow = false; allowBrowserControlsHide(); @@ -180,7 +182,7 @@ // back and forth between secure and insecure sites, which seems like a glitch. // See bug: crbug.com/919449 mIconView.animate() - .setDuration(mAnimationsEnabled ? ICON_ANIMATION_DURATION_MS : 0) + .setDuration(mAnimationsEnabled ? getIconAnimationDuration() : 0) .alpha(0.0f) .withEndAction(() -> { mIconView.setVisibility(View.GONE); @@ -224,7 +226,7 @@ if (transitionType == IconTransitionType.CROSSFADE) { mIsAnimatingStatusIconChange = true; mCurrentTransitionDuration = - mAnimationsEnabled ? ICON_ANIMATION_DURATION_MS : 0; + mAnimationsEnabled ? getIconAnimationDuration() : 0; if (mCurrentTransitionDuration > 0) { keepControlsShownForAnimation(); } @@ -238,7 +240,7 @@ .rotationBy(ICON_ROTATION_DEGREES) .setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR) .withStartAction( - () -> { newImage.startTransition(ICON_ANIMATION_DURATION_MS); }) + () -> { newImage.startTransition(getIconAnimationDuration()); }) .withEndAction(() -> { mIsAnimatingStatusIconChange = false; allowBrowserControlsHide(); @@ -562,7 +564,18 @@ allowBrowserControlsHide(); } + private int getIconAnimationDuration() { + return mIconAnimationDurationForTests == null ? ICON_ANIMATION_DURATION_MS + : mIconAnimationDurationForTests; + } + + @VisibleForTesting TouchDelegate getTouchDelegateForTesting() { return mTouchDelegate; } + + @VisibleForTesting + void setIconAnimationDurationForTesting(int duration) { + mIconAnimationDurationForTests = duration; + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java index 129bb1f..54ce3f6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java
@@ -16,6 +16,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import static org.chromium.content_public.browser.test.util.TestThreadUtils.runOnUiThreadBlocking; @@ -32,6 +33,7 @@ import org.mockito.MockitoAnnotations; import org.chromium.base.test.util.Batch; +import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.R; @@ -45,6 +47,8 @@ import org.chromium.ui.test.util.BlankUiTestActivityTestCase; import org.chromium.ui.test.util.UiRestriction; +import java.util.concurrent.ExecutionException; + /** * Tests for {@link StatusView} and {@link StatusViewBinder}. */ @@ -189,4 +193,35 @@ assertEquals(expectedPadding, view.getPaddingEnd()); }); } + + @Test + @MediumTest + @Feature({"Omnibox"}) + public void testStatusViewAnimationStatusResetOnHide() { + runOnUiThreadBlocking(() -> { + mStatusModel.set(StatusProperties.SHOW_STATUS_ICON, true); + mStatusModel.set(StatusProperties.STATUS_ICON_RESOURCE, + new StatusIconResource(R.drawable.ic_logo_googleg_24dp, 0)); + assertTrue(mStatusView.isStatusIconAnimating()); + mStatusModel.set(StatusProperties.SHOW_STATUS_ICON, false); + assertFalse(mStatusView.isStatusIconAnimating()); + }); + } + + @Test + @MediumTest + @Feature({"Omnibox"}) + public void testStatusViewAnimationStatusResetAfterDuration() + throws ExecutionException, InterruptedException { + runOnUiThreadBlocking(() -> { + mStatusView.setIconAnimationDurationForTesting(50); + mStatusModel.set(StatusProperties.SHOW_STATUS_ICON, true); + mStatusModel.set(StatusProperties.ANIMATIONS_ENABLED, true); + mStatusModel.set(StatusProperties.STATUS_ICON_RESOURCE, + new StatusIconResource(R.drawable.ic_logo_googleg_24dp, 0)); + assertTrue(mStatusView.isStatusIconAnimating()); + }); + + CriteriaHelper.pollUiThread(() -> !mStatusView.isStatusIconAnimating(), 300, 20); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java new file mode 100644 index 0000000..1a66a8492 --- /dev/null +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java
@@ -0,0 +1,23 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.omnibox.suggestions; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; + +/** + * The set of common properties associated with dropdown suggestions. + */ +public class DropdownCommonProperties { + /** Whether the suggestion background's top corners should be rounded. */ + public static final WritableBooleanPropertyKey BG_TOP_CORNER_ROUNDED = + new WritableBooleanPropertyKey(); + /** Whether the suggestion background's bottom corners should be rounded. */ + public static final WritableBooleanPropertyKey BG_BOTTOM_CORNER_ROUNDED = + new WritableBooleanPropertyKey(); + + public static final PropertyKey[] ALL_KEYS = + new PropertyKey[] {BG_TOP_CORNER_ROUNDED, BG_BOTTOM_CORNER_ROUNDED}; +}
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemProcessor.java index e2bbc616..394ffd4 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemProcessor.java
@@ -42,4 +42,9 @@ * Signals that the dropdown list is about to be populated with new content. */ default void onSuggestionsReceived() {} + + /** + * Return if the suggestion view can have background rounding. + */ + boolean allowBackgroundRounding(); }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java index 37f0502..a1ecf49 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java
@@ -11,6 +11,8 @@ import androidx.annotation.NonNull; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.omnibox.AutocompleteResult; import org.chromium.ui.base.DeviceFormFactor; @@ -127,6 +129,9 @@ int deviceType = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext) ? SuggestionCommonProperties.FormFactor.TABLET : SuggestionCommonProperties.FormFactor.PHONE; + DropdownItemViewInfo prevSuggestionWithBackground = null; + // Note: we consider the Omnibox as part of the background rounding group. + boolean inDropdownItemBackgroundRoundingGroup = true; for (int i = 0; i < mSourceViewInfoList.size(); i++) { final DropdownItemViewInfo item = mSourceViewInfoList.get(i); final PropertyModel model = item.model; @@ -134,16 +139,57 @@ model.set(SuggestionCommonProperties.COLOR_SCHEME, mBrandedColorScheme); model.set(SuggestionCommonProperties.DEVICE_FORM_FACTOR, deviceType); + // Add the background to suggestions. + if (item.processor.allowBackgroundRounding()) { + model.set(DropdownCommonProperties.BG_TOP_CORNER_ROUNDED, + !inDropdownItemBackgroundRoundingGroup); + // The default value is false, so we do not need to assign false to + // BG_BOTTOM_CORNER_ROUNDED here. + + prevSuggestionWithBackground = item; + inDropdownItemBackgroundRoundingGroup = true; + } else { + // If the current suggestion does not support background, we should round corner the + // bottom of the previous suggestion's background. + if (prevSuggestionWithBackground != null) { + prevSuggestionWithBackground.model.set( + DropdownCommonProperties.BG_BOTTOM_CORNER_ROUNDED, true); + } + inDropdownItemBackgroundRoundingGroup = false; + } + final boolean groupIsDefaultCollapsed = getGroupCollapsedState(item.groupId); if (!groupIsDefaultCollapsed || isGroupHeaderWithId(item, item.groupId)) { suggestionsList.add(item); } } + // round the bottom corners of the last suggestion. + if (prevSuggestionWithBackground != null) { + prevSuggestionWithBackground.model.set( + DropdownCommonProperties.BG_BOTTOM_CORNER_ROUNDED, true); + } + mManagedModel.set(suggestionsList); } /** + * Return if the suggestion type should have background. + * + * @param type The type of the suggestion. + */ + private boolean suggestionShouldHaveBackground(@OmniboxSuggestionUiType int type) { + return CachedFeatureFlags.isEnabled(ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE) + && (type == OmniboxSuggestionUiType.DEFAULT + || type == OmniboxSuggestionUiType.EDIT_URL_SUGGESTION + || type == OmniboxSuggestionUiType.ANSWER_SUGGESTION + || type == OmniboxSuggestionUiType.ENTITY_SUGGESTION + || type == OmniboxSuggestionUiType.TAIL_SUGGESTION + || type == OmniboxSuggestionUiType.CLIPBOARD_SUGGESTION + || type == OmniboxSuggestionUiType.PEDAL_SUGGESTION); + } + + /** * Remove all suggestions that belong to specific group. * * @param groupId Group ID of suggestions that should be removed.
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java index 1754fba4..f804949e 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
@@ -30,6 +30,8 @@ import org.chromium.base.TraceEvent; import org.chromium.base.metrics.TimingMetric; import org.chromium.base.task.PostTask; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.KeyNavigationUtil; @@ -193,9 +195,13 @@ }); final Resources resources = context.getResources(); + int paddingSide = + CachedFeatureFlags.isEnabled(ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE) + ? resources.getDimensionPixelOffset(R.dimen.omnibox_suggestion_list_padding_side) + : 0; int paddingBottom = resources.getDimensionPixelOffset(R.dimen.omnibox_suggestion_list_padding_bottom); - ViewCompat.setPaddingRelative(this, 0, 0, 0, paddingBottom); + ViewCompat.setPaddingRelative(this, paddingSide, 0, paddingSide, paddingBottom); mStandardBgColor = ChromeColors.getDefaultThemeColor(context, false); mIncognitoBgColor = ChromeColors.getDefaultThemeColor(context, true);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java index de8d9a56..8a548e5 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java
@@ -7,6 +7,7 @@ import androidx.annotation.IntDef; import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; import java.lang.annotation.Retention; @@ -32,6 +33,8 @@ /** The device type for calculating the tile margin in the suggestion view. */ public static final WritableIntPropertyKey DEVICE_FORM_FACTOR = new WritableIntPropertyKey(); - public static final PropertyKey[] ALL_KEYS = - new PropertyKey[] {COLOR_SCHEME, LAYOUT_DIRECTION, DEVICE_FORM_FACTOR}; + public static final PropertyKey[] ALL_KEYS = PropertyModel.concatKeys( + new PropertyKey[] {COLOR_SCHEME, LAYOUT_DIRECTION, DEVICE_FORM_FACTOR}, + DropdownCommonProperties.ALL_KEYS); + ; }
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 190b1e1e..7d6a650 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
@@ -7,9 +7,13 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import android.view.View; import android.view.View.AccessibilityDelegate; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.view.ViewGroup.MarginLayoutParams; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.widget.ImageView; @@ -21,6 +25,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; +import org.chromium.chrome.browser.omnibox.suggestions.DropdownCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewProperties.Action; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; @@ -62,6 +67,8 @@ updateContentViewPadding(model, view.getDecoratedSuggestionView()); } else if (SuggestionCommonProperties.COLOR_SCHEME == propertyKey) { updateColorScheme(model, view); + } else if (DropdownCommonProperties.BG_TOP_CORNER_ROUNDED == propertyKey) { + updateBackgroundAndMargin(model, view); } else if (BaseSuggestionViewProperties.ACTIONS == propertyKey) { bindActionButtons(model, view, model.get(BaseSuggestionViewProperties.ACTIONS)); } else if (BaseSuggestionViewProperties.ON_FOCUS_VIA_SELECTION == propertyKey) { @@ -265,4 +272,60 @@ view.setImageDrawable(sds.drawable); ApiCompatibilityUtils.setImageTintList(view, tint); } + + /** + * Update the background for the view, also add the margin for the view. + * + * @param model A property model to look up relevant properties. + * @param view A view that need to be updated. + */ + public static void updateBackgroundAndMargin(PropertyModel model, View view) { + view.setBackground(getBackgroundDrawable(model, view)); + + ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); + if (layoutParams == null) { + layoutParams = + new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } + + if (layoutParams instanceof MarginLayoutParams) { + int verticalSpacing = view.getContext().getResources().getDimensionPixelSize( + R.dimen.omnibox_suggestion_vertical_spacing); + ((MarginLayoutParams) layoutParams).setMargins(0, verticalSpacing, 0, 0); + } + view.setLayoutParams(layoutParams); + } + + /** + * Retrieves background drawable for the view. + * + * @param model A property model to look up relevant properties. + * @param view A view that provides context. + * @return The suggestion background drawable. + */ + private static Drawable getBackgroundDrawable(PropertyModel model, View view) { + final Resources resources = view.getContext().getResources(); + int roundedRadius = + resources.getDimensionPixelSize(R.dimen.omnibox_suggestion_bg_round_corner_radius); + int rectangleRadius = resources.getDimensionPixelSize( + R.dimen.omnibox_suggestion_bg_rectangle_corner_radius); + + int topRadii = model.get(DropdownCommonProperties.BG_TOP_CORNER_ROUNDED) ? roundedRadius + : rectangleRadius; + int bottomRadii = model.get(DropdownCommonProperties.BG_BOTTOM_CORNER_ROUNDED) + ? roundedRadius + : rectangleRadius; + + GradientDrawable backgroundGradient = new GradientDrawable(); + backgroundGradient.setShape(GradientDrawable.RECTANGLE); + + backgroundGradient.setCornerRadii(new float[] {topRadii, topRadii, topRadii, topRadii, + bottomRadii, bottomRadii, bottomRadii, bottomRadii}); + backgroundGradient.setColor(view.getContext().getColor(R.color.default_bg_color_baseline)); + final int tint = ChromeColors.getSurfaceColor( + view.getContext(), R.dimen.omnibox_suggestion_bg_elevation); + backgroundGradient.setTint(tint); + + return backgroundGradient; + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java index 896a4d5..80eea2a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.omnibox.suggestions.base; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; @@ -16,6 +17,7 @@ import android.app.Activity; import android.content.res.Resources; import android.view.View; +import android.view.ViewGroup.MarginLayoutParams; import android.widget.ImageView; import androidx.test.ext.junit.rules.ActivityScenarioRule; @@ -32,6 +34,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.R; +import org.chromium.chrome.browser.omnibox.suggestions.DropdownCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewProperties.Action; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; @@ -278,4 +281,21 @@ verify(mContentView).setPaddingRelative(0, expectedPadding, 0, expectedPadding); verify(mContentView).setMinimumHeight(expectedHeight); } + + @Test + public void suggestionBackgroundAndMargin() { + mModel.set(DropdownCommonProperties.BG_BOTTOM_CORNER_ROUNDED, false); + mModel.set(DropdownCommonProperties.BG_TOP_CORNER_ROUNDED, true); + + verify(mBaseView).setBackground(any()); + Assert.assertNotNull(mBaseView.getBackground()); + + verify(mBaseView).setLayoutParams(any()); + MarginLayoutParams layoutParams = (MarginLayoutParams) mBaseView.getLayoutParams(); + Assert.assertNotNull(layoutParams); + Assert.assertEquals(0, layoutParams.leftMargin); + Assert.assertNotEquals(0, layoutParams.topMargin); + Assert.assertEquals(0, layoutParams.rightMargin); + Assert.assertEquals(0, layoutParams.bottomMargin); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java index b07be211..e4a31488 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java
@@ -13,6 +13,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.MatchClassificationStyle; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.suggestions.FaviconFetcher; @@ -37,6 +39,7 @@ private final int mDesiredFaviconWidthPx; private final int mDecorationImageSizePx; private final int mSuggestionSizePx; + private boolean mDropdownItemRoundingEnabled; /** * @param context Current context. @@ -71,7 +74,10 @@ } @Override - public void onNativeInitialized() {} + public void onNativeInitialized() { + mDropdownItemRoundingEnabled = + CachedFeatureFlags.isEnabled(ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE); + } @Override public int getMinimumViewHeight() { @@ -224,4 +230,9 @@ @Override public void onUrlFocusChange(boolean hasFocus) {} + + @Override + public boolean allowBackgroundRounding() { + return mDropdownItemRoundingEnabled; + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java index 634bb3a..55a84ad2b 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java
@@ -39,4 +39,9 @@ @Override public void onNativeInitialized() {} + + @Override + public boolean allowBackgroundRounding() { + return false; + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java index 887ce1e1..441d608 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionViewBinder.java
@@ -8,6 +8,7 @@ import android.view.View; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; +import org.chromium.chrome.browser.omnibox.suggestions.DropdownCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewBinder; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewViewBinder; @@ -33,6 +34,11 @@ view.getContext(), model.get(SuggestionCommonProperties.COLOR_SCHEME), android.R.attr.listDivider); view.getDivider().setBackground(drawable); + } else if (DropdownCommonProperties.BG_TOP_CORNER_ROUNDED == propertyKey) { + // No divider line when the background shadow is present. + // Also once the background shadow is present, the divider line will not to be shown + // again, so do not need to consider to set it View.VISIBLE again. + view.getDivider().setVisibility(View.GONE); } } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java index 5b7d5c93..e0191bf 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java
@@ -104,4 +104,9 @@ mShouldRemoveSuggestionHeaderCapitalization = ChromeFeatureList.isEnabled( ChromeFeatureList.OMNIBOX_REMOVE_SUGGESTION_HEADER_CAPITALIZATION); } + + @Override + public boolean allowBackgroundRounding() { + return false; + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java index c04b5e6..57cde1a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionViewBinder.java
@@ -12,6 +12,7 @@ import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; +import org.chromium.chrome.browser.omnibox.suggestions.DropdownCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewBinder; import org.chromium.chrome.browser.omnibox.suggestions.pedal.PedalSuggestionViewProperties.PedalIcon; @@ -68,6 +69,8 @@ } else if (SuggestionCommonProperties.LAYOUT_DIRECTION == propertyKey) { ViewCompat.setLayoutDirection( view.getPedalView(), model.get(SuggestionCommonProperties.LAYOUT_DIRECTION)); + } else if (DropdownCommonProperties.BG_TOP_CORNER_ROUNDED == propertyKey) { + BaseSuggestionViewBinder.updateBackgroundAndMargin(model, view); } } }
diff --git a/chrome/browser/ui/android/webid/internal/java/res/layout/account_selection_sheet.xml b/chrome/browser/ui/android/webid/internal/java/res/layout/account_selection_sheet.xml index e4226228..4c003ed2 100644 --- a/chrome/browser/ui/android/webid/internal/java/res/layout/account_selection_sheet.xml +++ b/chrome/browser/ui/android/webid/internal/java/res/layout/account_selection_sheet.xml
@@ -14,13 +14,18 @@ <include layout="@layout/account_selection_header_item" android:id="@+id/header_view_item" /> - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/sheet_item_list" + <FrameLayout + android:id="@+id/sheet_item_list_container" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:clipToPadding="false" - android:divider="@null" - tools:listitem="@layout/account_selection_account_item"/> + android:layout_height="match_parent"> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/sheet_item_list" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clipToPadding="false" + android:divider="@null" + tools:listitem="@layout/account_selection_account_item"/> + </FrameLayout> <include layout="@layout/account_selection_continue_button" android:id="@+id/account_selection_continue_btn"
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionBottomSheetContent.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionBottomSheetContent.java index aaa1c1f..aa647933 100644 --- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionBottomSheetContent.java +++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionBottomSheetContent.java
@@ -6,8 +6,10 @@ import android.view.View; import android.view.accessibility.AccessibilityEvent; +import android.widget.FrameLayout; import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.Supplier; @@ -21,6 +23,11 @@ * bottom sheet content. */ public class AccountSelectionBottomSheetContent implements BottomSheetContent { + /** + * The maximum number of accounts that should be fully visible when the + * the account picker is displayed. + */ + private static final float MAX_VISIBLE_ACCOUNTS = 2.5f; private final View mContentView; private final Supplier<Integer> mScrollOffsetSupplier; private @Nullable Runnable mBackPressHandler; @@ -65,6 +72,31 @@ } } + public void computeAndUpdateAccountListHeight() { + // {@link mContentView} is null for some tests. + if (mContentView == null) return; + + View sheetContainer = mContentView.findViewById(R.id.sheet_item_list_container); + // When we're in the multi-account chooser and there are more than {@link + // MAX_VISIBLE_ACCOUNTS} accounts, resize the list so that only {@link MAX_VISIBLE_ACCOUNTS} + // accounts and part of the next one are visible. + RecyclerView sheetItemListView = sheetContainer.findViewById(R.id.sheet_item_list); + int numAccounts = sheetItemListView.getAdapter().getItemCount(); + if (numAccounts > MAX_VISIBLE_ACCOUNTS) { + sheetItemListView.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + int measuredHeight = sheetItemListView.getMeasuredHeight(); + int containerHeight = + Math.round(((float) measuredHeight / numAccounts) * MAX_VISIBLE_ACCOUNTS); + sheetContainer.getLayoutParams().height = containerHeight; + } else { + // Need to set the height here in case it was changed by a previous {@link + // computeAndUpdateAccountListHeight()} call. + sheetContainer.getLayoutParams().height = FrameLayout.LayoutParams.WRAP_CONTENT; + } + } + @Override public void destroy() {}
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java index ba0484f..4d7f8a6f 100644 --- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java +++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java
@@ -251,6 +251,7 @@ ? createDataSharingConsentItem(mIdpForDisplay, mClientMetadata) : null); + mBottomSheetContent.computeAndUpdateAccountListHeight(); showContent(); mBottomSheetContent.focusForAccessibility(focusItem); }
diff --git a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc index 75800ac..910c0cb2 100644 --- a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc +++ b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc
@@ -110,3 +110,5 @@ ash::DictationBubbleIconType icon, const absl::optional<std::u16string>& text, const absl::optional<std::vector<ash::DictationBubbleHintType>>& hints) {} + +void FakeAccessibilityController::SilenceSpokenFeedback() {}
diff --git a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h index 608d535..e863daf9 100644 --- a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h +++ b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h
@@ -73,6 +73,7 @@ const absl::optional<std::u16string>& text, const absl::optional<std::vector<ash::DictationBubbleHintType>>& hints) override; + void SilenceSpokenFeedback() override; private: bool was_client_set_ = false;
diff --git a/chrome/browser/ui/bookmarks/DEPS b/chrome/browser/ui/bookmarks/DEPS new file mode 100644 index 0000000..75c2810 --- /dev/null +++ b/chrome/browser/ui/bookmarks/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+components/bookmarks", +]
diff --git a/chrome/browser/ui/bookmarks/bookmark_browsertest.cc b/chrome/browser/ui/bookmarks/bookmark_browsertest.cc index 3b11e9a..273e423 100644 --- a/chrome/browser/ui/bookmarks/bookmark_browsertest.cc +++ b/chrome/browser/ui/bookmarks/bookmark_browsertest.cc
@@ -52,8 +52,12 @@ using bookmarks::UrlAndTitle; namespace { + const char kPersistBookmarkURL[] = "http://www.cnn.com/"; const char16_t kPersistBookmarkTitle[] = u"CNN"; +const base::Time kPersistLastUsedTime = + base::Time() + base::Days(7) + base::Hours(2) + base::Minutes(55) + + base::Seconds(24) + base::Milliseconds(133); bool IsShowingInterstitial(content::WebContents* tab) { security_interstitials::SecurityInterstitialTabHelper* helper = @@ -160,8 +164,9 @@ IN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, PRE_Persist) { BookmarkModel* bookmark_model = WaitForBookmarkModel(browser()->profile()); - bookmarks::AddIfNotBookmarked(bookmark_model, GURL(kPersistBookmarkURL), - kPersistBookmarkTitle); + const BookmarkNode* node = bookmarks::AddIfNotBookmarked( + bookmark_model, GURL(kPersistBookmarkURL), kPersistBookmarkTitle); + bookmark_model->UpdateLastUsedTime(node, kPersistLastUsedTime); } #if BUILDFLAG(IS_WIN) @@ -174,12 +179,14 @@ IN_PROC_BROWSER_TEST_F(BookmarkBrowsertest, MAYBE_Persist) { BookmarkModel* bookmark_model = WaitForBookmarkModel(browser()->profile()); - std::vector<UrlAndTitle> urls; - bookmark_model->GetBookmarks(&urls); + GURL url(kPersistBookmarkURL); + std::vector<const BookmarkNode*> nodes; + bookmark_model->GetNodesByURL(url, &nodes); - ASSERT_EQ(1u, urls.size()); - ASSERT_EQ(GURL(kPersistBookmarkURL), urls[0].url); - ASSERT_EQ(kPersistBookmarkTitle, urls[0].title); + ASSERT_EQ(1u, nodes.size()); + ASSERT_EQ(url, nodes[0]->url()); + ASSERT_EQ(kPersistBookmarkTitle, nodes[0]->GetTitledUrlNodeTitle()); + EXPECT_EQ(kPersistLastUsedTime, nodes[0]->date_last_used()); } #if !BUILDFLAG(IS_CHROMEOS_ASH) // No multi-profile on ChromeOS. @@ -271,12 +278,9 @@ const int incognito_tabs = incognito_browser->tab_strip_model()->GetTabCount(); - chrome::OpenAllIfAllowed( - incognito_browser, base::BindLambdaForTesting([=]() { - return static_cast<content::PageNavigator*>(incognito_browser); - }), - {incognito_folder}, WindowOpenDisposition::NEW_BACKGROUND_TAB, - /* add_to_group =*/true); + chrome::OpenAllIfAllowed(incognito_browser, {incognito_folder}, + WindowOpenDisposition::NEW_BACKGROUND_TAB, + /* add_to_group =*/true); EXPECT_EQ(incognito_tabs, incognito_browser->tab_strip_model()->GetTabCount());
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc index 15e86ff..31a53118 100644 --- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc +++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc
@@ -44,7 +44,6 @@ using base::UserMetricsAction; using bookmarks::BookmarkNode; -using content::PageNavigator; namespace { @@ -116,7 +115,6 @@ BookmarkContextMenuControllerDelegate* delegate, Browser* browser, Profile* profile, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, BookmarkLaunchLocation opened_from, const BookmarkNode* parent, const std::vector<const BookmarkNode*>& selection) @@ -124,7 +122,6 @@ delegate_(delegate), browser_(browser), profile_(profile), - get_navigator_(std::move(get_navigator)), opened_from_(opened_from), parent_(parent), selection_(selection), @@ -248,8 +245,7 @@ if (action) base::RecordAction(*action); - chrome::OpenAllIfAllowed(browser_, std::move(get_navigator_), selection_, - initial_disposition, + chrome::OpenAllIfAllowed(browser_, selection_, initial_disposition, id == IDC_BOOKMARK_BAR_OPEN_ALL_NEW_TAB_GROUP); break; }
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.h b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.h index b73c74d..c85386c 100644 --- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.h +++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.h
@@ -19,10 +19,6 @@ class Browser; class Profile; -namespace content { -class PageNavigator; -} - // An interface implemented by an object that performs actions on the actual // menu for the controller. class BookmarkContextMenuControllerDelegate { @@ -50,7 +46,6 @@ // Creates the bookmark context menu. // |browser| is used to open the bookmark manager and is null in tests. // |profile| is used for opening urls as well as enabling 'open incognito'. - // |get_navigator| is used to get a content::PageNavigator to open bookmarks. // Uses a callback since this can be asynchronous. See crbug.com/1161144 // |parent| is the parent for newly created nodes if |selection| is empty. // |selection| is the nodes the context menu operates on and may be empty. @@ -59,7 +54,6 @@ BookmarkContextMenuControllerDelegate* delegate, Browser* browser, Profile* profile, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, BookmarkLaunchLocation opened_from, const bookmarks::BookmarkNode* parent, const std::vector<const bookmarks::BookmarkNode*>& selection); @@ -100,7 +94,6 @@ raw_ptr<BookmarkContextMenuControllerDelegate> delegate_; const raw_ptr<Browser> browser_; raw_ptr<Profile> profile_; - base::RepeatingCallback<content::PageNavigator*()> get_navigator_; const BookmarkLaunchLocation opened_from_; raw_ptr<const bookmarks::BookmarkNode> parent_; std::vector<const bookmarks::BookmarkNode*> selection_;
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc index 8b8d5de6..66b03acb 100644 --- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc +++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc
@@ -18,13 +18,14 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/bookmarks/bookmark_utils.h" #include "chrome/browser/ui/bookmarks/bookmark_utils_desktop.h" +#include "chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.h" +#include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_profile.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/common/bookmark_pref_names.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/sync_preferences/testing_pref_service_syncable.h" -#include "content/public/browser/page_navigator.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/clipboard/clipboard.h" @@ -35,20 +36,8 @@ using bookmarks::BookmarkNode; using content::BrowserThread; using content::OpenURLParams; -using content::PageNavigator; using content::WebContents; -// PageNavigator implementation that records the URL. -class TestingPageNavigator : public PageNavigator { - public: - WebContents* OpenURL(const OpenURLParams& params) override { - urls_.push_back(params.url); - return NULL; - } - - std::vector<GURL> urls_; -}; - class BookmarkContextMenuControllerTest : public testing::Test { public: BookmarkContextMenuControllerTest() : model_(nullptr) {} @@ -62,6 +51,9 @@ model_ = BookmarkModelFactory::GetForBrowserContext(profile_.get()); bookmarks::test::WaitForBookmarkModelToLoad(model_); AddTestData(model_); + + chrome::BookmarkNavigationWrapper::SetInstanceForTesting(&wrapper_); + // CutCopyPasteNode executes IDC_CUT and IDC_COPY commands. ui::TestClipboard::CreateForCurrentThread(); } @@ -94,17 +86,11 @@ model->AddURL(f4, 0, u"f4a", GURL(test_base + "f4a")); } - static base::RepeatingCallback<content::PageNavigator*()> - NullNavigatorGetter() { - return base::BindRepeating( - []() -> content::PageNavigator* { return nullptr; }); - } - protected: content::BrowserTaskEnvironment task_environment_; std::unique_ptr<TestingProfile> profile_; raw_ptr<BookmarkModel> model_; - TestingPageNavigator navigator_; + TestingBookmarkNavigationWrapper wrapper_; }; // Tests Deleting from the menu. @@ -113,8 +99,8 @@ model_->bookmark_bar_node()->children().front().get(), }; BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); GURL url = model_->bookmark_bar_node()->children().front()->url(); ASSERT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_REMOVE)); // Delete the URL. @@ -126,20 +112,19 @@ // Tests open all on a folder with a couple of bookmarks. TEST_F(BookmarkContextMenuControllerTest, OpenAll) { const BookmarkNode* folder = model_->bookmark_bar_node()->children()[1].get(); - chrome::OpenAllNow(&navigator_, {folder}, - WindowOpenDisposition::NEW_FOREGROUND_TAB, NULL); + chrome::OpenAllNow(nullptr, {folder}, + WindowOpenDisposition::NEW_FOREGROUND_TAB, nullptr); // Should have navigated to F1's child, but not F11's child. - ASSERT_EQ(1u, navigator_.urls_.size()); - ASSERT_TRUE(folder->children()[0]->url() == navigator_.urls_[0]); + ASSERT_EQ(1u, wrapper_.urls().size()); + ASSERT_TRUE(folder->children()[0]->url() == wrapper_.urls()[0]); } // Tests the enabled state of the menus when supplied an empty vector. TEST_F(BookmarkContextMenuControllerTest, EmptyNodes) { BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, model_->other_node(), - std::vector<const BookmarkNode*>()); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + model_->other_node(), std::vector<const BookmarkNode*>()); EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_FALSE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -159,8 +144,8 @@ model_->bookmark_bar_node()->children().front().get(), }; BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_TRUE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -181,8 +166,8 @@ model_->bookmark_bar_node()->children()[1]->children()[0].get(), }; BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_TRUE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -202,8 +187,8 @@ model_->bookmark_bar_node()->children()[2].get(), }; BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_FALSE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -224,8 +209,8 @@ model_->bookmark_bar_node()->children()[3].get(), }; BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_FALSE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -246,8 +231,8 @@ model_->bookmark_bar_node()->children()[4].get(), }; BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_TRUE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -274,9 +259,9 @@ std::vector<const BookmarkNode*> nodes = { model_->bookmark_bar_node()->children().front().get(), }; - BookmarkContextMenuController controller( - NULL, NULL, NULL, incognito, NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + BookmarkContextMenuController controller(nullptr, nullptr, nullptr, incognito, + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_INCOGNITO)); EXPECT_FALSE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); @@ -287,8 +272,8 @@ std::vector<const BookmarkNode*> nodes; nodes.push_back(model_->other_node()); BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0], nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0], nodes); EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_EDIT)); EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_REMOVE)); } @@ -297,8 +282,8 @@ // parent. TEST_F(BookmarkContextMenuControllerTest, EmptyNodesNullParent) { BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, NULL, std::vector<const BookmarkNode*>()); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nullptr, std::vector<const BookmarkNode*>()); EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_FALSE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -317,8 +302,8 @@ std::vector<const BookmarkNode*> nodes; nodes.push_back(model_->bookmark_bar_node()); BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes); EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_TRUE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -338,7 +323,7 @@ }; std::unique_ptr<BookmarkContextMenuController> controller( new BookmarkContextMenuController( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes)); EXPECT_TRUE(controller->IsCommandIdEnabled(IDC_COPY)); EXPECT_TRUE(controller->IsCommandIdEnabled(IDC_CUT)); @@ -347,8 +332,8 @@ controller->ExecuteCommand(IDC_COPY, 0); controller = base::WrapUnique(new BookmarkContextMenuController( - nullptr, nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes)); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes)); size_t old_count = bb_node->children().size(); controller->ExecuteCommand(IDC_PASTE, 0); @@ -357,8 +342,8 @@ ASSERT_EQ(bb_node->children()[0]->url(), bb_node->children()[1]->url()); controller = base::WrapUnique(new BookmarkContextMenuController( - nullptr, nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes)); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes)); // Cut the URL. controller->ExecuteCommand(IDC_CUT, 0); ASSERT_TRUE(bb_node->children()[0]->is_url()); @@ -369,9 +354,8 @@ TEST_F(BookmarkContextMenuControllerTest, ManagedShowAppsShortcutInBookmarksBar) { BookmarkContextMenuController controller( - NULL, NULL, NULL, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, model_->bookmark_bar_node(), - std::vector<const BookmarkNode*>()); + nullptr, nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + model_->bookmark_bar_node(), std::vector<const BookmarkNode*>()); // By default, the pref is not managed and the command is enabled. sync_preferences::TestingPrefServiceSyncable* prefs =
diff --git a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc index 115afca..cf9720d0 100644 --- a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc +++ b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc
@@ -14,7 +14,9 @@ #include "base/strings/string_number_conversions.h" #include "build/build_config.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" +#include "chrome/browser/bookmarks/url_and_id.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h" #include "chrome/browser/ui/bookmarks/bookmark_editor.h" #include "chrome/browser/ui/bookmarks/bookmark_stats.h" #include "chrome/browser/ui/bookmarks/bookmark_utils.h" @@ -33,6 +35,7 @@ #include "components/bookmarks/browser/bookmark_utils.h" #include "components/saved_tab_groups/saved_tab_group.h" #include "components/tab_groups/tab_group_id.h" +#include "content/public/browser/navigation_handle.h" #include "content/public/browser/page_navigator.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" @@ -46,35 +49,52 @@ size_t kNumBookmarkUrlsBeforePrompting = 15; +static BookmarkNavigationWrapper* g_nav_wrapper_test_instance = nullptr; + +base::WeakPtr<content::NavigationHandle> BookmarkNavigationWrapper::NavigateTo( + NavigateParams* params) { + return g_nav_wrapper_test_instance + ? g_nav_wrapper_test_instance->NavigateTo(params) + : Navigate(params); +} + +// static +void BookmarkNavigationWrapper::SetInstanceForTesting( + BookmarkNavigationWrapper* instance) { + g_nav_wrapper_test_instance = instance; +} + namespace { // Returns a vector of all URLs in |nodes| and their immediate children. Only // recurses one level deep, not infinitely. TODO(pkasting): It's not clear why // this shouldn't just recurse infinitely. -std::vector<GURL> GetURLsToOpen( +std::vector<UrlAndId> GetURLsToOpen( const std::vector<const BookmarkNode*>& nodes, content::BrowserContext* browser_context = nullptr, bool incognito_urls_only = false) { - std::vector<GURL> urls; - - const auto AddUrlIfLegal = [&](const GURL url) { - if (!incognito_urls_only || IsURLAllowedInIncognito(url, browser_context)) - urls.push_back(url); + std::vector<UrlAndId> url_and_ids; + const auto AddUrlIfLegal = [&](const GURL url, int64_t id) { + if (!incognito_urls_only || IsURLAllowedInIncognito(url, browser_context)) { + UrlAndId url_and_id; + url_and_id.url = url; + url_and_id.id = id; + url_and_ids.push_back(url_and_id); + } }; - for (const BookmarkNode* node : nodes) { if (node->is_url()) { - AddUrlIfLegal(node->url()); + AddUrlIfLegal(node->url(), node->id()); } else { // If the node is not a URL, it is a folder. We want to add those of its // children which are URLs. for (const auto& child : node->children()) { if (child->is_url()) - AddUrlIfLegal(child->url()); + AddUrlIfLegal(child->url(), child->id()); } } } - return urls; + return url_and_ids; } // Returns the total number of descendants nodes. @@ -123,22 +143,38 @@ // Opens all of the URLs in `bookmark_urls` using `navigator` and // `initial_disposition` as a starting point. Returns a reference set of the // WebContents created; see OpenedWebContentsSet. -OpenedWebContentsSet OpenAllHelper(content::PageNavigator* navigator, - std::vector<GURL> bookmark_urls, +OpenedWebContentsSet OpenAllHelper(Browser* browser, + std::vector<UrlAndId> bookmark_urls, WindowOpenDisposition initial_disposition) { OpenedWebContentsSet::container_type opened_tabs; WindowOpenDisposition disposition = initial_disposition; - for (std::vector<GURL>::const_iterator url_it = bookmark_urls.begin(); - url_it != bookmark_urls.end(); ++url_it) { - content::WebContents* opened_tab = navigator->OpenURL( - content::OpenURLParams(*url_it, content::Referrer(), disposition, - ui::PAGE_TRANSITION_AUTO_BOOKMARK, false)); - if (url_it == bookmark_urls.begin()) { + Profile* profile = nullptr; + BookmarkNavigationWrapper nav_wrapper; + for (std::vector<UrlAndId>::const_iterator url_and_id_it = + bookmark_urls.begin(); + url_and_id_it != bookmark_urls.end(); ++url_and_id_it) { + NavigateParams params(profile, url_and_id_it->url, + ui::PAGE_TRANSITION_AUTO_BOOKMARK); + params.disposition = disposition; + params.browser = browser; + base::WeakPtr<content::NavigationHandle> handle = + nav_wrapper.NavigateTo(¶ms); + content::WebContents* opened_tab = + handle ? handle->GetWebContents() : nullptr; + if (handle && url_and_id_it->id != -1) { + ChromeNavigationUIData* ui_data = + static_cast<ChromeNavigationUIData*>(handle->GetNavigationUIData()); + if (ui_data) + ui_data->set_bookmark_id(url_and_id_it->id); + } + if (url_and_id_it == bookmark_urls.begin()) { // We opened the first URL which may have opened a new window or clobbered - // the current page, reset the navigator just to be sure. |opened_tab| may - // be null in tests. - if (opened_tab) - navigator = opened_tab; + // the current page, reset the browser instance and assign the profile for + // the other navigations. + if (opened_tab) { + profile = Profile::FromBrowserContext(opened_tab->GetBrowserContext()); + browser = nullptr; + } disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB; } @@ -153,31 +189,21 @@ } // namespace #if !BUILDFLAG(IS_ANDROID) -void OpenAllIfAllowed( - Browser* browser, - base::OnceCallback<content::PageNavigator*()> get_navigator, - const std::vector<const bookmarks::BookmarkNode*>& nodes, - WindowOpenDisposition initial_disposition, - bool add_to_group) { - std::vector<GURL> urls = GetURLsToOpen( +void OpenAllIfAllowed(Browser* browser, + const std::vector<const bookmarks::BookmarkNode*>& nodes, + WindowOpenDisposition initial_disposition, + bool add_to_group) { + std::vector<UrlAndId> url_and_ids = GetURLsToOpen( nodes, browser->profile(), initial_disposition == WindowOpenDisposition::OFF_THE_RECORD); - - auto do_open = [](Browser* browser, - base::OnceCallback<content::PageNavigator*()> get_navigator, - std::vector<GURL> urls, + auto do_open = [](Browser* browser, std::vector<UrlAndId> url_and_ids_to_open, WindowOpenDisposition initial_disposition, absl::optional<std::u16string> folder_title, chrome::MessageBoxResult result) { if (result != chrome::MESSAGE_BOX_RESULT_YES) return; - if (!get_navigator) - return; - content::PageNavigator* navigator = std::move(get_navigator).Run(); - if (!navigator) - return; - const auto opened_web_contents = - OpenAllHelper(navigator, std::move(urls), initial_disposition); + const auto opened_web_contents = OpenAllHelper( + browser, std::move(url_and_ids_to_open), initial_disposition); if (folder_title.has_value()) { TabStripModel* model = browser->tab_strip_model(); @@ -213,14 +239,13 @@ }; // Skip the prompt if there are few bookmarks. - size_t child_count = urls.size(); + size_t child_count = url_and_ids.size(); if (child_count < kNumBookmarkUrlsBeforePrompting) { - do_open( - browser, std::move(get_navigator), std::move(urls), initial_disposition, - add_to_group - ? absl::optional<std::u16string>(nodes[0]->GetTitledUrlNodeTitle()) - : absl::nullopt, - chrome::MESSAGE_BOX_RESULT_YES); + do_open(browser, std::move(url_and_ids), initial_disposition, + add_to_group ? absl::optional<std::u16string>( + nodes[0]->GetTitledUrlNodeTitle()) + : absl::nullopt, + chrome::MESSAGE_BOX_RESULT_YES); return; } @@ -233,14 +258,14 @@ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME), l10n_util::GetStringFUTF16(IDS_BOOKMARK_BAR_SHOULD_OPEN_ALL, base::NumberToString16(child_count)), - base::BindOnce(do_open, browser, std::move(get_navigator), - std::move(urls), initial_disposition, + base::BindOnce(do_open, browser, std::move(url_and_ids), + initial_disposition, add_to_group ? absl::optional<std::u16string>( nodes[0]->GetTitledUrlNodeTitle()) : absl::nullopt)); } -void OpenAllNow(content::PageNavigator* navigator, +void OpenAllNow(Browser* browser, const std::vector<const BookmarkNode*>& nodes, WindowOpenDisposition initial_disposition, content::BrowserContext* browser_context) { @@ -249,26 +274,18 @@ // url is opened |navigator| is set to the PageNavigator of the last active // tab. This is done to handle a window disposition of new window, in which // case we want subsequent tabs to open in that window. - - std::vector<GURL> urls = GetURLsToOpen( - nodes, browser_context, - initial_disposition == WindowOpenDisposition::OFF_THE_RECORD); - - OpenAllHelper(navigator, std::move(urls), initial_disposition); + OpenAllHelper(browser, + GetURLsToOpen(nodes, browser_context, + initial_disposition == + WindowOpenDisposition::OFF_THE_RECORD), + initial_disposition); } -void OpenSavedTabGroupHelper( - Browser* browser, - base::OnceCallback<content::PageNavigator*()> get_navigator, - const base::GUID& saved_group_id, - chrome::MessageBoxResult result) { +void OpenSavedTabGroupHelper(Browser* browser, + const base::GUID& saved_group_id, + chrome::MessageBoxResult result) { if (result != chrome::MESSAGE_BOX_RESULT_YES) return; - if (!get_navigator) - return; - content::PageNavigator* navigator = std::move(get_navigator).Run(); - if (!navigator) - return; SavedTabGroupKeyedService* service = SavedTabGroupServiceFactory::GetForProfile(browser->profile()); @@ -303,15 +320,20 @@ // this browser's tabstrip model. TabStripModel* model_for_creation = browser->tab_strip_model(); - std::vector<GURL> urls; - auto get_urls = [&](SavedTabGroupTab saved_tab) { return saved_tab.url(); }; - base::ranges::transform(saved_group->saved_tabs(), std::back_inserter(urls), - get_urls); - if (urls.empty()) + std::vector<UrlAndId> url_and_ids; + auto get_url_and_ids = [&](const SavedTabGroupTab& saved_tab) { + UrlAndId url_and_id; + url_and_id.url = saved_tab.url(); + url_and_id.id = -1; + return url_and_id; + }; + base::ranges::transform(saved_group->saved_tabs(), + std::back_inserter(url_and_ids), get_url_and_ids); + if (url_and_ids.empty()) return; - - const auto opened_web_contents = OpenAllHelper( - navigator, std::move(urls), WindowOpenDisposition::NEW_BACKGROUND_TAB); + const auto opened_web_contents = + OpenAllHelper(browser, std::move(url_and_ids), + WindowOpenDisposition::NEW_BACKGROUND_TAB); // Figure out which tabs we actually opened in this browser that aren't // already in groups. @@ -347,14 +369,12 @@ model_for_creation->ActivateTabAt(first_tab.value()); } -void OpenSavedTabGroup( - Browser* browser, - base::OnceCallback<content::PageNavigator*()> get_navigator, - const base::GUID& saved_group_id, - const size_t num_tabs) { +void OpenSavedTabGroup(Browser* browser, + const base::GUID& saved_group_id, + const size_t num_tabs) { // Skip the prompt if there are few bookmarks. if (num_tabs < kNumBookmarkUrlsBeforePrompting) { - OpenSavedTabGroupHelper(browser, std::move(get_navigator), saved_group_id, + OpenSavedTabGroupHelper(browser, saved_group_id, chrome::MESSAGE_BOX_RESULT_YES); return; } @@ -367,8 +387,7 @@ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME), l10n_util::GetStringFUTF16(IDS_BOOKMARK_BAR_SHOULD_OPEN_ALL, base::NumberToString16(num_tabs)), - base::BindOnce(&OpenSavedTabGroupHelper, browser, - std::move(get_navigator), saved_group_id)); + base::BindOnce(&OpenSavedTabGroupHelper, browser, saved_group_id)); } int OpenCount(gfx::NativeWindow parent,
diff --git a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.h b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.h index 479d493..eee4c91 100644 --- a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.h +++ b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.h
@@ -16,6 +16,7 @@ #include "ui/gfx/native_widget_types.h" class Browser; +struct NavigateParams; namespace bookmarks { class BookmarkNode; @@ -24,10 +25,24 @@ namespace content { class BrowserContext; class PageNavigator; +class NavigationHandle; } namespace chrome { +// Wraps bookmark navigations to support view testing. +class BookmarkNavigationWrapper { + public: + virtual ~BookmarkNavigationWrapper() = default; + + // Wraps browser_navigator::Navigate. + virtual base::WeakPtr<content::NavigationHandle> NavigateTo( + NavigateParams* params); + + // Provide an instance for use in testing. + static void SetInstanceForTesting(BookmarkNavigationWrapper* instance); +}; + using TabGroupData = std::pair<absl::optional<tab_groups::TabGroupId>, std::u16string>; @@ -46,31 +61,27 @@ // PageNavigator used for opening the bookmarks. It may be called // arbitrarily later as long as |browser| is alive. If it is not // callable or returns null, this will fail gracefully. -void OpenAllIfAllowed( - Browser* browser, - base::OnceCallback<content::PageNavigator*()> get_navigator, - const std::vector<const bookmarks::BookmarkNode*>& nodes, - WindowOpenDisposition initial_disposition, - bool add_to_group); +void OpenAllIfAllowed(Browser* browser, + const std::vector<const bookmarks::BookmarkNode*>& nodes, + WindowOpenDisposition initial_disposition, + bool add_to_group); // Opens all the bookmarks in |nodes| that are of type url and all the child // bookmarks that are of type url for folders in |nodes|. |initial_disposition| // dictates how the first URL is opened, all subsequent URLs are opened as -// background tabs. |navigator| is used to open the URLs. +// background tabs. // // This does not prompt the user. It will open an arbitrary number of // bookmarks immediately. -void OpenAllNow(content::PageNavigator* navigator, +void OpenAllNow(Browser* browser, const std::vector<const bookmarks::BookmarkNode*>& nodes, WindowOpenDisposition initial_disposition, content::BrowserContext* browser_context); // Tries to open all urls in |group|. If there are many, prompts the user first. -void OpenSavedTabGroup( - Browser* browser, - base::OnceCallback<content::PageNavigator*()> get_navigator, - const base::GUID& saved_group_id, - const size_t num_tabs); +void OpenSavedTabGroup(Browser* browser, + const base::GUID& saved_group_id, + const size_t num_tabs); // Returns the count of bookmarks that would be opened by OpenAll. If // |incognito_context| is set, the function will use it to check if the URLs
diff --git a/chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.cc b/chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.cc new file mode 100644 index 0000000..9ab61d2 --- /dev/null +++ b/chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.cc
@@ -0,0 +1,17 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.h" + +#include "chrome/browser/ui/browser_navigator_params.h" + +TestingBookmarkNavigationWrapper::TestingBookmarkNavigationWrapper() = default; +TestingBookmarkNavigationWrapper::~TestingBookmarkNavigationWrapper() = default; + +base::WeakPtr<content::NavigationHandle> +TestingBookmarkNavigationWrapper::NavigateTo(NavigateParams* params) { + urls_.push_back(params->url); + transitions_.push_back(params->transition); + return nullptr; +}
diff --git a/chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.h b/chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.h new file mode 100644 index 0000000..0998190 --- /dev/null +++ b/chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.h
@@ -0,0 +1,44 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_BOOKMARKS_TEST_BOOKMARK_NAVIGATION_WRAPPER_H_ +#define CHROME_BROWSER_UI_BOOKMARKS_TEST_BOOKMARK_NAVIGATION_WRAPPER_H_ + +#include <vector> + +#include "chrome/browser/ui/bookmarks/bookmark_utils_desktop.h" +#include "ui/base/page_transition_types.h" +#include "url/gurl.h" + +struct NavigateParams; + +// Replacement BookmarkNavigationWrapper to support testing. +class TestingBookmarkNavigationWrapper + : public chrome::BookmarkNavigationWrapper { + public: + TestingBookmarkNavigationWrapper(); + ~TestingBookmarkNavigationWrapper() override; + + TestingBookmarkNavigationWrapper(const TestingBookmarkNavigationWrapper&) = + delete; + TestingBookmarkNavigationWrapper& operator=( + const TestingBookmarkNavigationWrapper&) = delete; + + base::WeakPtr<content::NavigationHandle> NavigateTo( + NavigateParams* params) override; + + const std::vector<GURL>& urls() const { return urls_; } + GURL last_url() const { return urls_.empty() ? GURL() : urls_.back(); } + + ui::PageTransition last_transition() const { + return transitions_.empty() ? ui::PAGE_TRANSITION_LINK + : transitions_.back(); + } + + private: + std::vector<GURL> urls_; + std::vector<ui::PageTransition> transitions_; +}; + +#endif // CHROME_BROWSER_UI_BOOKMARKS_TEST_BOOKMARK_NAVIGATION_WRAPPER_H_
diff --git a/chrome/browser/ui/extensions/extension_installed_waiter.cc b/chrome/browser/ui/extensions/extension_installed_waiter.cc index 54992c9..99510046 100644 --- a/chrome/browser/ui/extensions/extension_installed_waiter.cc +++ b/chrome/browser/ui/extensions/extension_installed_waiter.cc
@@ -43,8 +43,9 @@ extensions::ExtensionRegistry::Get(browser->profile())); removal_watcher_ = std::make_unique<ExtensionRemovalWatcher>( browser, extension, - base::BindOnce(&ExtensionInstalledWaiter::OnExtensionRemoved, - weak_factory_.GetWeakPtr())); + base::BindOnce( + &ExtensionInstalledWaiter::OnExtensionRemovedOrBrowserClosed, + weak_factory_.GetWeakPtr())); } ExtensionInstalledWaiter::~ExtensionInstalledWaiter() { @@ -80,6 +81,6 @@ weak_factory_.GetWeakPtr())); } -void ExtensionInstalledWaiter::OnExtensionRemoved() { +void ExtensionInstalledWaiter::OnExtensionRemovedOrBrowserClosed() { delete this; }
diff --git a/chrome/browser/ui/extensions/extension_installed_waiter.h b/chrome/browser/ui/extensions/extension_installed_waiter.h index 880c832c..b6e81aff08 100644 --- a/chrome/browser/ui/extensions/extension_installed_waiter.h +++ b/chrome/browser/ui/extensions/extension_installed_waiter.h
@@ -58,7 +58,7 @@ void OnExtensionLoaded(content::BrowserContext* browser_context, const extensions::Extension* extension) override; - void OnExtensionRemoved(); + void OnExtensionRemovedOrBrowserClosed(); const scoped_refptr<const extensions::Extension> extension_; const raw_ptr<const Browser> browser_;
diff --git a/chrome/browser/ui/startup/startup_browser_policy_unittest.cc b/chrome/browser/ui/startup/startup_browser_policy_unittest.cc index 5024aed..c25188a 100644 --- a/chrome/browser/ui/startup/startup_browser_policy_unittest.cc +++ b/chrome/browser/ui/startup/startup_browser_policy_unittest.cc
@@ -112,7 +112,6 @@ EXPECT_FALSE(welcome::CanShowGoogleAppModuleForTesting(*policy_map)); } -#if !BUILDFLAG(IS_FUCHSIA) TEST_F(StartupBrowserPolicyUnitTest, DefaultBrowserSettingEnabled) { EXPECT_TRUE(welcome::CanShowSetDefaultModuleForTesting(policy::PolicyMap())); @@ -123,7 +122,6 @@ policy_map = MakePolicy(policy::key::kDefaultBrowserSettingEnabled, false); EXPECT_FALSE(welcome::CanShowSetDefaultModuleForTesting(*policy_map)); } -#endif // !BUILDFLAG(IS_FUCHSIA) TEST_F(StartupBrowserPolicyUnitTest, BrowserSignin) { EXPECT_TRUE(welcome::CanShowSigninModuleForTesting(policy::PolicyMap()));
diff --git a/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.cc b/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.cc index c902262..7f51201 100644 --- a/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.cc +++ b/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.h" #include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel/side_panel.h" #include "content/public/browser/web_contents.h" @@ -25,14 +26,29 @@ ApcScrimManagerImpl::ApcScrimManagerImpl(content::WebContents* web_contents) : content::WebContentsObserver(web_contents) { - web_contents_ = web_contents; + browser_ = chrome::FindBrowserWithWebContents(web_contents); GetContentsWebView()->AddChildView(CreateOverlayView()); observation_.Observe(GetContentsWebView()); } ApcScrimManagerImpl::~ApcScrimManagerImpl() { - std::unique_ptr<views::View> overlay_view = - GetContentsWebView()->RemoveChildViewT(overlay_view_ref_); + // Makes sure the browser is still in the browser list. + // If yes, we can safely access it. The browser might not be in the list + // in the case where a tab is dragged to a browser B causing + // browser A (containing this view) to be deleted. + for (auto* browser : *BrowserList::GetInstance()) { + if (browser_ == browser) { + BrowserView* browser_view = + BrowserView::GetBrowserViewForBrowser(browser); + // If the browser view no longer exists, neither its children do. + if (!browser_view) + return; + if (browser_view->contents_web_view()->Contains(overlay_view_ref_)) { + browser_view->contents_web_view()->RemoveChildViewT(overlay_view_ref_); + } + return; + } + } } void ApcScrimManagerImpl::Show() { @@ -48,9 +64,9 @@ } raw_ptr<views::View> ApcScrimManagerImpl::GetContentsWebView() { - return BrowserView::GetBrowserViewForBrowser( - chrome::FindBrowserWithWebContents(web_contents_)) - ->contents_web_view(); + DCHECK(browser_); + DCHECK(BrowserView::GetBrowserViewForBrowser(browser_)); + return BrowserView::GetBrowserViewForBrowser(browser_)->contents_web_view(); } std::unique_ptr<views::View> ApcScrimManagerImpl::CreateOverlayView() {
diff --git a/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.h b/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.h index 125dfde..008f97f 100644 --- a/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.h +++ b/chrome/browser/ui/views/autofill_assistant/password_change/apc_scrim_manager_impl.h
@@ -17,6 +17,8 @@ class WebContents; } // namespace content +class Browser; + // Implementation of `ApcScrimManager` interface. class ApcScrimManagerImpl : public ApcScrimManager, public content::WebContentsObserver, @@ -46,7 +48,7 @@ base::ScopedObservation<views::View, ViewObserver> observation_{this}; raw_ptr<views::View> overlay_view_ref_ = nullptr; - raw_ptr<content::WebContents> web_contents_; + raw_ptr<Browser> browser_; }; #endif // CHROME_BROWSER_UI_VIEWS_AUTOFILL_ASSISTANT_PASSWORD_CHANGE_APC_SCRIM_MANAGER_IMPL_H_
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index 885ce6c..12a2ac1 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -12,7 +12,6 @@ #include <string> #include <utility> #include <vector> - #include "base/bind.h" #include "base/callback_helpers.h" #include "base/check_op.h" @@ -1340,16 +1339,12 @@ void BookmarkBarView::OnButtonPressed(const bookmarks::BookmarkNode* node, const ui::Event& event) { - DCHECK(page_navigator_); - // Only URL nodes have regular buttons on the bookmarks bar; folder clicks // are directed to ::OnMenuButtonPressed(). DCHECK(node->is_url()); RecordAppLaunch(browser_->profile(), node->url()); - content::OpenURLParams params(node->url(), content::Referrer(), - ui::DispositionFromEventFlags(event.flags()), - ui::PAGE_TRANSITION_AUTO_BOOKMARK, false); - page_navigator_->OpenURL(params); + chrome::OpenAllIfAllowed(browser_, {node}, + ui::DispositionFromEventFlags(event.flags()), false); RecordBookmarkLaunch( BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR, profile_metrics::GetBrowserProfileType(browser_->profile())); @@ -1362,17 +1357,15 @@ if ((event.flags() & ui::EF_MIDDLE_MOUSE_BUTTON) || (event.flags() & ui::EF_PLATFORM_ACCELERATOR)) { RecordBookmarkFolderLaunch(BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR); - chrome::OpenAllIfAllowed(browser_, GetPageNavigatorGetter(), {node}, - ui::DispositionFromEventFlags(event.flags()), - false); + chrome::OpenAllIfAllowed( + browser_, {node}, ui::DispositionFromEventFlags(event.flags()), false); } else { RecordBookmarkFolderOpen(BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR); const size_t start_index = (node == bookmark_model_->bookmark_bar_node()) ? GetFirstHiddenNodeIndex() : 0; - bookmark_menu_ = - new BookmarkMenuController(browser_, GetPageNavigatorGetter(), - GetWidget(), node, start_index, false); + bookmark_menu_ = new BookmarkMenuController(browser_, GetWidget(), node, + start_index, false); bookmark_menu_->set_observer(this); bookmark_menu_->RunMenuAt(this); } @@ -1418,7 +1411,7 @@ const bool close_on_remove = true; context_menu_ = std::make_unique<BookmarkContextMenu>( - GetWidget(), browser_, browser_->profile(), GetPageNavigatorGetter(), + GetWidget(), browser_, browser_->profile(), BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR, parent, nodes, close_on_remove); context_menu_->RunMenuAt(point, source_type); } @@ -1730,8 +1723,8 @@ start_index = GetFirstHiddenNodeIndex(); drop_info_->is_menu_showing = true; - bookmark_drop_menu_ = new BookmarkMenuController( - browser_, GetPageNavigatorGetter(), GetWidget(), node, start_index, true); + bookmark_drop_menu_ = new BookmarkMenuController(browser_, GetWidget(), node, + start_index, true); bookmark_drop_menu_->set_observer(this); bookmark_drop_menu_->RunMenuAt(this); @@ -2075,17 +2068,6 @@ return static_cast<size_t>(it - bookmark_buttons_.cbegin()); } -base::RepeatingCallback<content::PageNavigator*()> -BookmarkBarView::GetPageNavigatorGetter() { - auto getter = [](base::WeakPtr<BookmarkBarView> bookmark_bar) - -> content::PageNavigator* { - if (!bookmark_bar) - return nullptr; - return bookmark_bar->page_navigator_; - }; - return base::BindRepeating(getter, weak_ptr_factory_.GetWeakPtr()); -} - const BookmarkNode* BookmarkBarView::GetParentNodeAndIndexForDrop( size_t& index) { const BookmarkNode* root =
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h index 706e707..cf0cc603 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h
@@ -371,13 +371,6 @@ // or size_t{-1} if |button| is not a bookmark button from this bar. size_t GetIndexForButton(views::View* button); - // Returns a callback that fetches the content::PageNavigator for - // opening bookmarks. This callback is passed to menus, eventually - // used by chrome::OpenAllIfAllowed(). A callback is used since - // opening many bookmarks is asynchronous and |page_navigator_| may - // change in the meantime. - base::RepeatingCallback<content::PageNavigator*()> GetPageNavigatorGetter(); - // Returns the target drop BookmarkNode parent pointer and updates `index` // with the right value. const bookmarks::BookmarkNode* GetParentNodeAndIndexForDrop(size_t& index);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc index b0763b89..f56cbe81 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/bookmarks/bookmark_utils.h" #include "chrome/browser/ui/bookmarks/bookmark_utils_desktop.h" +#include "chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/browser_window.h" @@ -330,6 +331,8 @@ static_cast<TestBrowserWindow*>(browser_->window()) ->SetNativeWindow(window()->GetNativeWindow()); + chrome::BookmarkNavigationWrapper::SetInstanceForTesting(&wrapper_); + // Verify the layout triggered by the initial size preserves the overflow // state calculated in GetPreferredSizeForContents(). EXPECT_TRUE(GetBookmarkButton(5)->GetVisible()); @@ -401,6 +404,7 @@ raw_ptr<BookmarkModel> model_ = nullptr; raw_ptr<BookmarkBarView> bb_view_ = nullptr; TestingPageNavigator navigator_; + TestingBookmarkNavigationWrapper wrapper_; private: void AddTestData(bool big_menu) { @@ -593,8 +597,8 @@ void Step3() { // We should have navigated to URL f1a. const auto& f1 = model_->bookmark_bar_node()->children().front(); - ASSERT_EQ(navigator_.last_url(), f1->children().front()->url()); - ASSERT_FALSE(PageTransitionIsWebTriggerable(navigator_.last_transition())); + ASSERT_EQ(wrapper_.last_url(), f1->children().front()->url()); + ASSERT_FALSE(PageTransitionIsWebTriggerable(wrapper_.last_transition())); // Make sure button is no longer pushed. views::LabelButton* button = GetBookmarkButton(0); @@ -722,7 +726,7 @@ ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing()); // Nothing should have been selected. - EXPECT_EQ(GURL(), navigator_.last_url()); + EXPECT_EQ(GURL(), wrapper_.last_url()); // Hide menu. menu->GetMenuController()->Cancel(views::MenuController::ExitType::kAll); @@ -813,9 +817,9 @@ } void Step4() { - EXPECT_EQ(navigator_.last_url(), + EXPECT_EQ(wrapper_.last_url(), model_->other_node()->children().front()->url()); - ASSERT_FALSE(PageTransitionIsWebTriggerable(navigator_.last_transition())); + ASSERT_FALSE(PageTransitionIsWebTriggerable(wrapper_.last_transition())); Done(); } @@ -878,9 +882,9 @@ } void Step3() { - ASSERT_EQ(navigator_.last_url(), + ASSERT_EQ(wrapper_.last_url(), model_->bookmark_bar_node()->children()[6]->url()); - ASSERT_FALSE(PageTransitionIsWebTriggerable(navigator_.last_transition())); + ASSERT_FALSE(PageTransitionIsWebTriggerable(wrapper_.last_transition())); Done(); } }; @@ -1167,8 +1171,8 @@ void Step9() { const auto& f1 = model_->bookmark_bar_node()->children().front(); - ASSERT_EQ(navigator_.last_url(), f1->children().front()->url()); - ASSERT_FALSE(PageTransitionIsWebTriggerable(navigator_.last_transition())); + ASSERT_EQ(wrapper_.last_url(), f1->children().front()->url()); + ASSERT_FALSE(PageTransitionIsWebTriggerable(wrapper_.last_transition())); Done(); } }; @@ -2075,9 +2079,9 @@ } void Step5() { - EXPECT_EQ(navigator_.last_url(), + EXPECT_EQ(wrapper_.last_url(), model_->other_node()->children().front()->url()); - ASSERT_FALSE(PageTransitionIsWebTriggerable(navigator_.last_transition())); + ASSERT_FALSE(PageTransitionIsWebTriggerable(wrapper_.last_transition())); Done(); } @@ -2267,10 +2271,10 @@ private: void Step2() { - ASSERT_EQ(2u, navigator_.urls().size()); - EXPECT_EQ(navigator_.urls()[0], + ASSERT_EQ(2u, wrapper_.urls().size()); + EXPECT_EQ(wrapper_.urls()[0], model_->bookmark_bar_node()->children()[0]->children()[0]->url()); - EXPECT_EQ(navigator_.urls()[1], + EXPECT_EQ(wrapper_.urls()[1], model_->bookmark_bar_node()->children()[0]->children()[2]->url()); Done(); } @@ -2297,10 +2301,10 @@ private: void Step2() { - ASSERT_EQ(2u, navigator_.urls().size()); - EXPECT_EQ(navigator_.urls()[0], + ASSERT_EQ(2u, wrapper_.urls().size()); + EXPECT_EQ(wrapper_.urls()[0], model_->bookmark_bar_node()->children()[0]->children()[0]->url()); - EXPECT_EQ(navigator_.urls()[1], + EXPECT_EQ(wrapper_.urls()[1], model_->bookmark_bar_node()->children()[0]->children()[2]->url()); Done(); }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_context_menu.cc b/chrome/browser/ui/views/bookmarks/bookmark_context_menu.cc index a35fa33..6046671 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_context_menu.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_context_menu.cc
@@ -19,7 +19,6 @@ #include "ui/views/widget/widget.h" using bookmarks::BookmarkNode; -using content::PageNavigator; namespace { @@ -43,7 +42,6 @@ views::Widget* parent_widget, Browser* browser, Profile* profile, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, BookmarkLaunchLocation opened_from, const BookmarkNode* parent, const std::vector<const BookmarkNode*>& selection, @@ -53,7 +51,6 @@ this, browser, profile, - std::move(get_navigator), opened_from, parent, selection)),
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_context_menu.h b/chrome/browser/ui/views/bookmarks/bookmark_context_menu.h index 94941fd..81c26281 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_context_menu.h +++ b/chrome/browser/ui/views/bookmarks/bookmark_context_menu.h
@@ -38,14 +38,12 @@ class BookmarkContextMenu : public BookmarkContextMenuControllerDelegate, public views::MenuDelegate { public: - // |browser| is used to open the bookmark manager, and is NULL in tests. - // |get_navigator| is used to get the current PageNavigator for opening - // bookmarks. + // |browser| is used to open bookmarks as well as the bookmark manager, and + // is NULL in tests. BookmarkContextMenu( views::Widget* parent_widget, Browser* browser, Profile* profile, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, BookmarkLaunchLocation opened_from, const bookmarks::BookmarkNode* parent, const std::vector<const bookmarks::BookmarkNode*>& selection,
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc index e42887f..ae74cb3 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc
@@ -21,7 +21,9 @@ #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/bookmarks/bookmark_utils_desktop.h" +#include "chrome/browser/ui/bookmarks/test_bookmark_navigation_wrapper.h" #include "chrome/common/webui_url_constants.h" +#include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_profile.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/common/bookmark_pref_names.h" @@ -49,21 +51,6 @@ using content::PageNavigator; using content::WebContents; -namespace { - -// PageNavigator implementation that records the URL. -class TestingPageNavigator : public PageNavigator { - public: - WebContents* OpenURL(const OpenURLParams& params) override { - urls_.push_back(params.url); - return nullptr; - } - - std::vector<GURL> urls_; -}; - -} // namespace - class BookmarkContextMenuTest : public testing::Test { public: BookmarkContextMenuTest() : model_(nullptr) {} @@ -80,8 +67,10 @@ model_ = BookmarkModelFactory::GetForBrowserContext(profile_.get()); bookmarks::test::WaitForBookmarkModelToLoad(model_); - AddTestData(); + + chrome::BookmarkNavigationWrapper::SetInstanceForTesting(&wrapper_); + // CutCopyPasteNode executes IDC_COPY and IDC_CUT commands. ui::TestClipboard::CreateForCurrentThread(); } @@ -91,17 +80,11 @@ } protected: - static base::RepeatingCallback<content::PageNavigator*()> - NullNavigatorGetter() { - return base::BindRepeating( - []() -> content::PageNavigator* { return nullptr; }); - } - content::BrowserTaskEnvironment task_environment_; views::ScopedViewsTestHelper views_test_helper_; std::unique_ptr<TestingProfile> profile_; raw_ptr<BookmarkModel> model_; - TestingPageNavigator navigator_; + TestingBookmarkNavigationWrapper wrapper_; private: // Creates the following structure: @@ -136,9 +119,9 @@ std::vector<const BookmarkNode*> nodes = { model_->bookmark_bar_node()->children().front().get(), }; - BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); GURL url = model_->bookmark_bar_node()->children().front()->url(); ASSERT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); // Delete the URL. @@ -150,23 +133,23 @@ // Tests open all on a folder with a couple of bookmarks. TEST_F(BookmarkContextMenuTest, OpenAll) { const BookmarkNode* folder = model_->bookmark_bar_node()->children()[1].get(); - chrome::OpenAllNow(&navigator_, {folder}, + chrome::OpenAllNow(nullptr, {folder}, WindowOpenDisposition::NEW_FOREGROUND_TAB, nullptr); // Should have navigated to F1's child but not F11's child. - ASSERT_EQ(2u, navigator_.urls_.size()); - ASSERT_TRUE(folder->children()[0]->url() == navigator_.urls_[0]); + ASSERT_EQ(2u, wrapper_.urls().size()); + ASSERT_TRUE(folder->children()[0]->url() == wrapper_.urls()[0]); } // Tests open all on a folder with a couple of bookmarks in incognito window. TEST_F(BookmarkContextMenuTest, OpenAllIncognito) { const BookmarkNode* folder = model_->bookmark_bar_node()->children()[1].get(); - chrome::OpenAllNow(&navigator_, {folder}, - WindowOpenDisposition::OFF_THE_RECORD, profile_.get()); + chrome::OpenAllNow(nullptr, {folder}, WindowOpenDisposition::OFF_THE_RECORD, + profile_.get()); // Should have navigated to only f1a but not f2a. - ASSERT_EQ(1u, navigator_.urls_.size()); - ASSERT_TRUE(folder->children()[0]->url() == navigator_.urls_[0]); + ASSERT_EQ(1u, wrapper_.urls().size()); + ASSERT_TRUE(folder->children()[0]->url() == wrapper_.urls()[0]); } // Tests counting tabs for 'open all' on a folder with a couple of bookmarks. @@ -190,9 +173,8 @@ // Tests the enabled state of the menus when supplied an empty vector. TEST_F(BookmarkContextMenuTest, EmptyNodes) { BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, model_->other_node(), - std::vector<const BookmarkNode*>(), false); + nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + model_->other_node(), std::vector<const BookmarkNode*>(), false); EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_FALSE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -211,9 +193,9 @@ std::vector<const BookmarkNode*> nodes = { model_->bookmark_bar_node()->children().front().get(), }; - BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_TRUE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -232,9 +214,9 @@ model_->bookmark_bar_node()->children()[0].get(), model_->bookmark_bar_node()->children()[1]->children()[0].get(), }; - BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_TRUE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -252,9 +234,9 @@ std::vector<const BookmarkNode*> nodes = { model_->bookmark_bar_node()->children()[2].get(), }; - BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_FALSE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -274,9 +256,9 @@ model_->bookmark_bar_node()->children()[2].get(), model_->bookmark_bar_node()->children()[3].get(), }; - BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_FALSE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -296,9 +278,9 @@ model_->bookmark_bar_node()->children()[3].get(), model_->bookmark_bar_node()->children()[4].get(), }; - BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); EXPECT_TRUE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); @@ -317,9 +299,9 @@ }; Profile* incognito = profile_->GetPrimaryOTRProfile(/*create_if_needed=*/true); - BookmarkContextMenu controller( - nullptr, nullptr, incognito, NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, incognito, + BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_INCOGNITO)); EXPECT_FALSE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); @@ -328,9 +310,9 @@ // Tests that you can't remove/edit when showing the other node. TEST_F(BookmarkContextMenuTest, DisabledItemsWithOtherNode) { std::vector<const BookmarkNode*> nodes = {model_->other_node()}; - BookmarkContextMenu controller( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0], nodes, false); + BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), + BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0], nodes, + false); EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_EDIT)); EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); } @@ -339,7 +321,7 @@ // parent. TEST_F(BookmarkContextMenuTest, EmptyNodesNullParent) { BookmarkContextMenu controller(nullptr, nullptr, profile_.get(), - NullNavigatorGetter(), + BOOKMARK_LAUNCH_LOCATION_NONE, nullptr, std::vector<const BookmarkNode*>(), false); EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); @@ -358,8 +340,8 @@ const BookmarkNode* bb_node = model_->bookmark_bar_node(); std::vector<const BookmarkNode*> nodes = {bb_node->children()[0].get()}; std::unique_ptr<BookmarkContextMenu> controller(new BookmarkContextMenu( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false)); + nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false)); EXPECT_TRUE(controller->IsCommandEnabled(IDC_COPY)); EXPECT_TRUE(controller->IsCommandEnabled(IDC_CUT)); @@ -367,8 +349,8 @@ controller->ExecuteCommand(IDC_COPY, 0); controller = std::make_unique<BookmarkContextMenu>( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); size_t old_count = bb_node->children().size(); controller->ExecuteCommand(IDC_PASTE, 0); @@ -377,8 +359,8 @@ ASSERT_EQ(bb_node->children()[0]->url(), bb_node->children()[1]->url()); controller = std::make_unique<BookmarkContextMenu>( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); // Cut the URL. controller->ExecuteCommand(IDC_CUT, 0); ASSERT_TRUE(bb_node->children()[0]->is_url()); @@ -395,8 +377,8 @@ bb_node->children().front().get(), }; std::unique_ptr<BookmarkContextMenu> controller(new BookmarkContextMenu( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false)); + nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false)); // Verify that there are no managed nodes yet. bookmarks::ManagedBookmarkService* managed = @@ -427,8 +409,8 @@ // New context menus now show the "Show managed bookmarks" option. controller = std::make_unique<BookmarkContextMenu>( - nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, nodes[0]->parent(), nodes, false); + nullptr, nullptr, profile_.get(), BOOKMARK_LAUNCH_LOCATION_NONE, + nodes[0]->parent(), nodes, false); EXPECT_TRUE(controller->IsCommandVisible(IDC_BOOKMARK_BAR_NEW_FOLDER)); EXPECT_TRUE( controller->IsCommandVisible(IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS));
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc index ecfe1312..974f188 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.cc
@@ -24,15 +24,12 @@ using content::PageNavigator; using views::MenuItemView; -BookmarkMenuController::BookmarkMenuController( - Browser* browser, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, - views::Widget* parent, - const BookmarkNode* node, - size_t start_child_index, - bool for_drop) - : menu_delegate_( - new BookmarkMenuDelegate(browser, std::move(get_navigator), parent)), +BookmarkMenuController::BookmarkMenuController(Browser* browser, + views::Widget* parent, + const BookmarkNode* node, + size_t start_child_index, + bool for_drop) + : menu_delegate_(new BookmarkMenuDelegate(browser, parent)), node_(node), observer_(nullptr), for_drop_(for_drop),
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h index 984a8788..7eb14180 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h
@@ -22,10 +22,6 @@ class BookmarkNode; } -namespace content { -class PageNavigator; -} - namespace ui { class OSExchangeData; } @@ -46,13 +42,11 @@ public: // Creates a BookmarkMenuController showing the children of |node| starting // at |start_child_index|. - BookmarkMenuController( - Browser* browser, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, - views::Widget* parent, - const bookmarks::BookmarkNode* node, - size_t start_child_index, - bool for_drop); + BookmarkMenuController(Browser* browser, + views::Widget* parent, + const bookmarks::BookmarkNode* node, + size_t start_child_index, + bool for_drop); BookmarkMenuController(const BookmarkMenuController&) = delete; BookmarkMenuController& operator=(const BookmarkMenuController&) = delete;
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc index 02d6bee..338b9cd 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
@@ -117,13 +117,10 @@ } // namespace -BookmarkMenuDelegate::BookmarkMenuDelegate( - Browser* browser, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, - views::Widget* parent) +BookmarkMenuDelegate::BookmarkMenuDelegate(Browser* browser, + views::Widget* parent) : browser_(browser), profile_(browser->profile()), - get_navigator_(std::move(get_navigator)), parent_(parent), menu_(nullptr), parent_menu_item_(nullptr), @@ -228,7 +225,7 @@ RecordBookmarkLaunch(location_, profile_metrics::GetBrowserProfileType(profile_)); - chrome::OpenAllIfAllowed(browser_, get_navigator_, selection, + chrome::OpenAllIfAllowed(browser_, selection, ui::DispositionFromEventFlags(mouse_event_flags), false); } @@ -390,8 +387,7 @@ const BookmarkNode* node = menu_id_to_node_map_[id]; std::vector<const BookmarkNode*> nodes(1, node); context_menu_ = std::make_unique<BookmarkContextMenu>( - parent_, browser_, profile_, get_navigator_, - location_, node->parent(), nodes, + parent_, browser_, profile_, location_, node->parent(), nodes, ShouldCloseOnRemove(node)); context_menu_->set_observer(this); context_menu_->RunMenuAt(p, source_type);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h index 12badfc..12942c3 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h
@@ -26,10 +26,6 @@ class ManagedBookmarkService; } -namespace content { -class PageNavigator; -} - namespace ui { class OSExchangeData; } @@ -57,10 +53,7 @@ HIDE_PERMANENT_FOLDERS }; - BookmarkMenuDelegate( - Browser* browser, - base::RepeatingCallback<content::PageNavigator*()> get_navigator, - views::Widget* parent); + BookmarkMenuDelegate(Browser* browser, views::Widget* parent); BookmarkMenuDelegate(const BookmarkMenuDelegate&) = delete; BookmarkMenuDelegate& operator=(const BookmarkMenuDelegate&) = delete; @@ -196,8 +189,6 @@ const raw_ptr<Browser> browser_; raw_ptr<Profile> profile_; - base::RepeatingCallback<content::PageNavigator*()> get_navigator_; - // Parent of menus. raw_ptr<views::Widget> parent_;
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc index fe8514b..9b87ecd 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc
@@ -80,11 +80,8 @@ void NewDelegate() { DestroyDelegate(); - bookmark_menu_delegate_ = std::make_unique<BookmarkMenuDelegate>( - browser(), base::BindRepeating([]() { - return static_cast<content::PageNavigator*>(nullptr); - }), - nullptr); + bookmark_menu_delegate_ = + std::make_unique<BookmarkMenuDelegate>(browser(), nullptr); } void NewAndInitDelegateForPermanent() {
diff --git a/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar.cc b/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar.cc index 72ffa75..c971b77 100644 --- a/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar.cc +++ b/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar.cc
@@ -135,22 +135,11 @@ if (event.flags() & ui::EF_LEFT_MOUSE_BUTTON) { if (group->saved_tabs().empty()) return; - chrome::OpenSavedTabGroup(browser_, GetPageNavigatorGetter(), - group->saved_guid(), group->saved_tabs().size()); + chrome::OpenSavedTabGroup(browser_, group->saved_guid(), + group->saved_tabs().size()); } } -base::RepeatingCallback<content::PageNavigator*()> -SavedTabGroupBar::GetPageNavigatorGetter() { - auto getter = [](base::WeakPtr<SavedTabGroupBar> saved_tab_group_bar) - -> content::PageNavigator* { - if (!saved_tab_group_bar) - return nullptr; - return saved_tab_group_bar->page_navigator_; - }; - return base::BindRepeating(getter, weak_ptr_factory_.GetWeakPtr()); -} - int SavedTabGroupBar::CalculatePreferredWidthRestrictedBy(int max_x) { const int button_padding = GetLayoutConstant(TOOLBAR_ELEMENT_PADDING); int current_x = 0;
diff --git a/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar_browsertest.cc b/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar_browsertest.cc index 034f107..196b4aa78 100644 --- a/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar_browsertest.cc +++ b/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_bar_browsertest.cc
@@ -40,11 +40,7 @@ {SavedTabGroupTab(GURL("chrome://newtab"), u"Title", favicon::GetDefaultFavicon(), guid)}, guid)); - chrome::OpenSavedTabGroup( - browser(), base::BindLambdaForTesting([=]() { - return static_cast<content::PageNavigator*>(browser()); - }), - guid, 1); + chrome::OpenSavedTabGroup(browser(), guid, 1); const SavedTabGroup* saved_tab_group = stg_model->Get(guid); EXPECT_NE(saved_tab_group, nullptr); @@ -57,11 +53,7 @@ { // The STG is already opened in the saved tab group const int original_model_count = model->GetTabCount(); - chrome::OpenSavedTabGroup( - browser(), base::BindLambdaForTesting([=]() { - return static_cast<content::PageNavigator*>(browser()); - }), - guid, 1); + chrome::OpenSavedTabGroup(browser(), guid, 1); const SavedTabGroup* saved_tab_group = stg_model->Get(guid); EXPECT_NE(saved_tab_group, nullptr); EXPECT_TRUE(saved_tab_group->tab_group_id().has_value()); @@ -86,11 +78,7 @@ {SavedTabGroupTab(GURL("chrome://newtab"), u"Title", favicon::GetDefaultFavicon(), guid)}, guid)); - chrome::OpenSavedTabGroup( - browser(), base::BindLambdaForTesting([=]() { - return static_cast<content::PageNavigator*>(browser()); - }), - guid, 1); + chrome::OpenSavedTabGroup(browser(), guid, 1); const SavedTabGroup* saved_tab_group = stg_model->Get(guid); @@ -103,11 +91,7 @@ { // Attempt to reopen the STG, it should not open. const int original_tab_count = model->count(); - chrome::OpenSavedTabGroup( - browser(), base::BindLambdaForTesting([=]() { - return static_cast<content::PageNavigator*>(browser()); - }), - guid, 1); + chrome::OpenSavedTabGroup(browser(), guid, 1); const SavedTabGroup* saved_tab_group = stg_model->Get(guid); EXPECT_EQ(saved_tab_group, nullptr);
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc index e072ad4..8d79cfe 100644 --- a/chrome/browser/ui/views/create_application_shortcut_view.cc +++ b/chrome/browser/ui/views/create_application_shortcut_view.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ui/views/create_application_shortcut_view.h" +#include <utility> + #include "base/bind.h" #include "base/callback_helpers.h" #include "build/build_config.h" @@ -118,7 +120,7 @@ prefs::kWebAppCreateOnDesktop); std::unique_ptr<views::Checkbox> menu_check_box; - std::unique_ptr<views::Checkbox> quick_launch_check_box; + std::unique_ptr<views::Checkbox> pin_to_taskbar_checkbox; #if BUILDFLAG(IS_WIN) base::win::Version version = base::win::GetVersion(); @@ -133,12 +135,8 @@ // Only include the pin-to-taskbar option when running on versions of Windows // that support pinning. if (CanPinShortcutToTaskbar()) { - // TODO(crbug.com/1348764): Remove pre-Win7 code and string. - quick_launch_check_box = - AddCheckbox((version >= base::win::Version::WIN7) - ? l10n_util::GetStringUTF16(IDS_PIN_TO_TASKBAR_CHKBOX) - : l10n_util::GetStringUTF16( - IDS_CREATE_SHORTCUTS_QUICK_LAUNCH_BAR_CHKBOX), + pin_to_taskbar_checkbox = + AddCheckbox(l10n_util::GetStringUTF16(IDS_PIN_TO_TASKBAR_CHKBOX), prefs::kWebAppCreateInQuickLaunchBar); } #elif BUILDFLAG(IS_POSIX) @@ -156,8 +154,8 @@ desktop_check_box_ = AddChildView(std::move(desktop_check_box)); if (menu_check_box) menu_check_box_ = AddChildView(std::move(menu_check_box)); - if (quick_launch_check_box) - quick_launch_check_box_ = AddChildView(std::move(quick_launch_check_box)); + if (pin_to_taskbar_checkbox) + quick_launch_check_box_ = AddChildView(std::move(pin_to_taskbar_checkbox)); } gfx::Size CreateChromeApplicationShortcutView::CalculatePreferredSize() const {
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc index cf24c6cc..0f9ae80 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc
@@ -532,8 +532,9 @@ ShowAndVerifyUi(); } +// TODO(crbug.com/1164575): Flaky on all platforms. IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewInteractiveBrowserTest, - InvokeUi_WithRetainedFiles) { + DISABLED_InvokeUi_WithRetainedFiles) { AddRetainedFile(base::FilePath(FILE_PATH_LITERAL("/dev/null"))); AddRetainedFile(base::FilePath(FILE_PATH_LITERAL("/dev/zero"))); AddRetainedFile(base::FilePath(FILE_PATH_LITERAL("/dev/random")));
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 6eab4b8..5482f26 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -2344,6 +2344,11 @@ } bool BrowserView::IsTabStripEditable() const { +#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP) + if (webui_tab_strip_) + return webui_tab_strip_->IsTabStripEditable(); +#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP) + return tabstrip_->IsTabStripEditable(); }
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc index 198cf9e95..c4ae2f4a 100644 --- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc +++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
@@ -58,6 +58,7 @@ #include "content/public/browser/web_ui.h" #include "ui/accessibility/ax_mode.h" #include "ui/accessibility/platform/ax_platform_node.h" +#include "ui/aura/client/drag_drop_client.h" #include "ui/aura/window.h" #include "ui/base/clipboard/clipboard_format_type.h" #include "ui/base/clipboard/custom_data_helper.h" @@ -536,10 +537,26 @@ SetContainerTargetVisibility(true, WebUITabStripOpenCloseReason::kOther); } +bool WebUITabStripContainerView::IsTabStripEditable() { + gfx::NativeWindow root_window = GetContentRootWindow(); + if (root_window == nullptr) + return true; + + aura::client::DragDropClient* dnd_client = + aura::client::GetDragDropClient(root_window); + return !(dnd_client && dnd_client->IsDragDropInProgress()); +} + views::NativeViewHost* WebUITabStripContainerView::GetNativeViewHost() { return web_view_->holder(); } +gfx::NativeWindow WebUITabStripContainerView::GetContentRootWindow() { + return GetNativeViewHost() && GetNativeViewHost()->GetNativeViewContainer() + ? GetNativeViewHost()->GetNativeViewContainer()->GetRootWindow() + : nullptr; +} + std::unique_ptr<views::View> WebUITabStripContainerView::CreateNewTabButton() { DCHECK_EQ(nullptr, new_tab_button_); auto new_tab_button = std::make_unique<ToolbarButton>(
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h index c58039b..ffb36307 100644 --- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h +++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h
@@ -70,8 +70,16 @@ void OpenForTabDrag(); + // Returns true if the tab strip is editable. Returns false if the tab strip + // is being dragged to prevent extensions from messing things up while that's + // happening. + bool IsTabStripEditable(); + views::NativeViewHost* GetNativeViewHost(); + // Gets the root window of the hosted WebContents. + gfx::NativeWindow GetContentRootWindow(); + // Control button. Must only be called once. std::unique_ptr<views::View> CreateNewTabButton(); std::unique_ptr<views::View> CreateTabCounter();
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc index 1bd4401..f039341 100644 --- a/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc +++ b/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc
@@ -18,6 +18,8 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" #include "content/public/test/browser_test.h" +#include "ui/aura/client/drag_drop_client.h" +#include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/pointer/touch_ui_controller.h" #include "ui/views/controls/webview/webview.h" @@ -26,6 +28,37 @@ #include "chromeos/ui/frame/immersive/immersive_fullscreen_controller_test_api.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) +namespace { + +class TestDragDropClient : public aura::client::DragDropClient { + public: + // aura::client::DragDropClient: + ui::mojom::DragOperation StartDragAndDrop( + std::unique_ptr<ui::OSExchangeData> data, + aura::Window* root_window, + aura::Window* source_window, + const gfx::Point& screen_location, + int allowed_operations, + ui::mojom::DragEventSource source) override { + drag_in_progress_ = true; + return ui::mojom::DragOperation::kMove; + } + void DragCancel() override {} + bool IsDragDropInProgress() override { return drag_in_progress_; } + void AddObserver(aura::client::DragDropClientObserver* observer) override {} + void RemoveObserver(aura::client::DragDropClientObserver* observer) override { + } + + void set_drag_in_progress(bool drag_in_progress) { + drag_in_progress_ = drag_in_progress; + } + + private: + bool drag_in_progress_ = false; +}; + +} // namespace + class WebUITabStripInteractiveTest : public InProcessBrowserTest { public: WebUITabStripInteractiveTest() { @@ -131,6 +164,36 @@ EXPECT_FALSE(container->bounds().IsEmpty()); } +IN_PROC_BROWSER_TEST_F(WebUITabStripInteractiveTest, + TabStripIsNotEditableDuringWhenDragging) { + BrowserView* const browser_view = + BrowserView::GetBrowserViewForBrowser(browser()); + + WebUITabStripContainerView* const container = browser_view->webui_tab_strip(); + ASSERT_NE(nullptr, container); + + // Open the tab strip + container->SetVisibleForTesting(true); + browser_view->Layout(); + + // Make sure the tab strip's contents are fully loaded. + ASSERT_TRUE( + WaitForLoadStop(container->web_view_for_testing()->GetWebContents())); + + // Set the drag and drop client with the initial drag state to false. + TestDragDropClient drag_drop_client; + aura::client::SetDragDropClient(container->GetContentRootWindow(), + &drag_drop_client); + + // The tab strip should be default editable. + EXPECT_TRUE(browser_view->IsTabStripEditable()); + + // Simulate a drag and drop session on the drag controller. The tab strip + // should no longer be editable. + drag_drop_client.set_drag_in_progress(true); + EXPECT_FALSE(browser_view->IsTabStripEditable()); +} + #if BUILDFLAG(IS_CHROMEOS_ASH) // Regression test for crbug.com/1112028
diff --git a/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc b/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc index 0289424..03d8e390 100644 --- a/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc +++ b/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "chrome/browser/ui/views/location_bar/star_view.h" #include "chrome/browser/ui/views/page_action/page_action_icon_view.h" +#include "chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h" #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h" #include "chrome/browser/web_applications/install_bounce_metric.h" #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" @@ -50,6 +51,7 @@ #include "services/network/public/cpp/network_switches.h" #include "ui/gfx/color_utils.h" #include "ui/views/view_observer.h" +#include "ui/views/widget/any_widget_observer.h" #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/components/arc/test/arc_util_test_support.h" @@ -298,6 +300,26 @@ expected_buckets); } + void WaitPwaConfirmationBubbleViewShown() { + views::NamedWidgetShownWaiter pwa_confirmation_bubble_id_waiter( + views::test::AnyWidgetTestPasskey(), + "PWAConfirmationBubbleView"); + + pwa_install_view_->ExecuteForTesting(); + pwa_confirmation_bubble_id_waiter.WaitIfNeededAndGet(); + } + + void WaitPwaConfirmationBubbleClosed() { + if (PWAConfirmationBubbleView::IsShowing()) { + base::RunLoop run_loop; + PWAConfirmationBubbleView::GetBubble()->RegisterDeleteDelegateCallback( + run_loop.QuitClosure()); + PWAConfirmationBubbleView::GetBubble()->GetWidget()->CloseWithReason( + views::Widget::ClosedReason::kEscKeyPressed); + run_loop.Run(); + } + } + protected: net::EmbeddedTestServer https_server_; std::string intercept_request_path_; @@ -416,6 +438,35 @@ EXPECT_FALSE(pwa_install_view_->GetVisible()); } +// Tests that the plus icon updates its visibility when PWAConfirmationBubbleView is showing in +// installable tab and switching to non-installable tab. +IN_PROC_BROWSER_TEST_F(PwaInstallViewBrowserTest, + IconVisibilityAfterTabSwitchingWhenPWAConfirmationBubbleViewShowing) { + content::WebContents* installable_web_contents; + { + OpenTabResult result = OpenTab(GetInstallableAppURL()); + installable_web_contents = result.web_contents; + ASSERT_TRUE(result.installable); + } + content::WebContents* non_installable_web_contents; + { + OpenTabResult result = OpenTab(GetNonInstallableAppURL()); + non_installable_web_contents = result.web_contents; + ASSERT_FALSE(result.installable); + } + chrome::SelectPreviousTab(browser()); + ASSERT_EQ(installable_web_contents, GetCurrentTab()); + EXPECT_TRUE(pwa_install_view_->GetVisible()); + + WaitPwaConfirmationBubbleViewShown(); + + chrome::SelectNextTab(browser()); + WaitPwaConfirmationBubbleClosed(); + ASSERT_EQ(non_installable_web_contents, GetCurrentTab()); + EXPECT_FALSE(PWAConfirmationBubbleView::IsShowing()); + EXPECT_FALSE(pwa_install_view_->GetVisible()); +} + // Tests that the install icon updates its visibility when tab crashes. IN_PROC_BROWSER_TEST_F(PwaInstallViewBrowserTest, IconVisibilityAfterTabCrashed) {
diff --git a/chrome/browser/ui/views/tabs/tab_container_impl.cc b/chrome/browser/ui/views/tabs/tab_container_impl.cc index 04fc9d66..12d6993 100644 --- a/chrome/browser/ui/views/tabs/tab_container_impl.cc +++ b/chrome/browser/ui/views/tabs/tab_container_impl.cc
@@ -166,10 +166,10 @@ } TabContainerImpl::TabContainerImpl( - TabContainerController* controller, + TabContainerController& controller, TabHoverCardController* hover_card_controller, TabDragContextBase* drag_context, - TabSlotController* tab_slot_controller, + TabSlotController& tab_slot_controller, views::View* scroll_contents_view) : controller_(controller), hover_card_controller_(hover_card_controller), @@ -373,7 +373,7 @@ void TabContainerImpl::OnGroupCreated(const tab_groups::TabGroupId& group) { auto group_view = std::make_unique<TabGroupViews>( - this, drag_context_, tab_slot_controller_, group); + this, drag_context_, *tab_slot_controller_, group); layout_helper_->InsertGroupHeader(group, group_view->header()); group_views_[group] = std::move(group_view); }
diff --git a/chrome/browser/ui/views/tabs/tab_container_impl.h b/chrome/browser/ui/views/tabs/tab_container_impl.h index a02c966..5f37ca9 100644 --- a/chrome/browser/ui/views/tabs/tab_container_impl.h +++ b/chrome/browser/ui/views/tabs/tab_container_impl.h
@@ -7,6 +7,7 @@ #include <memory> #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/timer/timer.h" #include "chrome/browser/ui/views/frame/browser_root_view.h" #include "chrome/browser/ui/views/tabs/tab.h" @@ -39,10 +40,10 @@ public: METADATA_HEADER(TabContainerImpl); - TabContainerImpl(TabContainerController* controller, + TabContainerImpl(TabContainerController& controller, TabHoverCardController* hover_card_controller, TabDragContextBase* drag_context, - TabSlotController* tab_slot_controller, + TabSlotController& tab_slot_controller, views::View* scroll_contents_view); ~TabContainerImpl() override; @@ -305,17 +306,18 @@ // the remove animation completes. views::ViewModelT<Tab> tabs_view_model_; - raw_ptr<TabContainerController> controller_; + const raw_ref<TabContainerController> controller_; - raw_ptr<TabHoverCardController> hover_card_controller_; + const raw_ptr<TabHoverCardController> hover_card_controller_; // May be nullptr in tests. - raw_ptr<TabDragContextBase> drag_context_; + const raw_ptr<TabDragContextBase> drag_context_; - raw_ptr<TabSlotController> tab_slot_controller_; + const raw_ref<TabSlotController> tab_slot_controller_; - // The View that is to be scrolled by |tab_scrolling_animation_|. - raw_ptr<views::View> scroll_contents_view_; + // The View that is to be scrolled by |tab_scrolling_animation_|. May be + // nullptr in tests. + const raw_ptr<views::View> scroll_contents_view_; // Responsible for animating tabs in response to model changes. views::BoundsAnimator bounds_animator_; @@ -323,7 +325,7 @@ // Responsible for animating the scroll of the tab container. std::unique_ptr<gfx::LinearAnimation> tab_scrolling_animation_; - std::unique_ptr<TabStripLayoutHelper> layout_helper_; + const std::unique_ptr<TabStripLayoutHelper> layout_helper_; // MouseWatcher is used when a tab is closed to reset the layout. std::unique_ptr<views::MouseWatcher> mouse_watcher_;
diff --git a/chrome/browser/ui/views/tabs/tab_container_unittest.cc b/chrome/browser/ui/views/tabs/tab_container_unittest.cc index b6d732a3..c73b2a0c 100644 --- a/chrome/browser/ui/views/tabs/tab_container_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_container_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/tabs/tab_container_impl.h" #include <memory> +#include "base/memory/raw_ref.h" #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h" #include "chrome/browser/ui/views/tabs/fake_tab_slot_controller.h" @@ -48,7 +49,7 @@ class FakeTabContainerController final : public TabContainerController { public: - explicit FakeTabContainerController(TabStripController* tab_strip_controller) + explicit FakeTabContainerController(TabStripController& tab_strip_controller) : tab_strip_controller_(tab_strip_controller) {} ~FakeTabContainerController() override = default; @@ -84,7 +85,7 @@ } private: - raw_ptr<TabStripController> tab_strip_controller_; + const raw_ref<TabStripController> tab_strip_controller_; }; } // namespace @@ -100,7 +101,7 @@ tab_strip_controller_ = std::make_unique<FakeBaseTabStripController>(); tab_container_controller_ = std::make_unique<FakeTabContainerController>( - tab_strip_controller_.get()); + *(tab_strip_controller_.get())); tab_slot_controller_ = std::make_unique<FakeTabSlotController>(tab_strip_controller_.get()); @@ -108,9 +109,9 @@ std::make_unique<FakeTabDragContext>(); std::unique_ptr<TabContainer> tab_container = std::make_unique<TabContainerImpl>( - tab_container_controller_.get(), nullptr /*hover_card_controller*/, - drag_context.get(), tab_slot_controller_.get(), - nullptr /*scroll_contents_view*/); + *(tab_container_controller_.get()), + nullptr /*hover_card_controller*/, drag_context.get(), + *(tab_slot_controller_.get()), nullptr /*scroll_contents_view*/); tab_container->SetAvailableWidthCallback(base::BindRepeating( [](TabContainerTest* test) { return test->tab_container_width_; }, this));
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.cc b/chrome/browser/ui/views/tabs/tab_group_header.cc index b368633..48e148ea8e 100644 --- a/chrome/browser/ui/views/tabs/tab_group_header.cc +++ b/chrome/browser/ui/views/tabs/tab_group_header.cc
@@ -85,12 +85,10 @@ } // namespace -TabGroupHeader::TabGroupHeader(TabSlotController* tab_slot_controller, +TabGroupHeader::TabGroupHeader(TabSlotController& tab_slot_controller, const tab_groups::TabGroupId& group) : tab_slot_controller_(tab_slot_controller), editor_bubble_tracker_(tab_slot_controller) { - DCHECK(tab_slot_controller); - set_group(group); set_context_menu_controller(this); @@ -515,7 +513,7 @@ END_METADATA TabGroupHeader::EditorBubbleTracker::EditorBubbleTracker( - TabSlotController* tab_slot_controller) + TabSlotController& tab_slot_controller) : tab_slot_controller_(tab_slot_controller) {} TabGroupHeader::EditorBubbleTracker::~EditorBubbleTracker() {
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.h b/chrome/browser/ui/views/tabs/tab_group_header.h index 390b48b..7a8f21d 100644 --- a/chrome/browser/ui/views/tabs/tab_group_header.h +++ b/chrome/browser/ui/views/tabs/tab_group_header.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_HEADER_H_ #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/time/time.h" #include "chrome/browser/ui/views/tabs/tab_slot_view.h" #include "components/tab_groups/tab_group_id.h" @@ -32,7 +33,7 @@ public: METADATA_HEADER(TabGroupHeader); - TabGroupHeader(TabSlotController* tab_slot_controller, + TabGroupHeader(TabSlotController& tab_slot_controller, const tab_groups::TabGroupId& group); TabGroupHeader(const TabGroupHeader&) = delete; TabGroupHeader& operator=(const TabGroupHeader&) = delete; @@ -81,7 +82,7 @@ // collapsed. void LogCollapseTime(); - const raw_ptr<TabSlotController> tab_slot_controller_; + const raw_ref<TabSlotController> tab_slot_controller_; raw_ptr<views::View> title_chip_; raw_ptr<views::Label> title_; @@ -96,7 +97,7 @@ // at once. class EditorBubbleTracker : public views::WidgetObserver { public: - explicit EditorBubbleTracker(TabSlotController* tab_slot_controller); + explicit EditorBubbleTracker(TabSlotController& tab_slot_controller); ~EditorBubbleTracker() override; void Opened(views::Widget* bubble_widget); @@ -111,7 +112,7 @@ raw_ptr<views::Widget> widget_; // Outlives this because it's a dependency inversion interface for the // header's parent View. - raw_ptr<TabSlotController> tab_slot_controller_; + raw_ref<TabSlotController> tab_slot_controller_; }; EditorBubbleTracker editor_bubble_tracker_;
diff --git a/chrome/browser/ui/views/tabs/tab_group_views.cc b/chrome/browser/ui/views/tabs/tab_group_views.cc index c633af66..56a7fb5 100644 --- a/chrome/browser/ui/views/tabs/tab_group_views.cc +++ b/chrome/browser/ui/views/tabs/tab_group_views.cc
@@ -26,11 +26,11 @@ TabGroupViews::TabGroupViews(views::View* container_view, views::View* drag_container_view, - TabSlotController* tab_slot_controller, + TabSlotController& tab_slot_controller, const tab_groups::TabGroupId& group) : tab_slot_controller_(tab_slot_controller), group_(group) { header_ = container_view->AddChildView( - std::make_unique<TabGroupHeader>(tab_slot_controller_, group_)); + std::make_unique<TabGroupHeader>(*tab_slot_controller_, group_)); underline_ = container_view->AddChildView( std::make_unique<TabGroupUnderline>(this, group_)); drag_underline_ = drag_container_view->AddChildView(
diff --git a/chrome/browser/ui/views/tabs/tab_group_views.h b/chrome/browser/ui/views/tabs/tab_group_views.h index c9c95f3..fcb83eb 100644 --- a/chrome/browser/ui/views/tabs/tab_group_views.h +++ b/chrome/browser/ui/views/tabs/tab_group_views.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_VIEWS_H_ #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "chrome/browser/ui/views/tabs/tab_slot_controller.h" #include "components/tab_groups/tab_group_id.h" #include "third_party/skia/include/core/SkColor.h" @@ -26,7 +27,7 @@ // views are not destroyed before |this|. TabGroupViews(views::View* container_view, views::View* drag_container_view, - TabSlotController* tab_slot_controller, + TabSlotController& tab_slot_controller, const tab_groups::TabGroupId& group); // Destroys the views added during the constructor. @@ -61,7 +62,7 @@ SkColor GetGroupBackgroundColor() const; private: - const raw_ptr<TabSlotController> tab_slot_controller_; + const raw_ref<TabSlotController> tab_slot_controller_; const tab_groups::TabGroupId group_; raw_ptr<TabGroupHeader> header_; raw_ptr<TabGroupHighlight> highlight_;
diff --git a/chrome/browser/ui/views/tabs/tab_group_views_unittest.cc b/chrome/browser/ui/views/tabs/tab_group_views_unittest.cc index 55f0815..45e6478 100644 --- a/chrome/browser/ui/views/tabs/tab_group_views_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_group_views_unittest.cc
@@ -34,8 +34,8 @@ tab_slot_controller_ = std::make_unique<FakeTabSlotController>(tab_strip_controller_.get()); group_views_ = std::make_unique<TabGroupViews>( - tab_container_.get(), drag_context_.get(), tab_slot_controller_.get(), - id_); + tab_container_.get(), drag_context_.get(), + *(tab_slot_controller_.get()), id_); } void TearDown() override {
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 0d5eb2f59..7325943 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -571,7 +571,7 @@ bounds_animator_.AnimateViewTo( view, ideal_bounds, std::make_unique<ResetDraggingStateDelegate>( - tab_strip_->tab_container_, view)); + *tab_strip_->tab_container_, *view)); } } @@ -653,8 +653,8 @@ // |tab_container_|. class ResetDraggingStateDelegate : public gfx::AnimationDelegate { public: - ResetDraggingStateDelegate(TabContainer* tab_container, - TabSlotView* slot_view) + ResetDraggingStateDelegate(TabContainer& tab_container, + TabSlotView& slot_view) : tab_container_(tab_container), slot_view_(slot_view) { slot_view_->set_animating(true); } @@ -664,14 +664,14 @@ ~ResetDraggingStateDelegate() override = default; void AnimationProgressed(const gfx::Animation* animation) override { - tab_container_->OnTabSlotAnimationProgressed(slot_view_); + tab_container_->OnTabSlotAnimationProgressed(&*slot_view_); } void AnimationEnded(const gfx::Animation* animation) override { AnimationProgressed(animation); slot_view_->set_animating(false); slot_view_->set_dragging(false); - tab_container_->StoppedDraggingView(slot_view_); + tab_container_->StoppedDraggingView(&*slot_view_); } void AnimationCanceled(const gfx::Animation* animation) override { @@ -679,8 +679,8 @@ } private: - const raw_ptr<TabContainer> tab_container_; - const raw_ptr<TabSlotView> slot_view_; + const raw_ref<TabContainer> tab_container_; + const raw_ref<TabSlotView> slot_view_; }; gfx::Rect ideal_bounds(int i) const { return tab_strip_->ideal_bounds(i); } @@ -887,12 +887,12 @@ TabStrip::TabStrip(std::unique_ptr<TabStripController> controller) : controller_(std::move(controller)), hover_card_controller_(std::make_unique<TabHoverCardController>(this)), - drag_context_(AddChildView(std::make_unique<TabDragContextImpl>(this))), - tab_container_(AddChildViewAt( - std::make_unique<TabContainerImpl>(this, + drag_context_(*AddChildView(std::make_unique<TabDragContextImpl>(this))), + tab_container_(*AddChildViewAt( + std::make_unique<TabContainerImpl>(*this, hover_card_controller_.get(), - drag_context_.get(), - this, + &*drag_context_, + *this, this), 0)) { // TODO(pbos): This is probably incorrect, the background of individual tabs @@ -917,8 +917,8 @@ // |tab_container_|'s tabs may call back to us or to |drag_context_| from // their destructors. Delete them first so that if they call back we aren't in // a weird state. - RemoveChildViewT(tab_container_); - RemoveChildViewT(drag_context_); + RemoveChildViewT(&*tab_container_); + RemoveChildViewT(&*drag_context_); CHECK(!IsInObserverList()); } @@ -1319,7 +1319,7 @@ } TabDragContext* TabStrip::GetDragContext() { - return drag_context_.get(); + return &*drag_context_; } int TabStrip::GetPinnedTabCount() const { @@ -1809,7 +1809,7 @@ views::SizeBounds TabStrip::GetAvailableSize(const views::View* child) const { // We can only reach here if SetAvailableWidthCallback() was never called, // e.g. if tab scrolling is disabled. Defer to our parent. - DCHECK(child == tab_container_); + DCHECK(child == &*tab_container_); return parent()->GetAvailableSize(this); } @@ -1901,7 +1901,7 @@ // With tab scrolling enabled, we instead ignore the size of our container // and simply match TabContainer's size unconditionally. SetLayoutManager(std::make_unique<views::FillLayout>()) - ->SetChildViewIgnoredByLayout(drag_context_, true); + ->SetChildViewIgnoredByLayout(&*drag_context_, true); } }
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h index b081a73d..baf088f0 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.h +++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -12,6 +12,7 @@ #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/memory/ref_counted.h" #include "base/observer_list.h" #include "base/scoped_observation.h" @@ -450,10 +451,10 @@ std::unique_ptr<TabHoverCardController> hover_card_controller_; - raw_ptr<TabDragContextImpl> drag_context_; + raw_ref<TabDragContextImpl> drag_context_; // The View parent for the tabs and the various group views. - raw_ptr<TabContainer> tab_container_; + raw_ref<TabContainer> tab_container_; // The background offset used by inactive tabs to match the frame image. int background_offset_ = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc index b0d6f3d..4a224412 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc
@@ -66,7 +66,7 @@ }; TabStripLayoutHelper::TabStripLayoutHelper( - const TabContainerController* controller, + const TabContainerController& controller, GetTabsCallback get_tabs_callback) : controller_(controller), get_tabs_callback_(get_tabs_callback),
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h index 197a425a..f56a8aa 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h +++ b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h
@@ -9,7 +9,7 @@ #include "base/callback.h" #include "base/callback_forward.h" -#include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "chrome/browser/ui/tabs/tab_types.h" #include "chrome/browser/ui/views/tabs/tab_layout_state.h" #include "chrome/browser/ui/views/tabs/tab_slot_view.h" @@ -34,7 +34,7 @@ public: using GetTabsCallback = base::RepeatingCallback<views::ViewModelT<Tab>*()>; - TabStripLayoutHelper(const TabContainerController* controller, + TabStripLayoutHelper(const TabContainerController& controller, GetTabsCallback get_tabs_callback); TabStripLayoutHelper(const TabStripLayoutHelper&) = delete; TabStripLayoutHelper& operator=(const TabStripLayoutHelper&) = delete; @@ -154,7 +154,7 @@ bool SlotIsCollapsedTab(int i) const; // The owning TabContainer's controller. - const raw_ptr<const TabContainerController> controller_; + const raw_ref<const TabContainerController> controller_; // Callback to get the necessary View objects from the owning tabstrip. GetTabsCallback get_tabs_callback_;
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc index 00f299c..04e0b97 100644 --- a/chrome/browser/ui/views/toolbar/app_menu.cc +++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -1244,12 +1244,8 @@ // TODO(oshima): Replace with views only API. views::Widget* parent = views::Widget::GetWidgetForNativeWindow( browser_->window()->GetNativeWindow()); - bookmark_menu_delegate_ = std::make_unique<BookmarkMenuDelegate>( - browser_, - base::BindRepeating( - [](content::PageNavigator* navigator) { return navigator; }, - browser_), - parent); + bookmark_menu_delegate_ = + std::make_unique<BookmarkMenuDelegate>(browser_, parent); bookmark_menu_delegate_->Init(this, bookmark_menu_, model->bookmark_bar_node(), 0, BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS,
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc b/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc index f692591..445f1bb 100644 --- a/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc +++ b/chrome/browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc
@@ -168,8 +168,8 @@ TEST_P(ButtonLayoutTest, Layout) { AddChildViews(); + // Layout will be done through SetBounds. host()->SetBounds(0, 0, GetExpectedWidth(), GetExpectedHeight()); - layout()->Layout(host()); ExpectViewBoundsEquals(host()->children()[0], GetExpectedButtonBounds(1)); if (has_two_buttons())
diff --git a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc index 2e5f04ff..9da48591 100644 --- a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc +++ b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
@@ -103,13 +103,14 @@ PWAConfirmationBubbleView::PWAConfirmationBubbleView( views::View* anchor_view, - views::Button* highlight_button, + PageActionIconView* highlight_icon_button, std::unique_ptr<WebAppInstallInfo> web_app_info, chrome::AppInstallationAcceptanceCallback callback, chrome::PwaInProductHelpState iph_state, PrefService* prefs, feature_engagement::Tracker* tracker) : LocationBarBubbleDelegateView(anchor_view, nullptr), + highlight_icon_button_(highlight_icon_button), web_app_info_(std::move(web_app_info)), callback_(std::move(callback)), iph_state_(iph_state), @@ -170,7 +171,7 @@ web_app::UserDisplayMode::kTabbed); } - SetHighlightedButton(highlight_button); + SetHighlightedButton(highlight_icon_button_); } PWAConfirmationBubbleView::~PWAConfirmationBubbleView() = default; @@ -190,6 +191,9 @@ DCHECK_EQ(g_bubble_, this); g_bubble_ = nullptr; + if (highlight_icon_button_) + highlight_icon_button_->Update(); + // If |web_app_info_| is populated, then the bubble was not accepted. if (web_app_info_) { base::RecordAction(base::UserMetricsAction("WebAppInstallCancelled")); @@ -226,6 +230,11 @@ return true; } +void PWAConfirmationBubbleView::OnBeforeBubbleWidgetInit(views::Widget::InitParams* params, + views::Widget* widget) const { + params->name = "PWAConfirmationBubbleView"; +} + namespace chrome { void ShowPWAInstallBubble(content::WebContents* web_contents,
diff --git a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h index e947da7..cb52e0da 100644 --- a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h +++ b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h
@@ -21,6 +21,8 @@ class Tracker; } +class PageActionIconView; + // PWAConfirmationBubbleView provides a bubble dialog for accepting or rejecting // the installation of a PWA (Progressive Web App) anchored off the PWA install // icon in the omnibox. @@ -30,7 +32,7 @@ static PWAConfirmationBubbleView* GetBubble(); PWAConfirmationBubbleView(views::View* anchor_view, - views::Button* highlight_button, + PageActionIconView* highlight_icon_button, std::unique_ptr<WebAppInstallInfo> web_app_info, chrome::AppInstallationAcceptanceCallback callback, chrome::PwaInProductHelpState iph_state, @@ -49,7 +51,11 @@ void WindowClosing() override; bool Accept() override; + protected: + void OnBeforeBubbleWidgetInit(views::Widget::InitParams* params, + views::Widget* widget) const override; private: + PageActionIconView* highlight_icon_button_ = nullptr; std::unique_ptr<WebAppInstallInfo> web_app_info_; chrome::AppInstallationAcceptanceCallback callback_;
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc index 2a56d0a0..492b58d 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc
@@ -57,11 +57,11 @@ } IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckCreateShortcutFromChromeApps) { + CheckCreateShortcuts) { helper_.InstallCreateShortcutWindowed(Site::kSiteA); helper_.DeletePlatformShortcut(Site::kSiteA); helper_.CheckPlatformShortcutNotExists(Site::kSiteA); - helper_.CreateShortcutFromChromeApps(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); } @@ -1699,7 +1699,55 @@ IN_PROC_BROWSER_TEST_F( WebAppIntegrationBrowserTestMacWinLinux, - WebAppIntegration_30SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + WebAppIntegration_33SiteA_12SiteA_112SiteANotShown_72SiteA_7SiteA_1SiteA_24) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut(Site::kSiteA); + helper_.CheckAppInListWindowed(Site::kSiteA); + helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); + helper_.CreateShortcuts(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckWindowCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_74SiteA_72SiteA_1SiteA_22) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut(Site::kSiteA); + helper_.CheckAppInListTabbed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.DeletePlatformShortcut(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckTabCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_74SiteA_72SiteA_1SiteA_22) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed(Site::kSiteA); + helper_.CheckAppInListTabbed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.DeletePlatformShortcut(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckTabCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA_72SiteA_1SiteA_24) { // Test contents are generated by script. Please do not modify! // See `docs/webapps/why-is-this-test-failing.md` or // `docs/webaps/integration-testing-framework` for more info. @@ -1710,11 +1758,14 @@ helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); helper_.DeletePlatformShortcut(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckWindowCreated(); } IN_PROC_BROWSER_TEST_F( WebAppIntegrationBrowserTestMacWinLinux, - WebAppIntegration_31SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA_72SiteA_1SiteA_24) { // Test contents are generated by script. Please do not modify! // See `docs/webapps/why-is-this-test-failing.md` or // `docs/webaps/integration-testing-framework` for more info. @@ -1725,11 +1776,14 @@ helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); helper_.DeletePlatformShortcut(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckWindowCreated(); } IN_PROC_BROWSER_TEST_F( WebAppIntegrationBrowserTestMacWinLinux, - WebAppIntegration_47SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA_72SiteA_1SiteA_24) { // Test contents are generated by script. Please do not modify! // See `docs/webapps/why-is-this-test-failing.md` or // `docs/webaps/integration-testing-framework` for more info. @@ -1740,11 +1794,29 @@ helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); helper_.DeletePlatformShortcut(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckWindowCreated(); } IN_PROC_BROWSER_TEST_F( WebAppIntegrationBrowserTestMacWinLinux, - WebAppIntegration_49SiteA_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + WebAppIntegration_32SiteA_11SiteA_72SiteA_7SiteA_1SiteA_22) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut(Site::kSiteA); + helper_.CheckAppInListTabbed(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckTabCreated(); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_112SiteANotShown_74SiteA_72SiteA_1SiteA_24) { // Test contents are generated by script. Please do not modify! // See `docs/webapps/why-is-this-test-failing.md` or // `docs/webaps/integration-testing-framework` for more info. @@ -1754,30 +1826,9 @@ helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); helper_.DeletePlatformShortcut(Site::kSiteA); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - WebAppIntegration_48SiteA_11SiteA_7SiteA_74SiteA) { - // Test contents are generated by script. Please do not modify! - // See `docs/webapps/why-is-this-test-failing.md` or - // `docs/webaps/integration-testing-framework` for more info. - // Sheriffs: Disabling this test is supported. - helper_.InstallPolicyAppTabbedShortcut(Site::kSiteA); - helper_.CheckAppInListTabbed(Site::kSiteA); - helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); - helper_.DeletePlatformShortcut(Site::kSiteA); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - WebAppIntegration_29SiteA_11SiteA_7SiteA_74SiteA) { - // Test contents are generated by script. Please do not modify! - // See `docs/webapps/why-is-this-test-failing.md` or - // `docs/webaps/integration-testing-framework` for more info. - // Sheriffs: Disabling this test is supported. - helper_.InstallCreateShortcutTabbed(Site::kSiteA); - helper_.CheckAppInListTabbed(Site::kSiteA); - helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); - helper_.DeletePlatformShortcut(Site::kSiteA); + helper_.CreateShortcuts(Site::kSiteA); + helper_.LaunchFromPlatformShortcut(Site::kSiteA); + helper_.CheckWindowCreated(); } } // namespace
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 71bbde1..cf5f19d4 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
@@ -1051,7 +1051,7 @@ #endif } -void WebAppIntegrationTestDriver::CreateShortcutFromChromeApps(Site site) { +void WebAppIntegrationTestDriver::CreateShortcuts(Site site) { #if !BUILDFLAG(IS_CHROMEOS) BeforeStateChangeAction(__FUNCTION__); AppId app_id = GetAppIdBySiteMode(site); @@ -1113,6 +1113,7 @@ #elif BUILDFLAG(IS_LINUX) base::FilePath desktop_shortcut_path = GetShortcutPath(shortcut_override_->desktop.GetPath(), app_name, app_id); + LOG(INFO) << desktop_shortcut_path; ASSERT_TRUE(base::PathExists(desktop_shortcut_path)); base::DeleteFile(desktop_shortcut_path); #else
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h index 3de37fa..b9fd99d 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -214,7 +214,7 @@ void LaunchFromPlatformShortcut(Site site); void OpenAppSettingsFromChromeApps(Site site); void OpenAppSettingsFromAppMenu(Site site); - void CreateShortcutFromChromeApps(Site site); + void CreateShortcuts(Site site); void NavigateBrowser(Site site); void NavigatePwaSiteAFooTo(Site site); void NavigatePwaSiteATo(Site site);
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc index b680082..7fd3b89 100644 --- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc +++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -388,8 +388,10 @@ // | contents_web_view | // | ... | // |-------------------------| + // In the RTL case, the bubble is aligned towards the left side of the screen + // and hence the x-axis offset needs to be in the opposite direction. return views::BubbleDialogDelegateView::GetBubbleBounds() + - gfx::Vector2d(-kRightMargin, + gfx::Vector2d(base::i18n::IsRTL() ? kRightMargin : -kRightMargin, GetWidget()->client_view()->GetPreferredSize().height() + kTopMargin); }
diff --git a/chrome/browser/ui/webui/DEPS b/chrome/browser/ui/webui/DEPS index fa8286d..efbf8567 100644 --- a/chrome/browser/ui/webui/DEPS +++ b/chrome/browser/ui/webui/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+ash/components/account_manager", "+ash/components/audio", "+ash/webui/os_feedback_ui", "+components/app_constants",
diff --git a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc index 016931d..df11f5a5 100644 --- a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "ash/components/account_manager/account_manager_factory.h" #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" @@ -19,6 +18,7 @@ #include "chrome/browser/profiles/profile_key.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/image_fetcher/core/image_fetcher_service.h" #include "components/image_fetcher/core/request_metadata.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/OWNERS b/chrome/browser/ui/webui/settings/chromeos/OWNERS index 37ddeebc..aac0619 100644 --- a/chrome/browser/ui/webui/settings/chromeos/OWNERS +++ b/chrome/browser/ui/webui/settings/chromeos/OWNERS
@@ -2,5 +2,5 @@ per-file languages_section*=file://chrome/browser/resources/settings/chromeos/os_languages_page/OWNERS per-file multidevice_handler*=file://ash/components/multidevice/OWNERS -per-file account_manager_*=file://ash/components/account_manager/OWNERS +per-file account_manager_*=file://chromeos/ash/components/account_manager/OWNERS per-file apps_section*=file://chrome/browser/ui/webui/app_management/OWNERS
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc index d04ef53..eb0abce 100644 --- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/notifier_catalogs.h" #include "ash/public/cpp/system/toast_data.h" #include "ash/public/cpp/system/toast_manager.h" @@ -24,6 +23,7 @@ #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" #include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account_manager_facade.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h" #include "components/signin/public/base/consent_level.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc index 0a366ec..6620ce0a 100644 --- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
@@ -7,7 +7,6 @@ #include <memory> #include <ostream> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/ash_features.h" #include "base/test/bind.h" #include "chrome/browser/ash/account_manager/account_apps_availability.h" @@ -20,6 +19,7 @@ #include "chrome/browser/supervised_user/supervised_user_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account_manager_facade.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/people_section.cc b/chrome/browser/ui/webui/settings/chromeos/people_section.cc index e2da46b7..d26c0e9 100644 --- a/chrome/browser/ui/webui/settings/chromeos/people_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/people_section.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/webui/settings/chromeos/people_section.h" -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "base/bind.h" @@ -42,6 +41,7 @@ #include "chrome/common/webui_url_constants.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account_manager_facade.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h" #include "components/account_manager_core/pref_names.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc b/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc index 47f3c01..d9332d4 100644 --- a/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc
@@ -342,6 +342,9 @@ html_source->AddBoolean("showPrivacyHub", ash::features::IsCrosPrivacyHubEnabled()); + html_source->AddBoolean("showPrivacyHubFuture", + ash::features::IsCrosPrivacyHubFutureEnabled()); + html_source->AddString( "smartPrivacyDesc", ui::SubstituteChromeOSDeviceType(IDS_OS_SETTINGS_SMART_PRIVACY_DESC));
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 210d9b49..5c39581 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -765,6 +765,8 @@ IDS_SETTINGS_LANGUAGES_OFFER_TO_TRANSLATE_IN_THIS_LANGUAGE}, {"offerToEnableTranslate", IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE}, + {"offerToEnableTranslateSublabel", + IDS_SETTINGS_LANGUAGES_OFFER_TO_ENABLE_TRANSLATE_SUBLABEL}, {"noLanguagesAdded", IDS_SETTINGS_LANGUAGES_NO_LANGUAGES_ADDED}, {"translatePageTitle", IDS_SETTINGS_TRANSLATE_PAGE_TITLE}, {"automaticallyTranslateLanguages",
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index ab64bd8..0de1727 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -101,7 +101,6 @@ #endif // !BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/components/arc/arc_util.h" #include "ash/components/login/auth/password_visibility_utils.h" #include "ash/components/phonehub/phone_hub_manager.h" @@ -123,6 +122,7 @@ #include "chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h" #include "chrome/common/chrome_switches.h" #include "chrome/grit/browser_resources.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h" #include "components/user_manager/user.h"
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc index 7a573c9..4bb1886 100644 --- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/ui/bookmarks/bookmark_context_menu_controller.h" #include "chrome/browser/ui/bookmarks/bookmark_editor.h" #include "chrome/browser/ui/bookmarks/bookmark_stats.h" +#include "chrome/browser/ui/bookmarks/bookmark_utils_desktop.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator.h" @@ -50,9 +51,6 @@ this, browser, browser->profile(), - base::BindRepeating( - [](content::PageNavigator* navigator) { return navigator; }, - browser), BOOKMARK_LAUNCH_LOCATION_SIDE_PANEL_CONTEXT_MENU, bookmark->parent(), {bookmark}))) { @@ -141,10 +139,7 @@ click_modifiers->middle_button, click_modifiers->alt_key, click_modifiers->ctrl_key, click_modifiers->meta_key, click_modifiers->shift_key); - content::OpenURLParams params(bookmark_node->url(), content::Referrer(), - open_location, - ui::PAGE_TRANSITION_AUTO_BOOKMARK, false); - browser->OpenURL(params); + chrome::OpenAllIfAllowed(browser, {bookmark_node}, open_location, false); base::RecordAction(base::UserMetricsAction("SidePanel.Bookmarks.Navigation")); RecordBookmarkLaunch( parent_folder_depth > 0 ? BOOKMARK_LAUNCH_LOCATION_SIDE_PANEL_SUBFOLDER
diff --git a/chrome/browser/ui/webui/signin/OWNERS b/chrome/browser/ui/webui/signin/OWNERS index dcf4b25..bd7918d7 100644 --- a/chrome/browser/ui/webui/signin/OWNERS +++ b/chrome/browser/ui/webui/signin/OWNERS
@@ -10,5 +10,5 @@ per-file inline_login_handler_impl*=file://chrome/credential_provider/OWNERS per-file inline_login_handler.*=file://chrome/credential_provider/OWNERS -per-file inline_login_*_chromeos*=file://ash/components/account_manager/OWNERS -per-file signin_helper_chromeos.*=file://ash/components/account_manager/OWNERS +per-file inline_login_*_chromeos*=file://chromeos/ash/components/account_manager/OWNERS +per-file signin_helper_chromeos.*=file://chromeos/ash/components/account_manager/OWNERS
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc index 9caaee8..413d672 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -7,7 +7,6 @@ #include <memory> #include <string> -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/ash_pref_names.h" #include "base/base64.h" #include "base/callback_helpers.h" @@ -28,6 +27,7 @@ #include "chrome/browser/ui/webui/signin/inline_login_handler.h" #include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/version/version_loader.h" #include "components/account_manager_core/account.h" #include "components/account_manager_core/account_manager_facade.h"
diff --git a/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc b/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc index 9cb81e09a..448a54e 100644 --- a/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc +++ b/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h" -#include "ash/components/account_manager/account_manager_factory.h" #include "ash/constants/ash_features.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" @@ -17,6 +16,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
diff --git a/chrome/browser/ui/webui/welcome/helpers.cc b/chrome/browser/ui/webui/welcome/helpers.cc index aabb2a3..7ad633d 100644 --- a/chrome/browser/ui/webui/welcome/helpers.cc +++ b/chrome/browser/ui/webui/welcome/helpers.cc
@@ -93,10 +93,8 @@ } bool CanShowSetDefaultModule(const policy::PolicyMap& policies) { -#if !BUILDFLAG(IS_FUCHSIA) if (IsPolicySetAndFalse(policies, policy::key::kDefaultBrowserSettingEnabled)) return false; -#endif return true; }
diff --git a/chrome/browser/upgrade_detector/installed_version_updater_chromeos_unittest.cc b/chrome/browser/upgrade_detector/installed_version_updater_chromeos_unittest.cc index c78532f3..1395868 100644 --- a/chrome/browser/upgrade_detector/installed_version_updater_chromeos_unittest.cc +++ b/chrome/browser/upgrade_detector/installed_version_updater_chromeos_unittest.cc
@@ -13,7 +13,6 @@ #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" #include "chromeos/ash/components/dbus/update_engine/update_engine.pb.h" #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -26,7 +25,6 @@ class InstalledVersionUpdaterTest : public ::testing::Test { protected: InstalledVersionUpdaterTest() { - chromeos::DBusThreadManager::Initialize(); fake_update_engine_client_ = ash::UpdateEngineClient::InitializeFakeForTest(); @@ -38,7 +36,6 @@ // Be kind; rewind. ash::UpdateEngineClient::Shutdown(); - chromeos::DBusThreadManager::Shutdown(); } void NotifyStatusChanged(update_engine::StatusResult status) {
diff --git a/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc b/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc index e0c7cc8..18bb046 100644 --- a/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc +++ b/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc
@@ -21,7 +21,6 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "components/prefs/testing_pref_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -95,7 +94,6 @@ scoped_local_state_.Get()->SetUserPref(prefs::kAttemptedToEnableAutoupdate, std::make_unique<base::Value>(true)); - chromeos::DBusThreadManager::Initialize(); fake_update_engine_client_ = ash::UpdateEngineClient::InitializeFakeForTest(); @@ -120,7 +118,6 @@ tzset(); ash::UpdateEngineClient::Shutdown(); - chromeos::DBusThreadManager::Shutdown(); } const base::Clock* GetMockClock() { return task_environment_.GetMockClock(); }
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index fc9aea9..25035c2e1 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -61,6 +61,7 @@ "manifest_update_task.h", "os_integration/os_integration_manager.cc", "os_integration/os_integration_manager.h", + "os_integration/os_integration_sub_manager.h", "os_integration/url_handler_manager.cc", "os_integration/url_handler_manager.h", "os_integration/web_app_file_handler_manager.cc",
diff --git a/chrome/browser/web_applications/commands/install_isolated_app_command.cc b/chrome/browser/web_applications/commands/install_isolated_app_command.cc index 9ce9c8bf..b0f38c3b6 100644 --- a/chrome/browser/web_applications/commands/install_isolated_app_command.cc +++ b/chrome/browser/web_applications/commands/install_isolated_app_command.cc
@@ -89,6 +89,15 @@ return; } + // TODO(kuragin): Fix order of calls to the data retrieve. + // + // The order should be: + // 1. |GetWebAppInstallInfo| + // 2. |CheckInstallabilityAndRetrieveManifest| + // 3. |GetIcons| + // + // See install from sync command unit-test for details: + // https://crsrc.org/c/chrome/browser/web_applications/commands/install_from_sync_command_unittest.cc;l=333;drc=ddce2fc4e67fd4500d29cbe5f4993b3fb8e4e2ba data_retriever_->CheckInstallabilityAndRetrieveManifest( shared_web_contents(), /*bypass_service_worker_check=*/false, @@ -129,32 +138,12 @@ DCHECK(!manifest_url.is_empty()) << "must not be empty if manifest is not empty."; - // TODO(kuragin): Fix order of calls to the data retrieve. - // - // The order should be: - // 1. |GetWebAppInstallInfo| - // 2. |CheckInstallabilityAndRetrieveManifest| - // 3. |GetIcons| - // - // See install from sync command unit-test for details: - // https://crsrc.org/c/chrome/browser/web_applications/commands/install_from_sync_command_unittest.cc;l=333;drc=ddce2fc4e67fd4500d29cbe5f4993b3fb8e4e2ba - data_retriever_->GetWebAppInstallInfo( - shared_web_contents(), - base::BindOnce(&InstallIsolatedAppCommand::OnGetWebAppInstallInfo, - weak_factory_.GetWeakPtr())); + FinalizeInstall(); } -void InstallIsolatedAppCommand::OnGetWebAppInstallInfo( - std::unique_ptr<WebAppInstallInfo> install_info) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (install_info == nullptr) { - ReportFailure(); - return; - } - +void InstallIsolatedAppCommand::FinalizeInstall() { install_finalizer_.FinalizeInstall( - *install_info, + WebAppInstallInfo{}, // TODO(kuragin): Add Isolated app specific install source // `WebappInstallSource::ISOLATED_APP_DEV_INSTALL`. WebAppInstallFinalizer::FinalizeOptions{
diff --git a/chrome/browser/web_applications/commands/install_isolated_app_command.h b/chrome/browser/web_applications/commands/install_isolated_app_command.h index 5beb12cc0..465f63c 100644 --- a/chrome/browser/web_applications/commands/install_isolated_app_command.h +++ b/chrome/browser/web_applications/commands/install_isolated_app_command.h
@@ -16,7 +16,6 @@ #include "third_party/blink/public/mojom/manifest/manifest.mojom-forward.h" class GURL; -struct WebAppInstallInfo; namespace web_app { class WebAppDataRetriever; @@ -64,7 +63,7 @@ const GURL& manifest_url, bool valid_manifest_for_web_app, bool is_installable); - void OnGetWebAppInstallInfo(std::unique_ptr<WebAppInstallInfo> install_info); + void FinalizeInstall(); SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc b/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc index a6bb87b..6ec1f6d 100644 --- a/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc +++ b/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc
@@ -64,28 +64,11 @@ return GURL{"http://defaul-non-empty-url.com/manifest.json"}; } -std::unique_ptr<WebAppInstallInfo> CreateWebAppInstallInfo( - GURL start_url, - base::StringPiece manifest_id) { - WebAppInstallInfo install_info; - install_info.start_url = start_url; - install_info.manifest_id = std::string{manifest_id}; - - return std::make_unique<WebAppInstallInfo>(std::move(install_info)); -} - -std::unique_ptr<WebAppInstallInfo> CreateDefaultWebAppInstallInfo() { - return CreateWebAppInstallInfo( - /*start_url=*/GURL{"http://test-start-url.com"}, - /*manifest_id=*/"test manifest id"); -} - std::unique_ptr<MockDataRetriever> CreateDefaultDataRetriever() { std::unique_ptr<MockDataRetriever> fake_data_retriever = std::make_unique<NiceMock<MockDataRetriever>>(); - ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) - .WillByDefault(RunOnceCallback<1>(CreateDefaultWebAppInstallInfo())); + EXPECT_CALL(*fake_data_retriever, GetWebAppInstallInfo).Times(0); ON_CALL(*fake_data_retriever, CheckInstallabilityAndRetrieveManifest(_, _, IsNotNullCallback())) @@ -241,29 +224,8 @@ Eq(WebAppUrlLoader::UrlComparison::kIgnoreQueryParamsAndRef)); } -TEST_F(InstallIsolatedAppCommandTest, SuccessWhenAppIsInstallable) { - SetPrepareForLoadResultLoaded(); - - ExpectLoadedForURL("http://test-url-example.com"); - - std::unique_ptr<MockDataRetriever> fake_data_retriever = - CreateDefaultDataRetriever(); - - ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) - .WillByDefault(RunOnceCallback<1>(CreateWebAppInstallInfo( - /*start_url=*/GURL{"http://test-start-url.com"}, - /*manifest_id=*/"test manifest id"))); - - EXPECT_THAT(ExecuteCommand("http://test-url-example.com", - std::move(fake_data_retriever)), - IsInstallationOk()); - - WebAppInstallInfo install_info = *install_finalizer().web_app_info(); - EXPECT_THAT(install_info.manifest_id, Eq("test manifest id")); -} - TEST_F(InstallIsolatedAppCommandTest, - PassesWebAppInstallInfoFromDataRetrieverToInstallFinalizer) { + InstallationFinalizedWithManagementApiInstallSource) { SetPrepareForLoadResultLoaded(); ExpectLoadedForURL("http://test-url-example.com"); @@ -271,46 +233,16 @@ std::unique_ptr<MockDataRetriever> fake_data_retriever = CreateDefaultDataRetriever(); - ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) - .WillByDefault(RunOnceCallback<1>(CreateWebAppInstallInfo( - /*start_url=*/GURL{"http://test-start-url.com"}, - /*manifest_id=*/"different test manifest id"))); - EXPECT_THAT(ExecuteCommand("http://test-url-example.com", std::move(fake_data_retriever)), IsInstallationOk()); - EXPECT_THAT(install_finalizer().web_app_info(), - Pointee(Field(&WebAppInstallInfo::manifest_id, - Eq("different test manifest id")))); - EXPECT_THAT(install_finalizer().finalize_options_list(), ElementsAre(Field( &WebAppInstallFinalizer::FinalizeOptions::install_surface, Eq(webapps::WebappInstallSource::MANAGEMENT_API)))); } -TEST_F(InstallIsolatedAppCommandTest, FailsWhenGetWebAppInstallInfoFails) { - SetPrepareForLoadResultLoaded(); - - ExpectLoadedForURL("http://test-url-example.com"); - - std::unique_ptr<MockDataRetriever> fake_data_retriever = - CreateDefaultDataRetriever(); - - // |nullptr| indicates an error during |GetWebAppInstallInfo|. - // - // See |web_app::WebAppDataRetriever::GetWebAppInstallInfoCallback| - // documentation. - ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) - .WillByDefault( - RunOnceCallback<1>(std::unique_ptr<WebAppInstallInfo>(nullptr))); - - EXPECT_THAT(ExecuteCommand("http://test-url-example.com", - std::move(fake_data_retriever)), - Not(IsInstallationOk())); -} - TEST_F(InstallIsolatedAppCommandTest, InstallationFailsWhenAppIsNotInstallable) { SetPrepareForLoadResultLoaded(); @@ -453,32 +385,5 @@ base::BucketsAre(base::Bucket(false, 1))); } -TEST_F(InstallIsolatedAppCommandMetricsTest, - ReportsAnErrorWhenGetWebAppInstallInfoFails) { - SetPrepareForLoadResultLoaded(); - - ExpectLoadedForURL("http://test-url-example.com"); - - std::unique_ptr<MockDataRetriever> fake_data_retriever = - CreateDefaultDataRetriever(); - - // |nullptr| indicates an error during |GetWebAppInstallInfo|. - // - // See |web_app::WebAppDataRetriever::GetWebAppInstallInfoCallback| - // documentation. - ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) - .WillByDefault( - RunOnceCallback<1>(std::unique_ptr<WebAppInstallInfo>(nullptr))); - - base::HistogramTester histogram_tester; - - EXPECT_THAT(ExecuteCommand("http://test-url-example.com", - std::move(fake_data_retriever)), - Not(IsInstallationOk())); - - EXPECT_THAT(histogram_tester.GetAllSamples("WebApp.Install.Result"), - base::BucketsAre(base::Bucket(false, 1))); -} - } // namespace } // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.cc b/chrome/browser/web_applications/os_integration/os_integration_manager.cc index 81e3310..45d8fa84 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager.cc +++ b/chrome/browser/web_applications/os_integration/os_integration_manager.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/auto_reset.h" +#include "base/barrier_closure.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_forward.h" @@ -23,8 +24,10 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/os_integration/web_app_shortcut.h" #include "chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" #include "chrome/browser/web_applications/web_app_id.h" #include "chrome/browser/web_applications/web_app_registrar.h" +#include "chrome/browser/web_applications/web_app_registry_update.h" #include "chrome/browser/web_applications/web_app_ui_manager.h" #include "chrome/common/chrome_features.h" #include "content/public/browser/browser_thread.h" @@ -110,7 +113,10 @@ shortcut_manager_(std::move(shortcut_manager)), file_handler_manager_(std::move(file_handler_manager)), protocol_handler_manager_(std::move(protocol_handler_manager)), - url_handler_manager_(std::move(url_handler_manager)) {} + url_handler_manager_(std::move(url_handler_manager)) { + // Add sub_manager unique_ptrs to the sub_manager vector. + // Also ensure each sub_manager gets started before Synchronize is called. +} OsIntegrationManager::~OsIntegrationManager() = default; @@ -153,6 +159,39 @@ file_handler_manager_->Start(); if (protocol_handler_manager_) protocol_handler_manager_->Start(); + + // Start all sub managers that need to be started. + for (const auto& sm : sub_managers_) { + sm->Start(); + } +} + +void OsIntegrationManager::Synchronize(const AppId& app_id, + SubManagerCompletedCallback callback) { + if (registrar_->GetAppById(app_id)->is_uninstalling()) { + // For uninstallation purposes, we perform unregistration directly without + // doing reads and writes from the DB. + auto uninstall_barrier = base::BarrierClosure( + sub_managers_.size(), + base::BindOnce(&OsIntegrationManager::OnSynchronizationComplete, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + for (const auto& sm : sub_managers_) { + sm->Unregister(app_id, uninstall_barrier); + } + } else { + proto::WebAppOsIntegrationState desired_state; + const absl::optional<proto::WebAppOsIntegrationState> current_state = + registrar_->GetAppById(app_id)->current_os_integration_states(); + auto configure_barrier = base::BarrierClosure( + sub_managers_.size(), + base::BindOnce( + &OsIntegrationManager::ExecuteAllSubManagerConfigurations, + weak_ptr_factory_.GetWeakPtr(), app_id, desired_state, + current_state, std::move(callback))); + for (const auto& sm : sub_managers_) { + sm->Configure(app_id, desired_state, configure_barrier); + } + } } void OsIntegrationManager::InstallOsHooks( @@ -723,6 +762,38 @@ return shortcut_manager_->BuildShortcutInfo(app_id); } +void OsIntegrationManager::ExecuteAllSubManagerConfigurations( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + const absl::optional<proto::WebAppOsIntegrationState>& current_state, + SubManagerCompletedCallback callback) { + auto execution_barrier = base::BarrierClosure( + sub_managers_.size(), + base::BindOnce(&OsIntegrationManager::WriteStateToDB, + weak_ptr_factory_.GetWeakPtr(), app_id, desired_state, + std::move(callback))); + for (const auto& sm : sub_managers_) { + sm->Execute(app_id, desired_state, current_state, execution_barrier); + } +} + +void OsIntegrationManager::WriteStateToDB( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + SubManagerCompletedCallback callback) { + { + ScopedRegistryUpdate update(sync_bridge_); + WebApp* web_app = update->UpdateApp(app_id); + web_app->SetCurrentOsIntegrationStates(desired_state); + } + OnSynchronizationComplete(std::move(callback)); +} + +void OsIntegrationManager::OnSynchronizationComplete( + SubManagerCompletedCallback callback) { + std::move(callback).Run(OsHooksErrors()); +} + void OsIntegrationManager::OnShortcutsCreated( const AppId& app_id, std::unique_ptr<WebAppInstallInfo> web_app_info,
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.h b/chrome/browser/web_applications/os_integration/os_integration_manager.h index 4021eaaf..30069da1 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager.h +++ b/chrome/browser/web_applications/os_integration/os_integration_manager.h
@@ -16,11 +16,14 @@ #include "base/scoped_observation.h" #include "base/strings/string_piece_forward.h" #include "chrome/browser/web_applications/app_registrar_observer.h" +#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h" #include "chrome/browser/web_applications/os_integration/url_handler_manager.h" #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h" #include "chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.h" #include "chrome/browser/web_applications/os_integration/web_app_run_on_os_login.h" #include "chrome/browser/web_applications/os_integration/web_app_shortcut_manager.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" +#include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_id.h" #include "chrome/browser/web_applications/web_app_install_info.h" @@ -58,6 +61,7 @@ bool add_to_quick_launch_bar = false; }; +// Retire these 3 once the sub-manager project is done. // Callback made after InstallOsHooks is finished. using InstallOsHooksCallback = base::OnceCallback<void(OsHooksErrors os_hooks_errors)>; @@ -70,6 +74,10 @@ using UpdateOsHooksCallback = base::OnceCallback<void(OsHooksErrors os_hooks_errors)>; +// Callback made when sub-managers are called +using SubManagerCompletedCallback = + base::OnceCallback<void(OsHooksErrors os_hooks_errors)>; + using BarrierCallback = base::RepeatingCallback<void(OsHookType::Type os_hook, bool completed)>; @@ -104,6 +112,9 @@ void Start(); + virtual void Synchronize(const AppId& app_id, + SubManagerCompletedCallback callback); + // Install all needed OS hooks for the web app. // If provided |web_app_info| is a nullptr, it will read icons data from disk, // otherwise it will use (SkBitmaps) from |web_app_info|. @@ -275,6 +286,20 @@ private: class OsHooksBarrier; + virtual void ExecuteAllSubManagerConfigurations( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + const absl::optional<proto::WebAppOsIntegrationState>& expected_state, + SubManagerCompletedCallback callback); + + virtual void WriteStateToDB( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + SubManagerCompletedCallback done_callback); + + virtual void OnSynchronizationComplete( + SubManagerCompletedCallback done_callback); + void OnShortcutsCreated(const AppId& app_id, std::unique_ptr<WebAppInstallInfo> web_app_info, InstallOsHooksOptions options, @@ -310,6 +335,8 @@ base::ScopedObservation<WebAppRegistrar, AppRegistrarObserver> registrar_observation_{this}; + std::vector<std::unique_ptr<OsIntegrationSubManager>> sub_managers_; + base::WeakPtrFactory<OsIntegrationManager> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/web_applications/os_integration/os_integration_sub_manager.h b/chrome/browser/web_applications/os_integration/os_integration_sub_manager.h new file mode 100644 index 0000000..ef59124 --- /dev/null +++ b/chrome/browser/web_applications/os_integration/os_integration_sub_manager.h
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_OS_INTEGRATION_SUB_MANAGER_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_OS_INTEGRATION_SUB_MANAGER_H_ + +#include "base/callback_forward.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" +#include "chrome/browser/web_applications/web_app_constants.h" +#include "chrome/browser/web_applications/web_app_id.h" + +namespace web_app { + +class OsIntegrationSubManager { + public: + virtual ~OsIntegrationSubManager() = 0; + virtual void Start() = 0; + virtual void Shutdown() = 0; + virtual void Configure(const AppId& app_id, + proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure configure_done) = 0; + virtual void Execute( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + const absl::optional<proto::WebAppOsIntegrationState>& current_state, + base::OnceClosure execute_done) = 0; + virtual void Unregister(const AppId& app_id, + base::OnceClosure uninstall_done) = 0; +}; +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_OS_INTEGRATION_SUB_MANAGER_H_
diff --git a/chrome/browser/web_applications/proto/BUILD.gn b/chrome/browser/web_applications/proto/BUILD.gn index 849bf17d..c172e84 100644 --- a/chrome/browser/web_applications/proto/BUILD.gn +++ b/chrome/browser/web_applications/proto/BUILD.gn
@@ -9,6 +9,7 @@ sources = [ "web_app.proto", "web_app_launch_handler.proto", + "web_app_os_integration_state.proto", "web_app_share_target.proto", "web_app_tab_strip.proto", "web_app_translations.proto",
diff --git a/chrome/browser/web_applications/proto/web_app.proto b/chrome/browser/web_applications/proto/web_app.proto index aa83652..c03cfb0 100644 --- a/chrome/browser/web_applications/proto/web_app.proto +++ b/chrome/browser/web_applications/proto/web_app.proto
@@ -7,6 +7,7 @@ import "components/sync/protocol/web_app_specifics.proto"; import "chrome/browser/ash/system_web_apps/types/system_web_app_data.proto"; import "chrome/browser/web_applications/proto/web_app_launch_handler.proto"; +import "chrome/browser/web_applications/proto/web_app_os_integration_state.proto"; import "chrome/browser/web_applications/proto/web_app_share_target.proto"; import "chrome/browser/web_applications/proto/web_app_tab_strip.proto"; @@ -350,4 +351,9 @@ // Only used on Mac OS, stores whether the app should always show the // toolbar when in fullscreen mode. optional bool always_show_toolbar_in_fullscreen = 58; + + // Contains the os_integration_state currently deployed for a web_app. + // This will be populated from the fields in this proto when ran for the first + // time after OS hooks have been registered. + optional proto.WebAppOsIntegrationState current_os_integration_states = 59; }
diff --git a/chrome/browser/web_applications/proto/web_app_os_integration_state.proto b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto new file mode 100644 index 0000000..5af620c --- /dev/null +++ b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto
@@ -0,0 +1,21 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package web_app.proto; + +// Represents all the common OS Integration states to be stored in the web_app +// DB that matches the values in the OS. +message WebAppOsIntegrationState { + // Add data states for ShortcutMenu registration. + // Add data states for FileHandler registration. + // Add data states for ProtocolHandler registration. + // Add data states for UrlHandler registration. + // Add data states for RunOnOSLogin registration. + // Add data states for RegisterWebAppOsUninstall registration. + // Are other data required? If so, add them here. +} \ No newline at end of file
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc index 8ccd3ee..3797bc2 100644 --- a/chrome/browser/web_applications/test/web_app_test_utils.cc +++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -38,6 +38,7 @@ #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/web_applications/externally_installed_web_app_prefs.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" #include "chrome/browser/web_applications/test/web_app_test_observers.h" #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app.h" @@ -595,6 +596,11 @@ app->SetAlwaysShowToolbarInFullscreen(random.next_bool()); + if (random.next_bool()) { + proto::WebAppOsIntegrationState state; + app->SetCurrentOsIntegrationStates(state); + } + return app; }
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc index 4935891b..a7b1143 100644 --- a/chrome/browser/web_applications/web_app.cc +++ b/chrome/browser/web_applications/web_app.cc
@@ -399,6 +399,12 @@ tab_strip_ = std::move(tab_strip); } +void WebApp::SetCurrentOsIntegrationStates( + absl::optional<proto::WebAppOsIntegrationState> + current_os_integration_states) { + current_os_integration_states_ = std::move(current_os_integration_states); +} + void WebApp::AddPlaceholderInfoToManagementExternalConfigMap( WebAppManagement::Type type, bool is_placeholder) { @@ -501,7 +507,7 @@ bool WebApp::operator==(const WebApp& other) const { auto AsTuple = [](const WebApp& app) { // Keep in order declared in web_app.h. - return std::tie( + return std::make_tuple( // Disable clang-format so diffs are clearer when fields are added. // clang-format off app.app_id_, @@ -563,11 +569,12 @@ app.data_size_in_bytes_, app.management_to_external_config_map_, app.tab_strip_, - app.always_show_toolbar_in_fullscreen_ + app.always_show_toolbar_in_fullscreen_, + app.current_os_integration_states_.value_or(proto::WebAppOsIntegrationState()).SerializeAsString() // clang-format on ); }; - return AsTuple(*this) == AsTuple(other); + return (AsTuple(*this) == AsTuple(other)); } bool WebApp::operator!=(const WebApp& other) const { @@ -877,6 +884,11 @@ root.SetBoolKey("always_show_toolbar_in_fullscreen", always_show_toolbar_in_fullscreen_); + if (current_os_integration_states_.has_value()) { + root.SetKey("current_os_integration_states", base::Value()); + // TODO(crbug.com/1295044) : Add logic to parse and show data. + } + return root; }
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h index e3597b8..1183fea 100644 --- a/chrome/browser/web_applications/web_app.h +++ b/chrome/browser/web_applications/web_app.h
@@ -12,6 +12,7 @@ #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/ash/system_web_apps/types/system_web_app_data.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app_chromeos_data.h" #include "chrome/browser/web_applications/web_app_constants.h" @@ -301,6 +302,10 @@ return always_show_toolbar_in_fullscreen_; } + const absl::optional<proto::WebAppOsIntegrationState>& + current_os_integration_states() const { + return current_os_integration_states_; + } // A Web App can be installed from multiple sources simultaneously. Installs // add a source to the app. Uninstalls remove a source from the app. void AddSource(WebAppManagement::Type source); @@ -385,6 +390,9 @@ void SetWebAppManagementExternalConfigMap( ExternalConfigMap management_to_external_config_map); void SetTabStrip(absl::optional<blink::Manifest::TabStrip> tab_strip); + void SetCurrentOsIntegrationStates( + absl::optional<proto::WebAppOsIntegrationState> + current_os_integration_states); void AddPlaceholderInfoToManagementExternalConfigMap( WebAppManagement::Type source_type, @@ -505,6 +513,8 @@ // Only used on Mac. bool always_show_toolbar_in_fullscreen_ = true; + absl::optional<proto::WebAppOsIntegrationState> + current_os_integration_states_ = absl::nullopt; // New fields must be added to: // - |operator==| // - AsDebugValue()
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc index a6f47ab..9f70ef5 100644 --- a/chrome/browser/web_applications/web_app_database.cc +++ b/chrome/browser/web_applications/web_app_database.cc
@@ -707,6 +707,10 @@ } } + if (web_app.current_os_integration_states().has_value()) { + local_data->mutable_current_os_integration_states(); + } + if (web_app.app_size_in_bytes().has_value()) local_data->set_app_size_in_bytes(web_app.app_size_in_bytes().value()); @@ -1303,6 +1307,11 @@ web_app->SetTabStrip(std::move(tab_strip)); } + if (local_data.has_current_os_integration_states()) { + web_app->SetCurrentOsIntegrationStates( + local_data.current_os_integration_states()); + } + if (local_data.has_app_size_in_bytes()) { web_app->SetAppSizeInBytes(local_data.app_size_in_bytes()); }
diff --git a/chrome/browser/web_applications/web_app_unittest.cc b/chrome/browser/web_applications/web_app_unittest.cc index 519f363..71c4169e 100644 --- a/chrome/browser/web_applications/web_app_unittest.cc +++ b/chrome/browser/web_applications/web_app_unittest.cc
@@ -287,6 +287,7 @@ "MONOCHROME": [ 138, 107 ], "index": 2 } ], + "current_os_integration_states": null, "file_handler_approval_state": "kRequiresPrompt", "file_handler_os_integration_state": "kDisabled", "file_handlers": [ {
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index e1cc1da96..18ee8c52 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1659959824-0a23fcdaf8795221db8935feb2e38be11c03180a.profdata +chrome-linux-main-1659981512-9489d4121107498551f593fcb771020a7870ec63.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index fe7d37b..d4a9751 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1659959824-d6500bee8a222f394e0a510a72a40952f5e86ef7.profdata +chrome-mac-arm-main-1659981512-5904991f53ae3ae1a9cf6ffbe5bce549133e8853.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 2f3e17f..627e20c 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1659959824-6d8641102a4166bfaa8e720ba5e553803f189857.profdata +chrome-mac-main-1659981512-e8c4198bbd0969d549c78f6834eed72288d785fa.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index d30a0b8..28da40a5 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1659959824-0970af9e8799c52a2f5a407b5e5bf24b080ff89b.profdata +chrome-win32-main-1659981512-ec3635f9ca3c0ab09281bffcb8f707977f1329cc.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index bf68f53c..8b73eb04 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1659959824-9e7327fa2638d61d5552a9b4492a9fbc0d227569.profdata +chrome-win64-main-1659992396-076313df7a80214795503f85c11c9f6d11aee2bb.profdata
diff --git a/chrome/common/extensions/api/accessibility_private.json b/chrome/common/extensions/api/accessibility_private.json index ebc5d06..dc8de0c 100644 --- a/chrome/common/extensions/api/accessibility_private.json +++ b/chrome/common/extensions/api/accessibility_private.json
@@ -727,6 +727,12 @@ "description": "Properties for the updated Dictation bubble UI." } ] + }, + { + "name": "silenceSpokenFeedback", + "type": "function", + "description": "Cancels the current and queued speech from ChromeVox.", + "parameters": [] } ], "events": [
diff --git a/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc b/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc index 940d5fc3..af94d3a 100644 --- a/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc +++ b/chrome/renderer/autofill/fake_mojo_password_manager_driver.cc
@@ -30,8 +30,7 @@ } void FakeMojoPasswordManagerDriver::PasswordFormsRendered( - const std::vector<autofill::FormData>& visible_forms_data, - bool did_stop_loading) { + const std::vector<autofill::FormData>& visible_forms_data) { called_password_forms_rendered_ = true; form_data_rendered_ = visible_forms_data; }
diff --git a/chrome/renderer/autofill/fake_mojo_password_manager_driver.h b/chrome/renderer/autofill/fake_mojo_password_manager_driver.h index f79df93..9028e9a 100644 --- a/chrome/renderer/autofill/fake_mojo_password_manager_driver.h +++ b/chrome/renderer/autofill/fake_mojo_password_manager_driver.h
@@ -142,8 +142,7 @@ const std::vector<autofill::FormData>& forms_data) override; void PasswordFormsRendered( - const std::vector<autofill::FormData>& visible_forms_data, - bool did_stop_loading) override; + const std::vector<autofill::FormData>& visible_forms_data) override; void PasswordFormSubmitted(const autofill::FormData& form_data) override;
diff --git a/chrome/renderer/resources/renderer_resources.grd b/chrome/renderer/resources/renderer_resources.grd index 40f69cf4..3e8cc64 100644 --- a/chrome/renderer/resources/renderer_resources.grd +++ b/chrome/renderer/resources/renderer_resources.grd
@@ -45,7 +45,7 @@ <include name="IDR_TTS_ENGINE_CUSTOM_BINDINGS_JS" file="extensions\tts_engine_custom_bindings.js" type="BINDATA" /> <include name="IDR_WEBRTC_DESKTOP_CAPTURE_PRIVATE_CUSTOM_BINDINGS_JS" file="extensions\webrtc_desktop_capture_private_custom_bindings.js" type="BINDATA" /> <include name="IDR_WEBRTC_LOGGING_PRIVATE_CUSTOM_BINDINGS_JS" file="extensions\webrtc_logging_private_custom_bindings.js" type="BINDATA" /> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <include name="IDR_CERTIFICATE_PROVIDER_CUSTOM_BINDINGS_JS" file="extensions\certificate_provider_custom_bindings.js" type="BINDATA" /> <include name="IDR_ENTERPRISE_PLATFORM_KEYS_CUSTOM_BINDINGS_JS" file="extensions\enterprise_platform_keys_custom_bindings.js" type="BINDATA" /> <include name="IDR_ENTERPRISE_PLATFORM_KEYS_KEY_PAIR_JS" file="extensions\enterprise_platform_keys\key_pair.js" type="BINDATA" />
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 5291986..a02fc7c6 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -551,13 +551,13 @@ public_deps += [ "//ash", "//ash:test_support", - "//ash/components/account_manager", "//ash/components/settings", "//ash/components/tpm", "//ash/constants", "//ash/public/cpp:test_support", "//chrome/browser/ash", "//chrome/browser/ash/system_web_apps", + "//chromeos/ash/components/account_manager", "//chromeos/ash/components/dbus/session_manager", "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/install_attributes:test_support",
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc index 2ed93f7..8a24b90 100644 --- a/chrome/test/base/testing_profile.cc +++ b/chrome/test/base/testing_profile.cc
@@ -121,13 +121,13 @@ #endif #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/account_manager/account_manager_factory.h" #include "chrome/browser/ash/arc/session/arc_service_launcher.h" #include "chrome/browser/ash/net/delay_network_call.h" #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h" #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/ash/system_web_apps/system_web_app_manager_factory.h" #include "chrome/browser/ash/system_web_apps/test_support/test_system_web_app_manager.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/chromeos/account_manager.h" #endif
diff --git a/chrome/test/data/extensions/api_test/offscreen/basic_document_management/background.js b/chrome/test/data/extensions/api_test/offscreen/basic_document_management/background.js index 2c47e5d..307e7d7 100644 --- a/chrome/test/data/extensions/api_test/offscreen/basic_document_management/background.js +++ b/chrome/test/data/extensions/api_test/offscreen/basic_document_management/background.js
@@ -99,7 +99,7 @@ async function callingCloseDocumentWhenNoneOpenRejects() { chrome.test.assertFalse(await chrome.offscreen.hasDocument()); await chrome.test.assertPromiseRejects( - chrome.offscreen.closeDocument(VALID_PARAMS), + chrome.offscreen.closeDocument(), 'Error: No current offscreen document.'); chrome.test.succeed(); },
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn b/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn index 445471a..110300b 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn +++ b/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn
@@ -15,6 +15,7 @@ ":all_inputs_disabled_test", ":critical_error_page_test", ":fake_shimless_rma_service_test", + ":hardware_error_page_test", ":onboarding_choose_destination_page_test", ":onboarding_choose_wipe_device_page_test", ":onboarding_choose_wp_disable_method_page_test", @@ -30,6 +31,7 @@ ":onboarding_update_page_test", ":onboarding_wait_for_manual_wp_disable_page_test", ":onboarding_wp_disable_complete_page_test", + ":reboot_page_test", ":reimaging_calibration_failed_page_test", ":reimaging_calibration_run_page_test", ":reimaging_calibration_setup_page_test", @@ -81,6 +83,16 @@ externs_list = [ "$externs_path/mocha-2.5.js" ] } +js_library("hardware_error_page_test") { + deps = [ + "../..:chai_assert", + "//ash/webui/shimless_rma/resources:fake_shimless_rma_service", + "//ash/webui/shimless_rma/resources:hardware_error_page", + "//ash/webui/shimless_rma/resources:mojo_interface_provider", + ] + externs_list = [ "$externs_path/mocha-2.5.js" ] +} + js_library("shimless_rma_app_test") { deps = [ "../..:chai_assert", @@ -205,6 +217,16 @@ externs_list = [ "$externs_path/mocha-2.5.js" ] } +js_library("reboot_page_test") { + deps = [ + "../..:chai_assert", + "//ash/webui/shimless_rma/resources:fake_shimless_rma_service", + "//ash/webui/shimless_rma/resources:mojo_interface_provider", + "//ash/webui/shimless_rma/resources:reboot_page", + ] + externs_list = [ "$externs_path/mocha-2.5.js" ] +} + js_library("reimaging_firmware_update_page_test") { deps = [ "../..:chai_assert",
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/hardware_error_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/hardware_error_page_test.js new file mode 100644 index 0000000..5fd78f5a --- /dev/null +++ b/chrome/test/data/webui/chromeos/shimless_rma/hardware_error_page_test.js
@@ -0,0 +1,99 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js'; +import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js'; +import {HardwareErrorPage} from 'chrome://shimless-rma/hardware_error_page.js'; +import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js'; +import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js'; +import {ShutdownMethod} from 'chrome://shimless-rma/shimless_rma_types.js'; + +import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js'; +import {flushTasks} from '../../test_util.js'; + +export function hardwareErrorPageTest() { + /** + * ShimlessRma is needed to handle the 'disable-all-buttons' event used by the + * shutdown button. + * @type {?ShimlessRma} + */ + let shimless_rma_component = null; + + /** @type {?HardwareErrorPage} */ + let component = null; + + /** @type {?FakeShimlessRmaService} */ + let service = null; + + setup(() => { + document.body.innerHTML = ''; + service = new FakeShimlessRmaService(); + setShimlessRmaServiceForTesting(service); + }); + + teardown(() => { + component.remove(); + component = null; + shimless_rma_component.remove(); + shimless_rma_component = null; + service.reset(); + }); + + /** + * @return {!Promise} + */ + function initializeHardwareErrorPage() { + assertFalse(!!component); + + shimless_rma_component = + /** @type {!ShimlessRma} */ (document.createElement('shimless-rma')); + assertTrue(!!shimless_rma_component); + document.body.appendChild(shimless_rma_component); + + component = /** @type {!HardwareErrorPage} */ ( + document.createElement('hardware-error-page')); + assertTrue(!!component); + document.body.appendChild(component); + + return flushTasks(); + } + + test('ShutDownButtonDisablesAllButtons', async () => { + await initializeHardwareErrorPage(); + + const resolver = new PromiseResolver(); + let allButtonsDisabled = false; + component.addEventListener('disable-all-buttons', (e) => { + allButtonsDisabled = true; + component.allButtonsDisabled = allButtonsDisabled; + resolver.resolve(); + }); + + component.shadowRoot.querySelector('#shutDownButton').click(); + + await resolver.promise; + assertTrue(allButtonsDisabled); + assertTrue(component.shadowRoot.querySelector('#shutDownButton').disabled); + }); + + test('ShutDownButtonTriggersShutDown', async () => { + const resolver = new PromiseResolver(); + await initializeHardwareErrorPage(); + + let callCount = 0; + let shutdownMethod; + service.endRma = (seenShutdownMethod) => { + callCount++; + shutdownMethod = seenShutdownMethod; + return resolver.promise; + }; + await flushTasks(); + + component.shadowRoot.querySelector('#shutDownButton').click(); + await flushTasks(); + + assertEquals(1, callCount); + assertEquals(ShutdownMethod.kShutdown, shutdownMethod); + }); +}
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reboot_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reboot_page_test.js new file mode 100644 index 0000000..61715abe --- /dev/null +++ b/chrome/test/data/webui/chromeos/shimless_rma/reboot_page_test.js
@@ -0,0 +1,51 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js'; +import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js'; +import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js'; +import {RebootPage} from 'chrome://shimless-rma/reboot_page.js'; + +import {assertFalse, assertTrue} from '../../chai_assert.js'; +import {flushTasks} from '../../test_util.js'; + +export function rebootPageTest() { + /** @type {?RebootPage} */ + let component = null; + + /** @type {?FakeShimlessRmaService} */ + let service = null; + + setup(() => { + document.body.innerHTML = ''; + service = new FakeShimlessRmaService(); + setShimlessRmaServiceForTesting(service); + }); + + teardown(() => { + component.remove(); + component = null; + service.reset(); + }); + + /** + * @return {!Promise} + */ + function initializeRebootPage() { + assertFalse(!!component); + + component = + /** @type {!RebootPage} */ (document.createElement('reboot-page')); + assertTrue(!!component); + document.body.appendChild(component); + + return flushTasks(); + } + + test('ComponentRenders', async () => { + await initializeRebootPage(); + const basePage = component.shadowRoot.querySelector('base-page'); + assertTrue(!!basePage); + }); +}
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js index 13376bad..acaf8823 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
@@ -105,6 +105,11 @@ test('ShimlessRMALoaded', async () => { await initializeShimlessRMAApp(fakeStates, fakeChromeVersion[0]); assertNavButtons(); + + // The Hardware Error page should be hidden by default. + const hardwareErrorPage = + component.shadowRoot.querySelector('hardware-error-page'); + assertFalse(!!hardwareErrorPage); }); test('ShimlessRMABasicNavigation', async () => { @@ -554,4 +559,20 @@ assertTrue(backButton.hidden); assertFalse(exitButton.hidden); }); + + test('HardwareErrorEventIsHandled', async () => { + await initializeShimlessRMAApp(fakeStates, fakeChromeVersion[0]); + + component.dispatchEvent(new CustomEvent( + 'fatal-hardware-error', + {bubbles: true, composed: true}, + )); + + await flushTasks(); + + // Confirm transition to the Hardware Error page. + const hardwareErrorPage = + component.shadowRoot.querySelector('hardware-error-page'); + assertTrue(!!hardwareErrorPage); + }); }
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js index 953760d..fbf372e 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js
@@ -49,6 +49,7 @@ 'AllInputsDisabledTest', 'CriticalErrorPageTest', 'FakeShimlessRmaServiceTestSuite', + 'HardwareErrorPageTest', 'OnboardingChooseDestinationPageTest', 'OnboardingChooseWipeDevicePageTest', 'OnboardingChooseWpDisableMethodPageTest', @@ -59,6 +60,7 @@ 'OnboardingUpdatePageTest', 'OnboardingWaitForManualWpDisablePageTest', 'OnboardingWpDisableCompletePageTest', + 'RebootPageTest', 'ReimagingCalibrationFailedPageTest', 'ReimagingCalibrationRunPageTest', 'ReimagingCalibrationSetupPageTest',
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_unified_test.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_unified_test.js index fdcb315..b7e37b6 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_unified_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_unified_test.js
@@ -7,6 +7,7 @@ import {allInputsDisabledTest} from './all_inputs_disabled_test.js'; import {criticalErrorPageTest} from './critical_error_page_test.js'; import {fakeShimlessRmaServiceTestSuite} from './fake_shimless_rma_service_test.js'; +import {hardwareErrorPageTest} from './hardware_error_page_test.js'; import {onboardingChooseDestinationPageTest} from './onboarding_choose_destination_page_test.js'; import {onboardingChooseWipeDevicePageTest} from './onboarding_choose_wipe_device_page_test.js'; import {onboardingChooseWpDisableMethodPageTest} from './onboarding_choose_wp_disable_method_page_test.js'; @@ -17,6 +18,7 @@ import {onboardingUpdatePageTest} from './onboarding_update_page_test.js'; import {onboardingWaitForManualWpDisablePageTest} from './onboarding_wait_for_manual_wp_disable_page_test.js'; import {onboardingWpDisableCompletePageTest} from './onboarding_wp_disable_complete_page_test.js'; +import {rebootPageTest} from './reboot_page_test.js'; import {reimagingCalibrationFailedPageTest} from './reimaging_calibration_failed_page_test.js'; import {reimagingCalibrationRunPageTest} from './reimaging_calibration_run_page_test.js'; import {reimagingCalibrationSetupPageTest} from './reimaging_calibration_setup_page_test.js'; @@ -40,6 +42,7 @@ runSuite('AllInputsDisabledTest', allInputsDisabledTest); runSuite('CriticalErrorPageTest', criticalErrorPageTest); runSuite('FakeShimlessRmaServiceTestSuite', fakeShimlessRmaServiceTestSuite); +runSuite('HardwareErrorPageTest', hardwareErrorPageTest); runSuite( 'OnboardingChooseDestinationPageTest', onboardingChooseDestinationPageTest); runSuite( @@ -60,6 +63,7 @@ onboardingWaitForManualWpDisablePageTest); runSuite( 'OnboardingWpDisableCompletePageTest', onboardingWpDisableCompletePageTest); +runSuite('RebootPageTest', rebootPageTest); runSuite( 'ReimagingCalibrationFailedPageTest', reimagingCalibrationFailedPageTest); runSuite('ReimagingCalibrationRunPageTest', reimagingCalibrationRunPageTest);
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js index 1395711e..b959c26c 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js
@@ -6,7 +6,7 @@ import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js'; import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js'; import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js'; -import {FinalizationError, FinalizationStatus} from 'chrome://shimless-rma/shimless_rma_types.js'; +import {FinalizationError, FinalizationStatus, RmadErrorCode} from 'chrome://shimless-rma/shimless_rma_types.js'; import {WrapupFinalizePage} from 'chrome://shimless-rma/wrapup_finalize_page.js'; import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from '../../chai_assert.js'; @@ -82,126 +82,56 @@ assertEquals(1, callCount); }); - test('FinalizationFailedBlockingRetry', async () => { - const resolver = new PromiseResolver(); + test('AllErrorsTriggerFatalHardwareErrorEvent', async () => { await initializeFinalizePage(); - const retryButton = - component.shadowRoot.querySelector('#retryFinalizationButton'); - assertTrue(retryButton.hidden); + let hardwareErrorEventFired = false; - let callCount = 0; - service.retryFinalization = () => { - callCount++; - return resolver.promise; - }; - service.triggerFinalizationObserver( - FinalizationStatus.kFailedBlocking, 1.0, FinalizationError.kInternal, - 0); - await flushTasks(); - - const hardwareWpDisabledDialog = - component.shadowRoot.querySelector('#hardwareWpDisabledDialog'); - assertTrue(!!hardwareWpDisabledDialog); - assertFalse(hardwareWpDisabledDialog.open); - - assertFalse(retryButton.hidden); - retryButton.click(); - - await flushTasks(); - assertEquals(1, callCount); - }); - - test('FinalizationFailedNonBlockingRetry', async () => { - const resolver = new PromiseResolver(); - await initializeFinalizePage(); - - const retryButton = - component.shadowRoot.querySelector('#retryFinalizationButton'); - assertTrue(retryButton.hidden); - - let callCount = 0; - service.retryFinalization = () => { - callCount++; - return resolver.promise; - }; - service.triggerFinalizationObserver( - FinalizationStatus.kFailedNonBlocking, 1.0, FinalizationError.kInternal, - 0); - await flushTasks(); - - const hardwareWpDisabledDialog = - component.shadowRoot.querySelector('#hardwareWpDisabledDialog'); - assertTrue(!!hardwareWpDisabledDialog); - assertFalse(hardwareWpDisabledDialog.open); - - assertFalse(retryButton.hidden); - retryButton.click(); - - await flushTasks(); - assertEquals(1, callCount); - }); - - test('FinalizationRetryButtonDisabled', async () => { - await initializeFinalizePage(); - - const retryButton = - component.shadowRoot.querySelector('#retryFinalizationButton'); - assertFalse(retryButton.disabled); - component.allButtonsDisabled = true; - assertTrue(retryButton.disabled); - }); - - test('FinalizationFailedHardwareWpError', async () => { - const resolver = new PromiseResolver(); - await initializeFinalizePage(); - - const hardwareWpDisabledDialog = - component.shadowRoot.querySelector('#hardwareWpDisabledDialog'); - assertTrue(!!hardwareWpDisabledDialog); - assertFalse(hardwareWpDisabledDialog.open); - - let callCount = 0; - service.retryFinalization = () => { - callCount++; - return resolver.promise; + const eventHandler = (event) => { + hardwareErrorEventFired = true; + assertEquals(RmadErrorCode.kFinalizationFailed, event.detail); }; + component.addEventListener('fatal-hardware-error', eventHandler); + service.triggerFinalizationObserver( - FinalizationStatus.kFailedBlocking, 1.0, + FinalizationStatus.kFailedBlocking, 0.0, FinalizationError.kCannotEnableHardwareWp, 0); await flushTasks(); + assertTrue(hardwareErrorEventFired); - assertTrue(hardwareWpDisabledDialog.open); - - const tryAgainButton = - component.shadowRoot.querySelector('#tryAgainButton'); - tryAgainButton.click(); - - assertFalse(hardwareWpDisabledDialog.open); - assertEquals(1, callCount); - }); - - test('FinalizationFailedSoftwareWpError', async () => { - const resolver = new PromiseResolver(); - await initializeFinalizePage(); - - const hardwareWpDisabledDialog = - component.shadowRoot.querySelector('#hardwareWpDisabledDialog'); - assertTrue(!!hardwareWpDisabledDialog); - assertFalse(hardwareWpDisabledDialog.open); - - let callCount = 0; - service.retryFinalization = () => { - callCount++; - return resolver.promise; - }; - + hardwareErrorEventFired = false; service.triggerFinalizationObserver( - FinalizationStatus.kFailedNonBlocking, 1.0, + FinalizationStatus.kFailedBlocking, 0.0, FinalizationError.kCannotEnableSoftwareWp, 0); await flushTasks(); + assertTrue(hardwareErrorEventFired); - assertFalse(hardwareWpDisabledDialog.open); + hardwareErrorEventFired = false; + service.triggerFinalizationObserver( + FinalizationStatus.kFailedBlocking, 0.0, FinalizationError.kCr50, 0); + await flushTasks(); + assertTrue(hardwareErrorEventFired); + + hardwareErrorEventFired = false; + service.triggerFinalizationObserver( + FinalizationStatus.kFailedBlocking, 0.0, FinalizationError.kGbb, 0); + await flushTasks(); + assertTrue(hardwareErrorEventFired); + + hardwareErrorEventFired = false; + service.triggerFinalizationObserver( + FinalizationStatus.kFailedBlocking, 0.0, FinalizationError.kUnknown, 0); + await flushTasks(); + assertTrue(hardwareErrorEventFired); + + hardwareErrorEventFired = false; + service.triggerFinalizationObserver( + FinalizationStatus.kFailedBlocking, 0.0, FinalizationError.kInternal, + 0); + await flushTasks(); + assertTrue(hardwareErrorEventFired); + + component.removeEventListener('fatal-hardware-error', eventHandler); }); }
diff --git a/chrome/test/data/webui/print_preview/color_settings_test.ts b/chrome/test/data/webui/print_preview/color_settings_test.ts index 10a37e7d..6c06a22 100644 --- a/chrome/test/data/webui/print_preview/color_settings_test.ts +++ b/chrome/test/data/webui/print_preview/color_settings_test.ts
@@ -54,7 +54,7 @@ assertTrue(colorSection.getSetting('color').setFromUi); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Tests that if the setting is enforced by enterprise policy it is // disabled. test('disabled by policy', function() {
diff --git a/chrome/test/data/webui/print_preview/destination_dialog_test.ts b/chrome/test/data/webui/print_preview/destination_dialog_test.ts index 2dd4bbef..04ff6c45 100644 --- a/chrome/test/data/webui/print_preview/destination_dialog_test.ts +++ b/chrome/test/data/webui/print_preview/destination_dialog_test.ts
@@ -3,10 +3,10 @@ // found in the LICENSE file. import {Destination, DestinationStore, GooglePromotedDestinationId, LocalDestinationInfo, makeRecentDestination, NativeLayerImpl, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> PrintPreviewDestinationDialogCrosElement, // </if> - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> PrintPreviewDestinationDialogElement, // </if> PrintPreviewDestinationListItemElement} from 'chrome://print/print_preview.js'; @@ -14,7 +14,7 @@ import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertEquals} from 'chrome://webui-test/chai_assert.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> @@ -32,10 +32,10 @@ Object.assign(window, {destination_dialog_test: destination_dialog_test}); suite(destination_dialog_test.suiteName, function() { - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> let dialog: PrintPreviewDestinationDialogCrosElement; // </if> - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> let dialog: PrintPreviewDestinationDialogElement; // </if> @@ -57,7 +57,7 @@ // Create data classes nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> destinationStore = createDestinationStore(); @@ -70,10 +70,10 @@ function finishSetup() { // Set up dialog - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> dialog = document.createElement('print-preview-destination-dialog-cros'); // </if> - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> dialog = document.createElement('print-preview-destination-dialog'); // </if> dialog.destinationStore = destinationStore;
diff --git a/chrome/test/data/webui/print_preview/destination_settings_test.ts b/chrome/test/data/webui/print_preview/destination_settings_test.ts index c30970d8..47837d3 100644 --- a/chrome/test/data/webui/print_preview/destination_settings_test.ts +++ b/chrome/test/data/webui/print_preview/destination_settings_test.ts
@@ -8,12 +8,12 @@ import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise, fakeDataBind, waitBeforeNextRender} from 'chrome://webui-test/test_util.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {NativeLayerCrosStub, setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> import {NativeLayerStub} from './native_layer_stub.js'; import {getDestinations, getSaveAsPdfDestination, setupTestListenerElement} from './print_preview_test_utils.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {getGoogleDriveDestination} from './print_preview_test_utils.js'; // </if> @@ -25,12 +25,12 @@ RecentDestinations: 'recent destinations', RecentDestinationsMissing: 'recent destinations missing', SaveAsPdfRecent: 'save as pdf recent', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> GoogleDriveRecent: 'google drive recent', GoogleDriveAutoselect: 'google drive autoselect', // </if> SelectSaveAsPdf: 'select save as pdf', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> SelectGoogleDrive: 'select google drive', // </if> SelectRecentDestination: 'select recent destination', @@ -38,7 +38,7 @@ UpdateRecentDestinations: 'update recent destinations', DisabledSaveAsPdf: 'disabled save as pdf', NoDestinations: 'no destinations', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> EulaIsRetrieved: 'eula is retrieved', DriveIsNotMounted: 'drive is not mounted', // </if> @@ -52,7 +52,7 @@ let nativeLayer: NativeLayerStub; - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> let nativeLayerCros: NativeLayerCrosStub; // </if> @@ -68,7 +68,7 @@ let isDriveMounted: boolean = true; - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> const driveDestinationKey: string = 'Save to Drive CrOS/local/'; // </if> @@ -82,7 +82,7 @@ // Stub out native layer. nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> nativeLayerCros = setNativeLayerCrosInstance(); // </if> localDestinations = []; @@ -181,15 +181,15 @@ }); function getLocalOrigin(): DestinationOrigin { - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> return DestinationOrigin.CROS; // </if> - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> return DestinationOrigin.LOCAL; // </if> } - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> function assertGoogleDrive() { assertEquals( GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS, @@ -249,7 +249,7 @@ assertFalse(destinationSettings.$.destinationSelect.disabled); const dropdownItems = [ 'Save as PDF/local/', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> driveDestinationKey, // </if> ]; @@ -282,7 +282,7 @@ const dropdownItems = [ makeLocalDestinationKey('ID1'), makeLocalDestinationKey('ID2'), makeLocalDestinationKey('ID3'), 'Save as PDF/local/', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> driveDestinationKey, // </if> ]; @@ -317,7 +317,7 @@ const dropdownItems = [ makeLocalDestinationKey('ID1'), makeLocalDestinationKey('ID3'), 'Save as PDF/local/', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> driveDestinationKey, // </if> ]; @@ -348,7 +348,7 @@ const dropdownItems = [ makeLocalDestinationKey('ID1'), makeLocalDestinationKey('ID3'), makeLocalDestinationKey('ID4'), 'Save as PDF/local/', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> driveDestinationKey, // </if> ]; @@ -356,7 +356,7 @@ }); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Tests that the dropdown contains the appropriate destinations when // Google Drive is in the recent destinations. test( @@ -455,7 +455,7 @@ const dropdownItems = [ makeLocalDestinationKey('ID1'), makeLocalDestinationKey('ID3'), makeLocalDestinationKey('ID4'), 'Save as PDF/local/', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> driveDestinationKey, // </if> ]; @@ -481,7 +481,7 @@ }); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Tests that selecting the Google Drive destination results in the // DESTINATION_SELECT event firing, with Google Drive set as the current // destination. @@ -557,7 +557,7 @@ const dropdownItems = [ makeLocalDestinationKey('ID1'), makeLocalDestinationKey('ID2'), makeLocalDestinationKey('ID3'), 'Save as PDF/local/', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> driveDestinationKey, // </if> ]; @@ -600,7 +600,7 @@ const dropdownItems = [ makeLocalDestinationKey('ID1'), makeLocalDestinationKey('ID2'), makeLocalDestinationKey('ID3'), 'Save as PDF/local/', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> driveDestinationKey, // </if> ]; @@ -735,10 +735,10 @@ // Because the 'Save as PDF' fallback is unavailable, the first // destination is selected. const expectedDestination = - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> 'Save to Drive CrOS/local/'; // </if> - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> makeLocalDestinationKey('ID1'); // </if> assertDropdownItems([expectedDestination]); @@ -769,7 +769,7 @@ .then(() => assertDropdownItems(['noDestinations'])); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> /** * Tests that destinations with a EULA will fetch the EULA URL when * selected.
diff --git a/chrome/test/data/webui/print_preview/destination_store_test.ts b/chrome/test/data/webui/print_preview/destination_store_test.ts index e4b0ad6..b09759b 100644 --- a/chrome/test/data/webui/print_preview/destination_store_test.ts +++ b/chrome/test/data/webui/print_preview/destination_store_test.ts
@@ -3,18 +3,18 @@ // found in the LICENSE file. import {Destination, DestinationErrorType, DestinationStore, DestinationStoreEventType, GooglePromotedDestinationId, LocalDestinationInfo, makeRecentDestination, NativeInitialSettings, NativeLayerImpl, PrinterType} from 'chrome://print/print_preview.js'; -// <if expr="not chromeos_ash and not chromeos_lacros"> +// <if expr="not is_chromeos"> import {RecentDestination} from 'chrome://print/print_preview.js'; // </if> import {assert} from 'chrome://resources/js/assert.m.js'; -// <if expr="not chromeos_ash and not chromeos_lacros"> +// <if expr="not is_chromeos"> import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; // </if> import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise} from 'chrome://webui-test/test_util.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> import {NativeLayerStub} from './native_layer_stub.js'; @@ -30,14 +30,14 @@ MultipleRecentDestinationsOneRequest: 'multiple recent destinations one request', DefaultDestinationSelectionRules: 'default destination selection rules', - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> SystemDefaultPrinterPolicy: 'system default printer policy', // </if> KioskModeSelectsFirstPrinter: 'kiosk mode selects first printer', NoPrintersShowsError: 'no printers shows error', RecentSaveAsPdf: 'recent save as pdf', LoadAndSelectDestination: 'select loaded destination', - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> LoadSaveToDriveCros: 'load Save to Drive Cros', DriveNotMounted: 'drive not mounted', // </if> @@ -67,7 +67,7 @@ nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> @@ -216,10 +216,10 @@ // should have been selected so there was only one preview request. const reportedPrinters = destinationStore.destinations(); const expectedPrinters = - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> 7; // </if> - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> 6; // </if> assertEquals(expectedPrinters, reportedPrinters.length); @@ -249,7 +249,7 @@ }); }); - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> /** * Tests that if the system default printer policy is enabled the system * default printer is automatically selected even if the user has recent @@ -420,7 +420,7 @@ }); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> /** Tests that the SAVE_TO_DRIVE_CROS destination is loaded on Chrome OS. */ test( assert(destination_store_test.TestNames.LoadSaveToDriveCros), function() {
diff --git a/chrome/test/data/webui/print_preview/duplex_settings_test.ts b/chrome/test/data/webui/print_preview/duplex_settings_test.ts index cda5827d..8ca96c9a 100644 --- a/chrome/test/data/webui/print_preview/duplex_settings_test.ts +++ b/chrome/test/data/webui/print_preview/duplex_settings_test.ts
@@ -96,7 +96,7 @@ assertTrue(duplexSection.getSetting('duplexShortEdge').setFromUi); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Tests that if settings are enforced by enterprise policy the // appropriate UI is disabled. test('disabled by policy', function() {
diff --git a/chrome/test/data/webui/print_preview/invalid_settings_browsertest.ts b/chrome/test/data/webui/print_preview/invalid_settings_browsertest.ts index dd066ef..210615a 100644 --- a/chrome/test/data/webui/print_preview/invalid_settings_browsertest.ts +++ b/chrome/test/data/webui/print_preview/invalid_settings_browsertest.ts
@@ -7,7 +7,7 @@ import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {waitBeforeNextRender} from 'chrome://webui-test/test_util.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> import {NativeLayerStub} from './native_layer_stub.js'; @@ -51,7 +51,7 @@ setup(function() { nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> document.body.innerHTML = '';
diff --git a/chrome/test/data/webui/print_preview/key_event_test.ts b/chrome/test/data/webui/print_preview/key_event_test.ts index 8c4011f..52f6332 100644 --- a/chrome/test/data/webui/print_preview/key_event_test.ts +++ b/chrome/test/data/webui/print_preview/key_event_test.ts
@@ -11,7 +11,7 @@ import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> import {NativeLayerStub} from './native_layer_stub.js'; @@ -51,7 +51,7 @@ getCddTemplateWithAdvancedSettings(1, initialSettings.printerName)); nativeLayer.setPageCount(3); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> const pluginProxy = new TestPluginProxy();
diff --git a/chrome/test/data/webui/print_preview/model_settings_availability_test.ts b/chrome/test/data/webui/print_preview/model_settings_availability_test.ts index b410006..cb91fa6 100644 --- a/chrome/test/data/webui/print_preview/model_settings_availability_test.ts +++ b/chrome/test/data/webui/print_preview/model_settings_availability_test.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. import {Destination, DestinationOrigin, DuplexType, Margins, MarginsType, PrintPreviewModelElement, Size} from 'chrome://print/print_preview.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; // </if> @@ -543,7 +543,7 @@ // Windows and macOS depend on policy - see policy_test.js for their // testing coverage. model.set('documentSettings.isModifiable', false); - // <if expr="is_linux or chromeos_ash or chromeos_lacros"> + // <if expr="is_linux or is_chromeos"> // Always available for PDFs on Linux and ChromeOS assertTrue(model.settings.rasterize.available); assertFalse(model.settings.rasterize.setFromUi); @@ -587,7 +587,7 @@ assertFalse(model.settings.pagesPerSheet.available); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> test('pin', function() { // Make device unmanaged. loadTimeData.overrideValues({isEnterpriseManaged: false});
diff --git a/chrome/test/data/webui/print_preview/model_settings_policy_test.ts b/chrome/test/data/webui/print_preview/model_settings_policy_test.ts index 1c8df71..f3e5143 100644 --- a/chrome/test/data/webui/print_preview/model_settings_policy_test.ts +++ b/chrome/test/data/webui/print_preview/model_settings_policy_test.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. import {ColorModeRestriction, Destination, DestinationOrigin, DuplexModeRestriction, Margins, PrintPreviewModelElement, Size} from 'chrome://print/print_preview.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {PinModeRestriction} from 'chrome://print/print_preview.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; // </if> @@ -251,7 +251,7 @@ }); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> test('pin managed', function() { [{ // No policies, settings is modifiable.
diff --git a/chrome/test/data/webui/print_preview/model_test.ts b/chrome/test/data/webui/print_preview/model_test.ts index ff2f8ae..5e9ac803 100644 --- a/chrome/test/data/webui/print_preview/model_test.ts +++ b/chrome/test/data/webui/print_preview/model_test.ts
@@ -3,11 +3,11 @@ // found in the LICENSE file. import {Destination, DestinationOrigin, DuplexMode, makeRecentDestination, MarginsType, PrinterType, PrintPreviewModelElement, PrintTicket, RecentDestination, ScalingType, Size} from 'chrome://print/print_preview.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {GooglePromotedDestinationId} from 'chrome://print/print_preview.js'; // </if> import {assert} from 'chrome://resources/js/assert.m.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; // </if> import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -65,7 +65,7 @@ isLandscapeEnabled: false, isColorEnabled: true, vendorOptions: {}, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> isPinEnabled: false, pinValue: '', // </if> @@ -92,7 +92,7 @@ paperType: 1, printArea: 6, }, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> isPinEnabled: true, pinValue: '0000', // </if> @@ -157,7 +157,7 @@ .then(() => testStickySetting('scalingType', 'scalingType')) .then(() => testStickySetting('scalingTypePdf', 'scalingTypePdf')) .then(() => testStickySetting('vendorItems', 'vendorOptions')); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> promise = promise.then(() => testStickySetting('pin', 'isPinEnabled')) .then(() => testStickySetting('pinValue', 'pinValue')); // </if> @@ -226,7 +226,7 @@ paperType: 1, }, ranges: [{from: 2, to: 2}], - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> pin: true, pinValue: '0000', // </if> @@ -268,17 +268,17 @@ * print ticket. */ test(assert(model_test.TestNames.GetPrintTicket), function() { - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> const origin = DestinationOrigin.CROS; // </if> - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> const origin = DestinationOrigin.LOCAL; // </if> const testDestination = new Destination('FooDevice', origin, 'FooName'); testDestination.capabilities = getCddTemplateWithAdvancedSettings(2, 'FooDevice').capabilities; - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Make device managed. It's used for testing pin setting behavior. loadTimeData.overrideValues({isEnterpriseManaged: true}); // </if> @@ -312,7 +312,7 @@ pageWidth: 612, pageHeight: 792, showSystemDialog: false, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> printToGoogleDrive: false, advancedSettings: { printArea: 4, @@ -350,7 +350,7 @@ pageWidth: 612, pageHeight: 792, showSystemDialog: false, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> printToGoogleDrive: false, // </if> marginsCustom: { @@ -359,7 +359,7 @@ marginBottom: 300, marginLeft: 400, }, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> pinValue: '0000', advancedSettings: { printArea: 6, @@ -578,7 +578,7 @@ assertEquals(false, model.getSettingValue('duplex')); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Tests that printToGoogleDrive is set correctly on the print ticket for Save // to Drive CrOS. test(assert(model_test.TestNames.PrintToGoogleDriveCros), function() {
diff --git a/chrome/test/data/webui/print_preview/native_layer_stub.ts b/chrome/test/data/webui/print_preview/native_layer_stub.ts index b2f49f9..c97551c 100644 --- a/chrome/test/data/webui/print_preview/native_layer_stub.ts +++ b/chrome/test/data/webui/print_preview/native_layer_stub.ts
@@ -153,7 +153,7 @@ if (printerId === GooglePromotedDestinationId.SAVE_AS_PDF) { return Promise.resolve(getPdfPrinter()); } - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> if (printerId === GooglePromotedDestinationId.SAVE_TO_DRIVE_CROS) { return Promise.resolve(getPdfPrinter()); }
diff --git a/chrome/test/data/webui/print_preview/policy_test.ts b/chrome/test/data/webui/print_preview/policy_test.ts index 83712e7..e0038d2 100644 --- a/chrome/test/data/webui/print_preview/policy_test.ts +++ b/chrome/test/data/webui/print_preview/policy_test.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. import {BackgroundGraphicsModeRestriction, CrButtonElement, CrCheckboxElement, NativeInitialSettings, NativeLayerImpl, PluginProxyImpl, PolicyObjectEntry, PrintPreviewAppElement, PrintPreviewPluralStringProxyImpl, SerializedSettings} from 'chrome://print/print_preview.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {ColorModeRestriction, DuplexMode, DuplexModeRestriction, PinModeRestriction} from 'chrome://print/print_preview.js'; // </if> @@ -12,7 +12,7 @@ import {assertEquals, assertFalse} from 'chrome://webui-test/chai_assert.js'; import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> @@ -72,7 +72,7 @@ [{deviceName: initialSettings.printerName, printerName: 'FooName'}]); nativeLayer.setPageCount(3); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> const pluginProxy = new TestPluginProxy(); @@ -382,7 +382,7 @@ } }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Tests different scenarios of color printing policy. test(assert(policy_tests.TestNames.ColorPolicy), async () => { const tests = [
diff --git a/chrome/test/data/webui/print_preview/preview_generation_test.ts b/chrome/test/data/webui/print_preview/preview_generation_test.ts index ae7d9dd..292993a3 100644 --- a/chrome/test/data/webui/print_preview/preview_generation_test.ts +++ b/chrome/test/data/webui/print_preview/preview_generation_test.ts
@@ -7,7 +7,7 @@ import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> @@ -59,7 +59,7 @@ setup(function() { nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> document.body.innerHTML = '';
diff --git a/chrome/test/data/webui/print_preview/print_button_test.ts b/chrome/test/data/webui/print_preview/print_button_test.ts index 9a2571db..76d59b8f 100644 --- a/chrome/test/data/webui/print_preview/print_button_test.ts +++ b/chrome/test/data/webui/print_preview/print_button_test.ts
@@ -3,13 +3,13 @@ // found in the LICENSE file. import {CrButtonElement, NativeInitialSettings, NativeLayerImpl, PluginProxyImpl, PrintPreviewAppElement, PrintTicket} from 'chrome://print/print_preview.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {GooglePromotedDestinationId} from 'chrome://print/print_preview.js'; // </if> import {assert} from 'chrome://resources/js/assert.m.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> @@ -42,7 +42,7 @@ setup(function() { nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> document.body.innerHTML = ''; @@ -147,7 +147,7 @@ }); }); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> // Tests that hidePreview() is not called if Save to Drive is selected on // Chrome OS and the user clicks print while the preview is loading because // Save to Drive needs to be treated like Save as PDF.
diff --git a/chrome/test/data/webui/print_preview/print_preview_app_test.ts b/chrome/test/data/webui/print_preview/print_preview_app_test.ts index 1bb41338..449f20f 100644 --- a/chrome/test/data/webui/print_preview/print_preview_app_test.ts +++ b/chrome/test/data/webui/print_preview/print_preview_app_test.ts
@@ -8,7 +8,7 @@ import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> @@ -75,7 +75,7 @@ document.body.innerHTML = ''; nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> pluginProxy = new TestPluginProxy();
diff --git a/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts b/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts index 5bfcf37..dfd036b 100644 --- a/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts +++ b/chrome/test/data/webui/print_preview/print_preview_sidebar_test.ts
@@ -7,7 +7,7 @@ import {assertEquals} from 'chrome://webui-test/chai_assert.js'; import {fakeDataBind} from 'chrome://webui-test/test_util.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> @@ -37,7 +37,7 @@ // Stub out the native layer. nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> nativeLayer.setLocalDestinationCapabilities(getCddTemplate('FooDevice'));
diff --git a/chrome/test/data/webui/print_preview/print_preview_test_utils.ts b/chrome/test/data/webui/print_preview/print_preview_test_utils.ts index 5621241..f5ca64d3 100644 --- a/chrome/test/data/webui/print_preview/print_preview_test_utils.ts +++ b/chrome/test/data/webui/print_preview/print_preview_test_utils.ts
@@ -92,7 +92,7 @@ }, }, }; - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> template.capabilities!.printer.pin = {supported: true}; // </if> return template; @@ -276,10 +276,10 @@ export function getDestinations(localDestinations: LocalDestinationInfo[]): Destination[] { const destinations: Destination[] = []; - // <if expr="not chromeos_ash and not chromeos_lacros"> + // <if expr="not is_chromeos"> const origin = DestinationOrigin.LOCAL; // </if> - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> const origin = DestinationOrigin.CROS; // </if> // Five destinations. FooDevice is the system default. @@ -362,7 +362,7 @@ testListenerElement.addWebUIListener.bind(testListenerElement)); } -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> /** * @return The Google Drive destination. */
diff --git a/chrome/test/data/webui/print_preview/restore_state_test.ts b/chrome/test/data/webui/print_preview/restore_state_test.ts index cd3f980..9f44650 100644 --- a/chrome/test/data/webui/print_preview/restore_state_test.ts +++ b/chrome/test/data/webui/print_preview/restore_state_test.ts
@@ -6,7 +6,7 @@ import {assert} from 'chrome://resources/js/assert.m.js'; import {assertEquals} from 'chrome://webui-test/chai_assert.js'; -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> import {setNativeLayerCrosInstance} from './native_layer_cros_stub.js'; // </if> @@ -35,7 +35,7 @@ setup(function() { nativeLayer = new NativeLayerStub(); NativeLayerImpl.setInstance(nativeLayer); - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> setNativeLayerCrosInstance(); // </if> document.body.innerHTML = ''; @@ -145,7 +145,7 @@ isDuplexShortEdge: true, isLandscapeEnabled: true, isColorEnabled: true, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> isPinEnabled: true, pinValue: '0000', // </if> @@ -186,7 +186,7 @@ isDuplexShortEdge: false, isLandscapeEnabled: false, isColorEnabled: false, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> isPinEnabled: false, pinValue: '', // </if> @@ -303,7 +303,7 @@ printArea: 6, }, }, - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> { section: 'print-preview-pin-settings', settingName: 'pin',
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 16cb5cdf..8b394e2a 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -462,13 +462,13 @@ } }; -// TODO(crbug.com/1263420): Flaky on Linux Tests(dbg). +// TODO(crbug.com/1351019): Flaky on Linux Tests(dbg). GEN('#if BUILDFLAG(IS_LINUX)'); GEN('#define MAYBE_PrivacyPageTests DISABLED_PrivacyPageTests'); GEN('#else'); GEN('#define MAYBE_PrivacyPageTests PrivacyPageTests'); GEN('#endif'); -TEST_F('CrSettingsPrivacyPageTest', 'PrivacyPageTests', function() { +TEST_F('CrSettingsPrivacyPageTest', 'MAYBE_PrivacyPageTests', function() { runMochaSuite('PrivacyPage'); });
diff --git a/chrome/test/webapps/coverage/coverage_cros.tsv b/chrome/test/webapps/coverage/coverage_cros.tsv index d8f6a53..acfba4af 100644 --- a/chrome/test/webapps/coverage/coverage_cros.tsv +++ b/chrome/test/webapps/coverage/coverage_cros.tsv
@@ -288,14 +288,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕
diff --git a/chrome/test/webapps/coverage/coverage_linux.tsv b/chrome/test/webapps/coverage/coverage_linux.tsv index fefb515c..c3fdabb 100644 --- a/chrome/test/webapps/coverage/coverage_linux.tsv +++ b/chrome/test/webapps/coverage/coverage_linux.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 53%, with partial coverage: 70% +# Full coverage: 53%, with partial coverage: 71% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -394,8 +394,8 @@ install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 @@ -418,14 +418,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕
diff --git a/chrome/test/webapps/coverage/coverage_mac.tsv b/chrome/test/webapps/coverage/coverage_mac.tsv index 31a4641..cd7e0ef 100644 --- a/chrome/test/webapps/coverage/coverage_mac.tsv +++ b/chrome/test/webapps/coverage/coverage_mac.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 47%, with partial coverage: 61% +# Full coverage: 47%, with partial coverage: 62% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -394,8 +394,8 @@ install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 @@ -418,14 +418,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕
diff --git a/chrome/test/webapps/coverage/coverage_win.tsv b/chrome/test/webapps/coverage/coverage_win.tsv index 9eca1cc..bd4e8f3e 100644 --- a/chrome/test/webapps/coverage/coverage_win.tsv +++ b/chrome/test/webapps/coverage/coverage_win.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 55%, with partial coverage: 72% +# Full coverage: 55%, with partial coverage: 73% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -394,8 +394,8 @@ install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 @@ -418,14 +418,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕
diff --git a/chrome/test/webapps/data/actions.md b/chrome/test/webapps/data/actions.md index 68105ecb..a8a20510 100644 --- a/chrome/test/webapps/data/actions.md +++ b/chrome/test/webapps/data/actions.md
@@ -20,7 +20,7 @@ TODO(dmurph): Possibly this table up into markdown-header section. -| # Action base name | Argument Types | Output Actions | Unique Identifier (next: 128) | Status (WIP, Implemented, Not Implemented, Parameterized) | Description | Metadata, implementation bug, etc | +| # Action base name | Argument Types | Output Actions | Unique Identifier (next: 132) | Status (WIP, Implemented, Not Implemented, Parameterized) | Description | Metadata, implementation bug, etc | | --- | --- | --- | --- | --- | --- | --- | | # Badging | | check_app_badge_empty | Site | | 2 | Not Implemented | Check that the 'badge' on the app icon is empty | | @@ -67,7 +67,11 @@ | install_policy_app_tabbed | Site | install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) | 59 | Parameterized | | | | install_policy_app_windowed | Site | install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) | 60 | Parameterized | | | | install_tabbed | Site | install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) | 61 | Parameterized | All installation methods that result in a tabbed webapp. | | +| install_tabbed_with_shortcut | Site | install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) | 128 | Parameterized | All installation methods that result in a tabbed webapp with shortcut created. | | +| install_tabbed_no_shortcut | Site | install_policy_app_tabbed_no_shortcut($1) | 129 | Parameterized | All installation methods that result in a tabbed webapp without shortcut. | | | install_windowed | Site | install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) | 62 | Parameterized | All installation methods that result in a windowed webapp. | | +| install_windowed_with_shortcut | Site | install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) | 130 | Parameterized | All installation methods that result in a windowed webapp with shortcut created. | | +| install_windowed_no_shortcut | Site | install_policy_app_windowed_no_shortcut($1) | 131 | Parameterized | All installation methods that result in a windowed webapp without shortcut. | | | install_with_shortcut | Site | install_policy_app_windowed_shortcut($1) & install_policy_app_tabbed_shortcut($1) & install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) | 63 | Parameterized | | | | # Uninstall | | uninstall_from_os | Site | | 87 | WIP | Uninstalls the app from OS integration - e.g. Windows Control Panel / Start menu | | @@ -121,7 +125,7 @@ | set_open_in_window | Site | | 51 | Implemented | Check the "open in window" checkbox in the right-click menu of the app icon, in the app list page | | | check_window_color_correct | Site | | 77 | Not Implemented | The color of the window is correct. | P3 | | check_window_icon_correct | | | 78 | Not Implemented | | P3 | -| create_shortcuts | Site | | 72 | Not Implemented | "create shortcuts" in chrome://apps | P2 | +| create_shortcuts | Site | | 72 | Implemented | "create shortcuts" in chrome://apps. Win/Mac/Linux only. | P2 | | delete_platform_shortcut | Site | | 74 | Implemented | Delete the shortcut that lives on the operating system. Win/Mac/Linux only. | P2 | | delete_profile | | | 83 | Not Implemented | Delete the user profile. | P4 | | # Launching |
diff --git a/chrome/test/webapps/data/critical_user_journeys.md b/chrome/test/webapps/data/critical_user_journeys.md index 9fb19b6b..ef35aae 100644 --- a/chrome/test/webapps/data/critical_user_journeys.md +++ b/chrome/test/webapps/data/critical_user_journeys.md
@@ -125,8 +125,10 @@ | WMLC | install | delete_profile | check_app_list_empty | | WMLC | install | delete_profile | check_app_not_in_list | | WMLC | install_with_shortcut | delete_profile | check_platform_shortcut_not_exists | -| WMLC | install_with_shortcut | delete_platform_shortcut | create_shortcuts | launch_from_platform_shortcut | check_tab_created | -| WMLC | install_no_shortcut | create_shortcuts | launch_from_platform_shortcut | check_window_created | +| WMLC | install_tabbed_with_shortcut | delete_platform_shortcut | create_shortcuts | launch_from_platform_shortcut | check_tab_created | +| WMLC | install_windowed_with_shortcut | delete_platform_shortcut | create_shortcuts | launch_from_platform_shortcut | check_window_created | +| WMLC | install_tabbed_no_shortcut | create_shortcuts | launch_from_platform_shortcut | check_tab_created | +| WMLC | install_windowed_no_shortcut | create_shortcuts | launch_from_platform_shortcut | check_window_created | | WMLC | install_by_user_windowed | open_in_chrome | check_tab_created | | WMLC | install_by_user_windowed | navigate_pwa_site_a_to(SiteB) | open_in_chrome | check_tab_created | | WML | install_windowed | open_app_settings | check_browser_navigation_is_app_settings |
diff --git a/chrome/test/webapps/data/framework_supported_actions.csv b/chrome/test/webapps/data/framework_supported_actions.csv index 49965c2..1a92b65 100644 --- a/chrome/test/webapps/data/framework_supported_actions.csv +++ b/chrome/test/webapps/data/framework_supported_actions.csv
@@ -22,6 +22,7 @@ check_window_controls_overlay_toggle, 🌕, 🌕, 🌕, 🌕, close_custom_toolbar, 🌕, 🌕, 🌕, 🌕, close_pwa, 🌕, 🌕, 🌕, 🌕, +create_shortcuts, 🌕, 🌕, 🌕, 🌑, delete_platform_shortcut, 🌕, 🌕, 🌕, 🌑, disable_window_controls_overlay, 🌕, 🌕, 🌕, 🌕, enable_window_controls_overlay, 🌕, 🌕, 🌕, 🌕,
diff --git a/chrome/updater/device_management/dm_storage.cc b/chrome/updater/device_management/dm_storage.cc index 92e55ff..58e27d1 100644 --- a/chrome/updater/device_management/dm_storage.cc +++ b/chrome/updater/device_management/dm_storage.cc
@@ -11,19 +11,27 @@ #include "base/base64.h" #include "base/files/file_enumerator.h" +#include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/important_file_writer.h" +#include "base/memory/scoped_refptr.h" #include "base/notreached.h" +#include "base/path_service.h" #include "base/strings/sys_string_conversions.h" #include "build/build_config.h" #include "chrome/updater/device_management/dm_cached_policy_info.h" #include "chrome/updater/device_management/dm_message.h" #include "chrome/updater/protos/omaha_settings.pb.h" +#include "chrome/updater/updater_branding.h" #include "chrome/updater/updater_scope.h" #include "chrome/updater/util.h" #include "components/policy/proto/device_management_backend.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#if BUILDFLAG(IS_WIN) +#include "base/base_paths_win.h" +#endif // BUILDFLAG(IS_WIN) + namespace updater { namespace { @@ -209,15 +217,27 @@ } scoped_refptr<DMStorage> GetDefaultDMStorage() { +#if BUILDFLAG(IS_WIN) + base::FilePath program_filesx86_dir; + if (!base::PathService::Get(base::DIR_PROGRAM_FILESX86, + &program_filesx86_dir)) { + return nullptr; + } + + return base::MakeRefCounted<DMStorage>( + program_filesx86_dir.AppendASCII(COMPANY_SHORTNAME_STRING) + .AppendASCII(kPolicyCacheSubfolder)); + +#else // BUILDFLAG(IS_WIN) + const absl::optional<base::FilePath> updater_versioned_path = GetVersionedDataDirectory(GetUpdaterScope()); if (!updater_versioned_path) return nullptr; - base::FilePath policy_cache_folder = updater_versioned_path->AppendASCII(kPolicyCacheSubfolder); - return base::MakeRefCounted<DMStorage>(policy_cache_folder); +#endif // BUILDFLAG(IS_WIN) } } // namespace updater
diff --git a/chrome/updater/device_management/dm_storage.h b/chrome/updater/device_management/dm_storage.h index f38d1e1f..dca25dd 100644 --- a/chrome/updater/device_management/dm_storage.h +++ b/chrome/updater/device_management/dm_storage.h
@@ -144,6 +144,10 @@ SEQUENCE_CHECKER(sequence_checker_); }; +// Returns the DMStorage under which the Device Management policies are +// persisted. For Windows, this is `%ProgramFiles(x86)%\{CompanyName}\Policies` +// for security. +// For other platforms, this is `{UpdaterVersionedPath}\Policies`. scoped_refptr<DMStorage> GetDefaultDMStorage(); } // namespace updater
diff --git a/chromeos/ash/components/README.md b/chromeos/ash/components/README.md index 0322788..3bfb6952 100644 --- a/chromeos/ash/components/README.md +++ b/chromeos/ash/components/README.md
@@ -5,6 +5,11 @@ Specifically, each component should have its own DEPS to be isolated from other components. +For example, //chromeos/ash/components/account_manager manages the user's GAIA +accounts, but only on behalf of ChromeOS code. +//components/account_manager_core contains cross-platform support for +accounts. + Much of this code used to live in //chromeos/components. The [Lacros project](/docs/lacros.md) is extracting browser functionality into a separate binary. As part of this migration, code used only by the ash-chrome
diff --git a/ash/components/account_manager/BUILD.gn b/chromeos/ash/components/account_manager/BUILD.gn similarity index 88% rename from ash/components/account_manager/BUILD.gn rename to chromeos/ash/components/account_manager/BUILD.gn index a84fea8..db73dc7 100644 --- a/ash/components/account_manager/BUILD.gn +++ b/chromeos/ash/components/account_manager/BUILD.gn
@@ -16,5 +16,5 @@ deps = [ "//base" ] - defines = [ "IS_ASH_COMPONENTS_ACCOUNT_MANAGER_IMPL" ] + defines = [ "IS_CHROMEOS_ASH_COMPONENTS_ACCOUNT_MANAGER_IMPL" ] }
diff --git a/chromeos/ash/components/account_manager/DEPS b/chromeos/ash/components/account_manager/DEPS new file mode 100644 index 0000000..6cd7706 --- /dev/null +++ b/chromeos/ash/components/account_manager/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+components/account_manager_core", +]
diff --git a/ash/components/account_manager/OWNERS b/chromeos/ash/components/account_manager/OWNERS similarity index 100% rename from ash/components/account_manager/OWNERS rename to chromeos/ash/components/account_manager/OWNERS
diff --git a/ash/components/account_manager/account_manager_factory.cc b/chromeos/ash/components/account_manager/account_manager_factory.cc similarity index 96% rename from ash/components/account_manager/account_manager_factory.cc rename to chromeos/ash/components/account_manager/account_manager_factory.cc index 81ccf8c..1d5906f3 100644 --- a/ash/components/account_manager/account_manager_factory.cc +++ b/chromeos/ash/components/account_manager/account_manager_factory.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/account_manager/account_manager_factory.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include <string> #include <utility>
diff --git a/ash/components/account_manager/account_manager_factory.h b/chromeos/ash/components/account_manager/account_manager_factory.h similarity index 88% rename from ash/components/account_manager/account_manager_factory.h rename to chromeos/ash/components/account_manager/account_manager_factory.h index 248a6a7..5c0783ad 100644 --- a/ash/components/account_manager/account_manager_factory.h +++ b/chromeos/ash/components/account_manager/account_manager_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_COMPONENTS_ACCOUNT_MANAGER_ACCOUNT_MANAGER_FACTORY_H_ -#define ASH_COMPONENTS_ACCOUNT_MANAGER_ACCOUNT_MANAGER_FACTORY_H_ +#ifndef CHROMEOS_ASH_COMPONENTS_ACCOUNT_MANAGER_ACCOUNT_MANAGER_FACTORY_H_ +#define CHROMEOS_ASH_COMPONENTS_ACCOUNT_MANAGER_ACCOUNT_MANAGER_FACTORY_H_ #include <memory> #include <string> @@ -31,7 +31,8 @@ // Once multi signin has been removed and multi profile on ChromeOS takes its // place, remove this class and make |AccountManager| a part of // |g_browser_process|. -class COMPONENT_EXPORT(ASH_COMPONENTS_ACCOUNT_MANAGER) AccountManagerFactory { +class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_ACCOUNT_MANAGER) + AccountManagerFactory { public: AccountManagerFactory(); AccountManagerFactory(const AccountManagerFactory&) = delete; @@ -74,4 +75,4 @@ } // namespace ash -#endif // ASH_COMPONENTS_ACCOUNT_MANAGER_ACCOUNT_MANAGER_FACTORY_H_ +#endif // CHROMEOS_ASH_COMPONENTS_ACCOUNT_MANAGER_ACCOUNT_MANAGER_FACTORY_H_
diff --git a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc index 8f67d40..d59ac00f 100644 --- a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc +++ b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.cc
@@ -385,6 +385,24 @@ PostReply(FROM_HERE, std::move(callback), true); } +void FakeSessionManagerClient::UnblockDevModeForEnrollment( + VoidDBusMethodCallback callback) { + unblock_dev_mode_enrollment_call_count_++; + PostReply(FROM_HERE, std::move(callback), true); +} + +void FakeSessionManagerClient::UnblockDevModeForInitialStateDetermination( + VoidDBusMethodCallback callback) { + unblock_dev_mode_init_state_call_count_++; + PostReply(FROM_HERE, std::move(callback), true); +} + +void FakeSessionManagerClient::UnblockDevModeForCarrierLock( + VoidDBusMethodCallback callback) { + unblock_dev_mode_carrier_lock_call_count_++; + PostReply(FROM_HERE, std::move(callback), true); +} + void FakeSessionManagerClient::StartTPMFirmwareUpdate( const std::string& update_mode) { last_tpm_firmware_update_mode_ = update_mode;
diff --git a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h index ccc7504..c976f0b 100644 --- a/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h +++ b/chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h
@@ -99,6 +99,10 @@ void StartRemoteDeviceWipe( const enterprise_management::SignedData& signed_command) override; void ClearForcedReEnrollmentVpd(VoidDBusMethodCallback callback) override; + void UnblockDevModeForEnrollment(VoidDBusMethodCallback callback) override; + void UnblockDevModeForInitialStateDetermination( + VoidDBusMethodCallback callback) override; + void UnblockDevModeForCarrierLock(VoidDBusMethodCallback callback) override; void StartTPMFirmwareUpdate(const std::string& update_mode) override; void RequestLockScreen() override; void NotifyLockScreenShown() override; @@ -259,6 +263,18 @@ return clear_forced_re_enrollment_vpd_call_count_; } + int unblock_dev_mode_enrollment_call_count() const { + return unblock_dev_mode_enrollment_call_count_; + } + + int unblock_dev_mode_init_state_call_count() const { + return unblock_dev_mode_init_state_call_count_; + } + + int unblock_dev_mode_carrier_lock_call_count() const { + return unblock_dev_mode_carrier_lock_call_count_; + } + void set_on_start_device_wipe_callback(base::OnceClosure callback); int start_device_wipe_call_count() const { return start_device_wipe_call_count_; @@ -377,6 +393,9 @@ AdbSideloadResponseCode::SUCCESS; int clear_forced_re_enrollment_vpd_call_count_ = 0; + int unblock_dev_mode_enrollment_call_count_ = 0; + int unblock_dev_mode_init_state_call_count_ = 0; + int unblock_dev_mode_carrier_lock_call_count_ = 0; // Callback which is run after calling |StartDeviceWipe| or // |StartRemoteDeviceWipe|. base::OnceClosure on_start_device_wipe_callback_;
diff --git a/chromeos/ash/components/dbus/session_manager/session_manager_client.cc b/chromeos/ash/components/dbus/session_manager/session_manager_client.cc index bf1367aa..f867da13 100644 --- a/chromeos/ash/components/dbus/session_manager/session_manager_client.cc +++ b/chromeos/ash/components/dbus/session_manager/session_manager_client.cc
@@ -378,6 +378,41 @@ weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } + void UnblockDevModeForEnrollment(VoidDBusMethodCallback callback) override { + dbus::MethodCall method_call( + login_manager::kSessionManagerInterface, + login_manager::kSessionManagerUnblockDevModeForEnrollment); + dbus::MessageWriter writer(&method_call); + session_manager_proxy_->CallMethod( + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::BindOnce(&SessionManagerClientImpl::OnVoidMethod, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + } + + void UnblockDevModeForCarrierLock(VoidDBusMethodCallback callback) override { + dbus::MethodCall method_call( + login_manager::kSessionManagerInterface, + login_manager::kSessionManagerUnblockDevModeForCarrierLock); + dbus::MessageWriter writer(&method_call); + session_manager_proxy_->CallMethod( + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::BindOnce(&SessionManagerClientImpl::OnVoidMethod, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + } + + void UnblockDevModeForInitialStateDetermination( + VoidDBusMethodCallback callback) override { + dbus::MethodCall method_call( + login_manager::kSessionManagerInterface, + login_manager:: + kSessionManagerUnblockDevModeForInitialStateDetermination); + dbus::MessageWriter writer(&method_call); + session_manager_proxy_->CallMethod( + &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::BindOnce(&SessionManagerClientImpl::OnVoidMethod, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + } + void StartTPMFirmwareUpdate(const std::string& update_mode) override { dbus::MethodCall method_call( login_manager::kSessionManagerInterface,
diff --git a/chromeos/ash/components/dbus/session_manager/session_manager_client.h b/chromeos/ash/components/dbus/session_manager/session_manager_client.h index 1d58c12..8a49fe8 100644 --- a/chromeos/ash/components/dbus/session_manager/session_manager_client.h +++ b/chromeos/ash/components/dbus/session_manager/session_manager_client.h
@@ -240,6 +240,14 @@ // Set the block_demode and check_enrollment flags to 0 in the VPD. virtual void ClearForcedReEnrollmentVpd(VoidDBusMethodCallback callback) = 0; + virtual void UnblockDevModeForEnrollment(VoidDBusMethodCallback callback) = 0; + + virtual void UnblockDevModeForInitialStateDetermination( + VoidDBusMethodCallback callback) = 0; + + virtual void UnblockDevModeForCarrierLock( + VoidDBusMethodCallback callback) = 0; + // Triggers a TPM firmware update. virtual void StartTPMFirmwareUpdate(const std::string& update_mode) = 0;
diff --git a/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc b/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc index af10c92..1ba2f34 100644 --- a/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc +++ b/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc
@@ -192,17 +192,15 @@ void SetUp() override { network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>(); - histogram_tester_ = std::make_unique<base::HistogramTester>(); - - shill_service_client_ = ShillServiceClient::Get()->GetTestInterface(); - shill_service_client_->ClearServices(); - base::RunLoop().RunUntilIdle(); - + network_handler_test_helper_->ClearServices(); network_handler_test_helper_->RegisterPrefs(profile_prefs_.registry(), local_state_.registry()); - network_handler_test_helper_->InitializePrefs(&profile_prefs_, &local_state_); + + shill_service_client_ = network_handler_test_helper_->service_test(); + + histogram_tester_ = std::make_unique<base::HistogramTester>(); } void TearDown() override { @@ -259,6 +257,8 @@ /*visible=*/true); shill_service_client_->SetServiceProperty( kTestServicePath, shill::kEidProperty, base::Value("eid")); + shill_service_client_->SetServiceProperty( + kTestServicePath, shill::kIccidProperty, base::Value("iccid")); base::RunLoop().RunUntilIdle(); NetworkMetricsHelper::LogAllConnectionResult(kTestGuid, @@ -291,6 +291,8 @@ /*visible=*/true); shill_service_client_->SetServiceProperty( kTestServicePath, shill::kEidProperty, base::Value("eid")); + shill_service_client_->SetServiceProperty( + kTestServicePath, shill::kIccidProperty, base::Value("iccid")); std::unique_ptr<NetworkUIData> ui_data = NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_DEVICE_POLICY); shill_service_client_->SetServiceProperty(kTestServicePath, @@ -332,6 +334,8 @@ shill_service_client_->AddService(kTestServicePath, kTestGuid, kTestName, shill::kTypeCellular, shill::kStateIdle, /*visible=*/true); + shill_service_client_->SetServiceProperty( + kTestServicePath, shill::kIccidProperty, base::Value("iccid")); base::RunLoop().RunUntilIdle(); NetworkMetricsHelper::LogAllConnectionResult(kTestGuid,
diff --git a/chromeos/ash/components/network/network_test_helper_base.cc b/chromeos/ash/components/network/network_test_helper_base.cc index dd31311f..ea43a62 100644 --- a/chromeos/ash/components/network/network_test_helper_base.cc +++ b/chromeos/ash/components/network/network_test_helper_base.cc
@@ -59,7 +59,6 @@ } void NetworkTestHelperBase::ResetDevicesAndServices() { - base::RunLoop().RunUntilIdle(); // Process any pending updates ClearDevices(); ClearServices(); @@ -80,11 +79,13 @@ } void NetworkTestHelperBase::ClearDevices() { + base::RunLoop().RunUntilIdle(); // Process any pending updates device_test_->ClearDevices(); base::RunLoop().RunUntilIdle(); } void NetworkTestHelperBase::ClearServices() { + base::RunLoop().RunUntilIdle(); // Process any pending updates service_test_->ClearServices(); base::RunLoop().RunUntilIdle(); }
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 5ee08b0..5710a64a 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -2927,21 +2927,6 @@ <message name="IDS_SHIMLESS_RMA_FINALIZE_COMPLETE" translateable="false" desc="Message to display when finalization is complete."> Complete. </message> - <message name="IDS_SHIMLESS_RMA_FINALIZE_FAILED_BLOCKING" translateable="false" desc="Message to display when finalization failed and RMA cannot complete."> - Failed, blocking. - </message> - <message name="IDS_SHIMLESS_RMA_FINALIZE_FAILED_NON_BLOCKING" translateable="false" desc="Message to display when finalization failed, but RMA can continue."> - Failed, non blocking. - </message> - <message name="IDS_SHIMLESS_RMA_FINALIZE_FAILED_RETRY_BUTTON_LABEL" translateable="false" desc="The label for the button to retry finalization."> - Retry finalization - </message> - <message name="IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_TITLE" desc="The title of the dialog that shows up when finalization failed because Write Protect is off."> - Make sure Write Protect is on - </message> - <message name="IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_BODY" desc="The body of the dialog that shows up when finalization failed because Write Protect is off."> - Write Protect is still turned off. To proceed, turn on Write Protect. - </message> <!-- Device provisioning page --> <message name="IDS_SHIMLESS_RMA_PROVISIONING_TITLE" desc="Title for the device provisioning page. Provisioning is when component specific data is set e.g. erasing fingerprint data from the thumb reader or regenerating the device stable secret before returning the device to a new owner."> Provisioning the device... @@ -3200,6 +3185,23 @@ <message name="IDS_SHIMLESS_RMA_CRITICAL_REBOOT_BUTTON" desc="Label for the button that attempts to cancel RMA and reboot the device."> Restart </message> + <!-- Hardware error page --> + <message name="IDS_SHIMLESS_RMA_HARDWARE_ERROR_TITLE" desc="The title for the hardware error page. Hardware errors occur on the finalization and the provisioning step and can only be resolved by replacing the main board."> + Can't complete repair + </message> + <message name="IDS_SHIMLESS_RMA_HARDWARE_ERROR_MESSAGE" desc="The message for the hardware error explaining how to fix it."> + Something went wrong. This is most likely due to a hardware issue. Replace the main board and try the repair process again. + </message> + <message name="IDS_SHIMLESS_RMA_HARDWARE_SHUTDOWN_BUTTON" desc="Label for the shut down button on the hardware error page."> + Shut down + </message> + <!-- Reboot page --> + <message name="IDS_SHIMLESS_RMA_REBOOT_PAGE_TITLE" desc="The title for the reboot page. The reboot page is shown when the device is preparing to reboot."> + Preparing to restart... + </message> + <message name="IDS_SHIMLESS_RMA_REBOOT_PAGE_MESSAGE" desc="The message for the reboot page explaining how soon the device will reboot."> + System will restart in 5 seconds. + </message> <!-- Wipe device page --> <message name="IDS_SHIMLESS_RMA_WIPE_DEVICE_TITLE" desc="Title for the page where the user chooses whether to erase the data or keep/preserve the data on the device."> Device is going to the same user. Erase user data?
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_BODY.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_BODY.png.sha1 deleted file mode 100644 index ea3f658..0000000 --- a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_BODY.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -1dd091a9d6b5f1820bd412015d75656f443d0846 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_TITLE.png.sha1 deleted file mode 100644 index 9091653b..0000000 --- a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_FINALIZE_WP_DISABLED_DIALOG_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -0ddd4f9006b075a6119b77ef4607feedfed99ae0 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_ERROR_MESSAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_ERROR_MESSAGE.png.sha1 new file mode 100644 index 0000000..4f538c9 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_ERROR_MESSAGE.png.sha1
@@ -0,0 +1 @@ +700b679b74d0fa77a285bccc3861c16541a245c5 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_ERROR_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_ERROR_TITLE.png.sha1 new file mode 100644 index 0000000..4f538c9 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_ERROR_TITLE.png.sha1
@@ -0,0 +1 @@ +700b679b74d0fa77a285bccc3861c16541a245c5 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_SHUTDOWN_BUTTON.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_SHUTDOWN_BUTTON.png.sha1 new file mode 100644 index 0000000..4f538c9 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_HARDWARE_SHUTDOWN_BUTTON.png.sha1
@@ -0,0 +1 @@ +700b679b74d0fa77a285bccc3861c16541a245c5 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_REBOOT_PAGE_MESSAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_REBOOT_PAGE_MESSAGE.png.sha1 new file mode 100644 index 0000000..ef13d231 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_REBOOT_PAGE_MESSAGE.png.sha1
@@ -0,0 +1 @@ +3275d5e178ca28fe6c51a7f2ae142cc29b671797 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_REBOOT_PAGE_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_REBOOT_PAGE_TITLE.png.sha1 new file mode 100644 index 0000000..ef13d231 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_REBOOT_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@ +3275d5e178ca28fe6c51a7f2ae142cc29b671797 \ No newline at end of file
diff --git a/chromeos/crosapi/mojom/account_manager.mojom b/chromeos/crosapi/mojom/account_manager.mojom index 0318d36..81eaf28 100644 --- a/chromeos/crosapi/mojom/account_manager.mojom +++ b/chromeos/crosapi/mojom/account_manager.mojom
@@ -10,7 +10,7 @@ // Types of accounts which can be stored in Account Manager. // This must be kept in sync with -// //ash/components/account_manager/tokens.proto +// //components/account_manager_core/chromeos/tokens.proto. [Stable, Extensible] enum AccountType { kUnspecified = 0,
diff --git a/chromeos/crosapi/mojom/device_settings_service.mojom b/chromeos/crosapi/mojom/device_settings_service.mojom index 0f9f1d2c..40ec194 100644 --- a/chromeos/crosapi/mojom/device_settings_service.mojom +++ b/chromeos/crosapi/mojom/device_settings_service.mojom
@@ -6,6 +6,12 @@ import "mojo/public/mojom/base/values.mojom"; +// Optional int64 field. +[Stable] +struct NullableInt64 { + int64 value; +}; + // Copy of UsbDetachableAllowlistProto from chrome_device_policy.proto. [Stable] struct UsbDetachableAllowlist { @@ -25,7 +31,7 @@ // All the device settings data that are needed in Lacros should be here. // -// Next MinVersion: 3 +// Next MinVersion: 4 [Stable] struct DeviceSettings { // The value of AttestationForContentProtectionEnabled device setting. @@ -44,6 +50,18 @@ [MinVersion=2] OptionalBool device_restricted_managed_guest_session_enabled@4; + // The value of ReportDeviceNetworkStatus device policy. + [MinVersion=3] + OptionalBool report_device_network_status@5; + + // The value of ReportDeviceUploadFrequency device policy. + [MinVersion=3] + NullableInt64? report_upload_frequency@6; + + // The value of ReportDeviceNetworkTelemetryCollectionRateMs device policy. + [MinVersion=3] + NullableInt64? report_device_network_telemetry_collection_rate_ms@7; + [Stable] enum OptionalBool { kUnset,
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index 94ddaae..9725133 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-106-5187.0-1658747184-benchmark-106.0.5211.0-r1.orderfile.xz +chromeos-chrome-orderfile-field-106-5195.5-1659346912-benchmark-106.0.5222.0-r1.orderfile.xz
diff --git a/components/account_manager_core/OWNERS b/components/account_manager_core/OWNERS index a576a41e..0ede5691 100644 --- a/components/account_manager_core/OWNERS +++ b/components/account_manager_core/OWNERS
@@ -1,2 +1,2 @@ -file://ash/components/account_manager/OWNERS +file://chromeos/ash/components/account_manager/OWNERS bsazonov@chromium.org
diff --git a/components/account_manager_core/README.md b/components/account_manager_core/README.md index b1b6f0d..7a52936 100644 --- a/components/account_manager_core/README.md +++ b/components/account_manager_core/README.md
@@ -11,5 +11,5 @@ `AccountManagerFacade` - and data structures for Chrome OS accounts. Also, see: -- `//ash/components/account_manager/` - `//chrome/browser/lacros/account_manager/` +- `//chromeos/ash/components/account_manager/`
diff --git a/components/account_manager_core/account.h b/components/account_manager_core/account.h index d6c2ac69..eb12bd38 100644 --- a/components/account_manager_core/account.h +++ b/components/account_manager_core/account.h
@@ -13,7 +13,7 @@ namespace account_manager { // Type of an account, based on the authentication backend of the account. -// Loosely based on //ash/components/account_manager/tokens.proto +// Loosely based on //components/account_manager_core/chromeos/tokens.proto. enum class AccountType : int { // Gaia account (aka Google account) - including enterprise and consumer // accounts.
diff --git a/components/autofill/content/common/mojom/autofill_driver.mojom b/components/autofill/content/common/mojom/autofill_driver.mojom index 5c75c17..e823c14 100644 --- a/components/autofill/content/common/mojom/autofill_driver.mojom +++ b/components/autofill/content/common/mojom/autofill_driver.mojom
@@ -106,10 +106,8 @@ PasswordFormsParsed(array<FormData> forms_data); // Notification that initial layout has occurred and the following password - // forms are visible on the page (e.g. not set to display:none.), and whether - // all frames in the page have been rendered. - PasswordFormsRendered(array<FormData> visible_forms_data, - bool did_stop_loading); + // forms are visible on the page (e.g. not set to display:none.). + PasswordFormsRendered(array<FormData> visible_forms_data); // Notification that this password form was submitted by the user. PasswordFormSubmitted(FormData form_data);
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index 748e189a..7fa1f1f1 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -544,10 +544,10 @@ void PasswordFormsParsed(const std::vector<FormData>& forms_data) override { DeferMsg(&mojom::PasswordManagerDriver::PasswordFormsParsed, forms_data); } - void PasswordFormsRendered(const std::vector<FormData>& visible_forms_data, - bool did_stop_loading) override { + void PasswordFormsRendered( + const std::vector<FormData>& visible_forms_data) override { DeferMsg(&mojom::PasswordManagerDriver::PasswordFormsRendered, - visible_forms_data, did_stop_loading); + visible_forms_data); } void PasswordFormSubmitted(const FormData& form_data) override { DeferMsg(&mojom::PasswordManagerDriver::PasswordFormSubmitted, form_data); @@ -1329,10 +1329,7 @@ // Send the PasswordFormsRendered message regardless of whether // |password_forms_data| is empty. The empty |password_forms_data| are a // possible signal to the browser that a pending login attempt succeeded. - WebFrame* main_frame = render_frame()->GetWebFrame()->Top(); - bool did_stop_loading = !main_frame || !main_frame->IsLoading(); - GetPasswordManagerDriver().PasswordFormsRendered(password_forms_data, - did_stop_loading); + GetPasswordManagerDriver().PasswordFormsRendered(password_forms_data); } else { // If there is a password field, but the list of password forms is empty for // some reason, add a dummy form to the list. It will cause a request to the
diff --git a/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc b/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc index 6475369..d7b89c20 100644 --- a/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc +++ b/components/autofill/content/renderer/renderer_save_password_progress_logger_unittest.cc
@@ -45,8 +45,7 @@ const std::vector<autofill::FormData>& form_data) override {} void PasswordFormsRendered( - const std::vector<autofill::FormData>& visible_forms_data, - bool did_stop_loading) override {} + const std::vector<autofill::FormData>& visible_forms_data) override {} void PasswordFormSubmitted(const autofill::FormData& form_data) override {}
diff --git a/components/autofill_assistant/browser/public/password_change/website_login_manager_impl_unittest.cc b/components/autofill_assistant/browser/public/password_change/website_login_manager_impl_unittest.cc index 0f1ce19..464f64281 100644 --- a/components/autofill_assistant/browser/public/password_change/website_login_manager_impl_unittest.cc +++ b/components/autofill_assistant/browser/public/password_change/website_login_manager_impl_unittest.cc
@@ -406,7 +406,7 @@ // The user submits the an entirely new credential. password_manager_->OnPasswordFormsParsed(&driver_, {form.form_data}); - password_manager_->OnPasswordFormsRendered(&driver_, {form.form_data}, true); + password_manager_->OnPasswordFormsRendered(&driver_, {form.form_data}); password_manager_->OnPasswordFormSubmitted(&driver_, form.form_data); EXPECT_TRUE(password_manager_->GetSubmittedManagerForTest()); EXPECT_TRUE(manager_->ReadyToSaveSubmittedPassword());
diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmarks/browser/bookmark_codec.cc index 68c4c43..81911c5 100644 --- a/components/bookmarks/browser/bookmark_codec.cc +++ b/components/bookmarks/browser/bookmark_codec.cc
@@ -48,6 +48,7 @@ const char BookmarkCodec::kTypeURL[] = "url"; const char BookmarkCodec::kTypeFolder[] = "folder"; const char BookmarkCodec::kSyncMetadata[] = "sync_metadata"; +const char BookmarkCodec::kDateLastUsed[] = "date_last_used"; // Current version of the file. static const int kCurrentVersion = 1; @@ -156,6 +157,9 @@ // TODO(crbug.com/634507): Avoid ToInternalValue(). value.SetStringKey(kDateAddedKey, base::NumberToString( node->date_added().ToInternalValue())); + value.SetStringKey( + kDateLastUsed, + base::NumberToString(node->date_last_used().ToInternalValue())); if (node->is_url()) { value.SetStringKey(kTypeKey, kTypeURL); std::string url = node->url().possibly_invalid_spec(); @@ -334,6 +338,15 @@ int64_t date_added_time; base::StringToInt64(date_added_string, &date_added_time); + std::string date_last_used_string; + string_value = value.FindStringKey(kDateLastUsed); + if (string_value) + date_last_used_string = *string_value; + else + date_last_used_string = base::NumberToString(0); + int64_t date_last_used; + base::StringToInt64(date_last_used_string, &date_last_used); + const std::string* type_string = value.FindStringKey(kTypeKey); if (!type_string) return false; @@ -392,6 +405,7 @@ node->SetTitle(title); node->set_date_added(Time::FromInternalValue(date_added_time)); + node->set_date_last_used(Time::FromInternalValue(date_last_used)); BookmarkNode::MetaInfoMap meta_info_map; if (!DecodeMetaInfo(value, &meta_info_map))
diff --git a/components/bookmarks/browser/bookmark_codec.h b/components/bookmarks/browser/bookmark_codec.h index eb9f5da..5511c604 100644 --- a/components/bookmarks/browser/bookmark_codec.h +++ b/components/bookmarks/browser/bookmark_codec.h
@@ -105,6 +105,7 @@ // Allows the BookmarkClient to read and a write a string blob from the JSON // file. That string captures the bookmarks sync metadata. static const char kSyncMetadata[]; + static const char kDateLastUsed[]; // Possible values for kTypeKey. static const char kTypeURL[];
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index db913823..0333709b 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -330,8 +330,51 @@ } void BookmarkModel::UpdateLastUsedTime(const BookmarkNode* node, - base::Time time) { - // TODO(crbug.com/1320950): Use this hook to update the relevant field. + const base::Time time) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(loaded_); + DCHECK(node); + + UpdateLastUsedTimeImpl(node, time); +} + +void BookmarkModel::UpdateLastUsedTimeImpl(const BookmarkNode* node, + const base::Time time) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(loaded_); + DCHECK(node); + + BookmarkNode* mutable_node = AsMutable(node); + mutable_node->set_date_last_used(time); + + if (store_) + store_->ScheduleSave(); +} + +void BookmarkModel::ClearLastUsedTimeInRange(const base::Time delete_begin, + const base::Time delete_end) { + ClearLastUsedTimeInRangeRecursive(root_, delete_begin, delete_end); + + if (store_) + store_->ScheduleSave(); +} + +void BookmarkModel::ClearLastUsedTimeInRangeRecursive( + BookmarkNode* node, + const base::Time delete_begin, + const base::Time delete_end) { + bool within_range = node->date_last_used() >= delete_begin && + node->date_last_used() < delete_end; + bool for_all_time = + delete_begin.is_null() && (delete_end.is_null() || delete_end.is_max()); + if (node->is_url() && (within_range || for_all_time)) { + UpdateLastUsedTimeImpl(node, Time()); + } + + for (size_t i = 0; i < node->children().size(); ++i) { + ClearLastUsedTimeInRangeRecursive(node->children()[i].get(), delete_begin, + delete_end); + } } void BookmarkModel::Copy(const BookmarkNode* node,
diff --git a/components/bookmarks/browser/bookmark_model.h b/components/bookmarks/browser/bookmark_model.h index 6117be3c..6347e4e 100644 --- a/components/bookmarks/browser/bookmark_model.h +++ b/components/bookmarks/browser/bookmark_model.h
@@ -230,11 +230,12 @@ const GURL& url, const BookmarkNode::MetaInfoMap* meta_info = nullptr); - // Adds a url at the specified position with the given |creation_time|, - // |meta_info| and |guid|. If no GUID is provided (i.e. nullopt), then a - // random one will be generated. If a GUID is provided, it must be valid. - // Used for bookmarks not being added from direct user actions (e.g. created - // via sync, locally modified bookmark or pre-existing bookmark). + // Adds a url at the specified position with the given `creation_time`, + // `meta_info`, `guid`, and `last_used_time`. If no GUID is provided + // (i.e. nullopt), then a random one will be generated. If a GUID is + // provided, it must be valid. Used for bookmarks not being added from + // direct user actions (e.g. created via sync, locally modified bookmark + // or pre-existing bookmark). const BookmarkNode* AddURL( const BookmarkNode* parent, size_t index, @@ -264,7 +265,12 @@ void ResetDateFolderModified(const BookmarkNode* node); // Updates the last used `time` for the given `id` / `url`. - void UpdateLastUsedTime(const BookmarkNode* node, base::Time time); + void UpdateLastUsedTime(const BookmarkNode* node, const base::Time time); + + // Clears the last used time for the given time range. Called when the user + // clears their history. Time() and Time::Max() are used for min/max values. + void ClearLastUsedTimeInRange(const base::Time delete_begin, + const base::Time delete_end); // Returns up to |max_count| bookmarks containing each term from |query| in // either the title, URL, or, if |match_ancestor_titles| is true, the titles @@ -393,6 +399,15 @@ BookmarkUndoDelegate* undo_delegate() const; + // Implementation of `UpdateLastUsedTime` which gives the option to skip + // saving the change to `BookmarkStorage. Used to efficiently make changes + // to multiple bookmarks. + void UpdateLastUsedTimeImpl(const BookmarkNode* node, base::Time time); + + void ClearLastUsedTimeInRangeRecursive(BookmarkNode* node, + const base::Time delete_begin, + const base::Time delete_end); + std::unique_ptr<BookmarkClient> client_; // Whether the initial set of data has been loaded.
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc index cbc7317..ef3d30e 100644 --- a/components/bookmarks/browser/bookmark_model_unittest.cc +++ b/components/bookmarks/browser/bookmark_model_unittest.cc
@@ -796,6 +796,59 @@ EXPECT_EQ(expected_node_removal_details[1], node_removal_details_[1]); } +TEST_F(BookmarkModelTest, ClearLastUsedTimeInRange) { + const BookmarkNode* bookmark_bar_node = model_->bookmark_bar_node(); + + ClearCounts(); + + base::Time time = base::Time::Now(); + + // Add a url to bookmark bar. + std::u16string title(u"foo"); + GURL url("http://foo.com"); + const BookmarkNode* url_node = + model_->AddURL(bookmark_bar_node, 0, title, url); + model_->UpdateLastUsedTime(url_node, time); + + // Add a folder with child URL. + const BookmarkNode* folder = model_->AddFolder(bookmark_bar_node, 0, title); + const BookmarkNode* folder_url_node = model_->AddURL(folder, 0, title, url); + model_->UpdateLastUsedTime(folder_url_node, time); + EXPECT_EQ(time, url_node->date_last_used()); + EXPECT_EQ(time, folder_url_node->date_last_used()); + + model_->ClearLastUsedTimeInRange(time - base::Seconds(1), + time + base::Seconds(1)); + EXPECT_EQ(base::Time(), url_node->date_last_used()); + EXPECT_EQ(base::Time(), folder_url_node->date_last_used()); +} + +TEST_F(BookmarkModelTest, ClearLastUsedTimeInRangeForAllTime) { + const BookmarkNode* bookmark_bar_node = model_->bookmark_bar_node(); + + ClearCounts(); + + base::Time time = base::Time::Now(); + + // Add a url to bookmark bar. + std::u16string title(u"foo"); + GURL url("http://foo.com"); + const BookmarkNode* url_node = + model_->AddURL(bookmark_bar_node, 0, title, url); + model_->UpdateLastUsedTime(url_node, time); + + // Add a folder with child URL. + const BookmarkNode* folder = model_->AddFolder(bookmark_bar_node, 0, title); + const BookmarkNode* folder_url_node = model_->AddURL(folder, 0, title, url); + model_->UpdateLastUsedTime(folder_url_node, time); + EXPECT_EQ(time, url_node->date_last_used()); + EXPECT_EQ(time, folder_url_node->date_last_used()); + + model_->ClearLastUsedTimeInRange(base::Time(), base::Time::Max()); + EXPECT_EQ(base::Time(), url_node->date_last_used()); + EXPECT_EQ(base::Time(), folder_url_node->date_last_used()); +} + TEST_F(BookmarkModelTest, SetTitle) { const BookmarkNode* root = model_->bookmark_bar_node(); std::u16string title(u"foo");
diff --git a/components/bookmarks/browser/bookmark_node.h b/components/bookmarks/browser/bookmark_node.h index 551668ad..f3332fb 100644 --- a/components/bookmarks/browser/bookmark_node.h +++ b/components/bookmarks/browser/bookmark_node.h
@@ -139,8 +139,12 @@ std::vector<base::StringPiece16> GetTitledUrlNodeAncestorTitles() const override; - // TODO(sky): Consider adding last visit time here, it'll greatly simplify - // HistoryContentsProvider. + // Returns the last time the bookmark was opened. This is only maintained + // for urls (no folders). + base::Time date_last_used() const { return date_last_used_; } + void set_date_last_used(const base::Time date_last_used) { + date_last_used_ = date_last_used; + } protected: BookmarkNode(int64_t id, @@ -218,6 +222,8 @@ std::unique_ptr<MetaInfoMap> meta_info_map_; const bool is_permanent_node_; + + base::Time date_last_used_; }; // BookmarkPermanentNode -------------------------------------------------------
diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc index 89073e6..bde6157 100644 --- a/components/bookmarks/browser/bookmark_utils.cc +++ b/components/bookmarks/browser/bookmark_utils.cc
@@ -494,14 +494,15 @@ } } -void AddIfNotBookmarked(BookmarkModel* model, - const GURL& url, - const std::u16string& title) { +const BookmarkNode* AddIfNotBookmarked(BookmarkModel* model, + const GURL& url, + const std::u16string& title) { + // Nothing to do, a user bookmark with that url already exists. if (IsBookmarkedByUser(model, url)) - return; // Nothing to do, a user bookmark with that url already exists. + return nullptr; model->client()->RecordAction(base::UserMetricsAction("BookmarkAdded")); const BookmarkNode* parent = GetParentForNewNodes(model); - model->AddNewURL(parent, parent->children().size(), title, url); + return model->AddNewURL(parent, parent->children().size(), title, url); } void RemoveAllBookmarks(BookmarkModel* model, const GURL& url) {
diff --git a/components/bookmarks/browser/bookmark_utils.h b/components/bookmarks/browser/bookmark_utils.h index 0515a05..7174b5f 100644 --- a/components/bookmarks/browser/bookmark_utils.h +++ b/components/bookmarks/browser/bookmark_utils.h
@@ -134,9 +134,9 @@ const std::vector<int64_t>& ids); // If there are no user bookmarks for url, a bookmark is created. -void AddIfNotBookmarked(BookmarkModel* model, - const GURL& url, - const std::u16string& title); +const BookmarkNode* AddIfNotBookmarked(BookmarkModel* model, + const GURL& url, + const std::u16string& title); // Removes all bookmarks for the given |url|. void RemoveAllBookmarks(BookmarkModel* model, const GURL& url);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java index 73060237..a467fd0e 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java
@@ -26,7 +26,7 @@ @IntDef({Type.TEXT_BUBBLE, Type.VR_DELEGATE, Type.AR_DELEGATE, Type.SCENE_OVERLAY, Type.START_SURFACE_MEDIATOR, Type.SELECTION_POPUP, Type.MANUAL_FILLING, Type.TAB_MODAL_HANDLER, Type.FULLSCREEN, Type.TAB_SWITCHER_TO_BROWSING, - Type.CLOSE_WATCHER, Type.FIND_TOOLBAR, Type.TOOLBAR_TAB_CONTROLLER, + Type.CLOSE_WATCHER, Type.FIND_TOOLBAR, Type.LOCATION_BAR, Type.TOOLBAR_TAB_CONTROLLER, Type.TAB_RETURN_TO_CHROME_START_SURFACE, Type.BOTTOM_SHEET, Type.SHOW_READING_LIST, Type.MINIMIZE_APP_AND_CLOSE_TAB}) @Retention(RetentionPolicy.SOURCE) @@ -44,10 +44,11 @@ int TAB_SWITCHER_TO_BROWSING = 10; int CLOSE_WATCHER = 11; int FIND_TOOLBAR = 12; - int TOOLBAR_TAB_CONTROLLER = 13; - int TAB_RETURN_TO_CHROME_START_SURFACE = 14; - int SHOW_READING_LIST = 15; - int MINIMIZE_APP_AND_CLOSE_TAB = 16; + int LOCATION_BAR = 13; + int TOOLBAR_TAB_CONTROLLER = 14; + int TAB_RETURN_TO_CHROME_START_SURFACE = 15; + int SHOW_READING_LIST = 16; + int MINIMIZE_APP_AND_CLOSE_TAB = 17; int NUM_TYPES = MINIMIZE_APP_AND_CLOSE_TAB + 1; }
diff --git a/components/cronet/android/test/experimental_options_test.cc b/components/cronet/android/test/experimental_options_test.cc index a4fa3268..37039b0 100644 --- a/components/cronet/android/test/experimental_options_test.cc +++ b/components/cronet/android/test/experimental_options_test.cc
@@ -13,6 +13,7 @@ #include "components/cronet/android/test/cronet_test_util.h" #include "components/cronet/url_request_context_config.h" #include "net/base/address_family.h" +#include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" #include "net/base/network_isolation_key.h" #include "net/dns/host_cache.h" @@ -45,9 +46,7 @@ net::IPAddress address; CHECK(address.AssignFromIPLiteral(address_string)); - net::AddressList address_list = - net::AddressList::CreateFromIPAddress(address, 0); - net::HostCache::Entry entry(net::OK, address_list, + net::HostCache::Entry entry(net::OK, {{address, 0}}, /*aliases=*/{hostname}, net::HostCache::Entry::SOURCE_UNKNOWN); cache->Set(key1, entry, base::TimeTicks::Now(), base::Seconds(1)); cache->Set(key2, entry, base::TimeTicks::Now(), base::Seconds(1));
diff --git a/components/cronet/host_cache_persistence_manager_unittest.cc b/components/cronet/host_cache_persistence_manager_unittest.cc index 89164296..aa620d9 100644 --- a/components/cronet/host_cache_persistence_manager_unittest.cc +++ b/components/cronet/host_cache_persistence_manager_unittest.cc
@@ -9,6 +9,7 @@ #include "base/values.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" +#include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" #include "net/base/network_isolation_key.h" #include "net/dns/host_cache.h" @@ -39,7 +40,7 @@ net::HostCache::Key key(host, net::DnsQueryType::UNSPECIFIED, 0, net::HostResolverSource::ANY, net::NetworkIsolationKey()); - net::HostCache::Entry entry(net::OK, net::AddressList(), + net::HostCache::Entry entry(net::OK, /*ip_endpoints=*/{}, /*aliases=*/{}, net::HostCache::Entry::SOURCE_UNKNOWN); cache_->Set(key, entry, base::TimeTicks::Now(), base::Seconds(1)); } @@ -71,7 +72,7 @@ net::HostCache::Key key3("3.test", net::DnsQueryType::UNSPECIFIED, 0, net::HostResolverSource::ANY, net::NetworkIsolationKey()); - net::HostCache::Entry entry(net::OK, net::AddressList(), + net::HostCache::Entry entry(net::OK, /*ip_endpoints=*/{}, /*aliases=*/{}, net::HostCache::Entry::SOURCE_UNKNOWN); temp_cache.Set(key1, entry, base::TimeTicks::Now(), base::Seconds(1));
diff --git a/components/cronet/stale_host_resolver_unittest.cc b/components/cronet/stale_host_resolver_unittest.cc index 096abc9..8698c5a 100644 --- a/components/cronet/stale_host_resolver_unittest.cc +++ b/components/cronet/stale_host_resolver_unittest.cc
@@ -23,6 +23,7 @@ #include "components/cronet/url_request_context_config.h" #include "net/base/address_family.h" #include "net/base/host_port_pair.h" +#include "net/base/ip_endpoint.h" #include "net/base/mock_network_change_notifier.h" #include "net/base/net_errors.h" #include "net/base/network_change_notifier.h" @@ -68,14 +69,15 @@ // correctly, we won't end up waiting this long -- it's just a backup. const int kWaitTimeoutSec = 1; -net::AddressList MakeAddressList(const char* ip_address_str) { +std::vector<net::IPEndPoint> MakeEndpoints(const char* ip_address_str) { net::IPAddress address; bool rv = address.AssignFromIPLiteral(ip_address_str); DCHECK(rv); + return std::vector<net::IPEndPoint>({{address, 0}}); +} - net::AddressList address_list; - address_list.push_back(net::IPEndPoint(address, 0u)); - return address_list; +net::AddressList MakeAddressList(const char* ip_address_str) { + return net::AddressList(MakeEndpoints(ip_address_str)); } std::unique_ptr<net::DnsClient> CreateMockDnsClientForHosts() { @@ -235,8 +237,9 @@ net::NetworkIsolationKey()); net::HostCache::Entry entry( error, - error == net::OK ? MakeAddressList(kCacheAddress) : net::AddressList(), - net::HostCache::Entry::SOURCE_UNKNOWN, ttl); + error == net::OK ? MakeEndpoints(kCacheAddress) + : std::vector<net::IPEndPoint>(), + /*aliases=*/{}, net::HostCache::Entry::SOURCE_UNKNOWN, ttl); base::TimeDelta age = base::Seconds(age_sec); base::TimeTicks then = tick_clock_.NowTicks() - age; resolver_->GetHostCache()->Set(key, entry, then, ttl);
diff --git a/components/error_page_strings.grdp b/components/error_page_strings.grdp index 960025aa..0c37c72 100644 --- a/components/error_page_strings.grdp +++ b/components/error_page_strings.grdp
@@ -89,7 +89,7 @@ <ph name="PLATFORM_TEXT">$1<ex>Goto the wrench menu and choose Fix It.</ex></ph> </message> </if> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <message name="IDS_ERRORPAGES_SUGGESTION_PROXY_DISABLE_PLATFORM" desc="ChromeOS instructions for disabling use of a proxy server."> You can disable any proxies configured for a connection from the settings page. </message> @@ -361,7 +361,7 @@ If spelling is correct, <ph name="BEGIN_LINK"><a href="javascript:diagnoseErrors()" id="diagnose-link"></ph>try running Windows Network Diagnostics<ph name="END_LINK"></a></ph>. </message> </if> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <message name="IDS_ERRORPAGES_SUGGESTION_DIAGNOSE" desc="Label for the link that invokes the connection diagnostic tool on the error page displayed in a list of suggestions. The suggestions list is prefixed with 'Try:'."> <ph name="BEGIN_LINK"><a href="javascript:diagnoseErrors()" id="diagnose-link"></ph>Running Connectivity Diagnostics<ph name="END_LINK"></a></ph> </message>
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index 2c7a2115..86bdbf7e 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -1771,9 +1771,15 @@ } base::Time HistoryBackend::FindMostRecentClusteredTime() { - // TODO(manukh): Implement. Since we don't have persisted clustered visits - // yet, there are no visits to take the timestamp of. - return base::Time::Now() - base::Days(kExpireDaysThreshold); + TRACE_EVENT0("browser", "HistoryBackend::FindMostRecentClusteredTime"); + if (!db_) + return base::Time::Min(); + const auto clusters = + GetMostRecentClusters(base::Time::Min(), base::Time::Max(), 1); + return clusters.empty() ? base::Time::Min() + : clusters[0] + .GetMostRecentVisit() + .annotated_visit.visit_row.visit_time; } void HistoryBackend::ReplaceClusters( @@ -1809,7 +1815,6 @@ return {}; Cluster cluster = db_->GetCluster(cluster_id); - cluster.cluster_id = cluster_id; cluster.visits = ToClusterVisits(db_->GetVisitIdsInCluster(cluster_id)); return cluster; }
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index 1896c2c..7923bc0b 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -3760,6 +3760,26 @@ EXPECT_EQ(annotated_visits[0].context_annotations.omnibox_url_copied, true); } +TEST_F(HistoryBackendTest, FindMostRecentClusteredTime) { + // Should return `Min()` when there are no clusters + EXPECT_EQ(backend_->FindMostRecentClusteredTime(), base::Time::Min()); + + // Add 1 cluster with multiple visits. + AddAnnotatedVisit(50); + AddAnnotatedVisit(20); + AddAnnotatedVisit(60); + backend_->ReplaceClusters({}, CreateClusters({{1, 2, 3}})); + + // Should return the max time across all visits in the cluster. + EXPECT_EQ(backend_->FindMostRecentClusteredTime(), GetRelativeTime(20)); + + // Add another cluster. + backend_->ReplaceClusters({}, CreateClusters({{1}})); + + // Should return the max time across all clusters. + EXPECT_EQ(backend_->FindMostRecentClusteredTime(), GetRelativeTime(20)); +} + TEST_F(HistoryBackendTest, ReplaceClusters) { { SCOPED_TRACE("Add clusters"); @@ -3859,7 +3879,8 @@ EXPECT_EQ(cluster.label, u"label"); EXPECT_EQ(cluster.visits[1].url_for_display, u"url_for_display"); - VerifyCluster(backend_->GetCluster(3), {3}); + // Verify non-existent clusters aren't returned. + VerifyCluster(backend_->GetCluster(2), {0}); } TEST_F(HistoryBackendTest, GetRedirectChainStart) {
diff --git a/components/history/core/browser/history_types.cc b/components/history/core/browser/history_types.cc index 395e8f0..b253d27 100644 --- a/components/history/core/browser/history_types.cc +++ b/components/history/core/browser/history_types.cc
@@ -8,6 +8,7 @@ #include "base/check.h" #include "base/notreached.h" +#include "base/ranges/algorithm.h" #include "components/history/core/browser/page_usage_data.h" namespace history { @@ -498,6 +499,14 @@ Cluster& Cluster::operator=(Cluster&&) = default; Cluster::~Cluster() = default; +const ClusterVisit& Cluster::GetMostRecentVisit() const { + return *base::ranges::min_element( + visits, [](auto time1, auto time2) { return time1 < time2; }, + [](const auto& cluster_visit) { + return cluster_visit.annotated_visit.visit_row.visit_time; + }); +} + std::vector<std::u16string> Cluster::GetKeywords() const { std::vector<std::u16string> keywords; for (const auto& p : keyword_to_data_map) {
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index ad088a7..658e50d 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -983,6 +983,8 @@ Cluster& operator=(Cluster&&); ~Cluster(); + const ClusterVisit& GetMostRecentVisit() const; + std::vector<std::u16string> GetKeywords() const; int64_t cluster_id = 0;
diff --git a/components/history_clusters/core/config.h b/components/history_clusters/core/config.h index a149ab0..e8ec44a 100644 --- a/components/history_clusters/core/config.h +++ b/components/history_clusters/core/config.h
@@ -44,7 +44,7 @@ // and accessing clusters will retrieve them from the history DB. If disabled, // updating clusters is a no-op and accessing clusters will generate and // return new clusters without persisting them. - bool persist_clusters_in_history_db = true; + bool persist_clusters_in_history_db = false; // No effect if `persist_clusters_in_history_db` is disabled. Determines how // soon to update clusters after startup in minutes. E.g., by default, will
diff --git a/components/history_clusters/core/history_clusters_db_tasks.cc b/components/history_clusters/core/history_clusters_db_tasks.cc index 811f5587..4444bb94 100644 --- a/components/history_clusters/core/history_clusters_db_tasks.cc +++ b/components/history_clusters/core/history_clusters_db_tasks.cc
@@ -17,7 +17,7 @@ #include "components/history_clusters/core/config.h" #include "components/history_clusters/core/history_clusters_types.h" -namespace history_clusters { +namespace { // Is the transition user-visible. bool IsTransitionUserVisible(int32_t transition) { @@ -28,6 +28,10 @@ ui::PAGE_TRANSITION_KEYWORD_GENERATED); } +} // namespace + +namespace history_clusters { + // static base::Time GetAnnotatedVisitsToCluster::GetBeginTimeOnDayBoundary( base::Time time) { @@ -121,12 +125,14 @@ // 1st, set `continuation_time`, either from `continuation_params_`for // continuation requests or computed for initial requests. base::Time continuation_time; - if (continuation_params_.is_continuation) + if (continuation_params_.is_continuation) { continuation_time = continuation_params_.continuation_time; - else if (recent_first_) + } else if (recent_first_) { continuation_time = now; - else - continuation_time = backend->FindMostRecentClusteredTime(); + } else { + continuation_time = + std::max(backend->FindMostRecentClusteredTime(), begin_time_limit_); + } // 2nd, derive the other boundary, approximately 1 day before or after // `continuation_time`, depending on `recent_first`, and rounded to a day
diff --git a/components/history_clusters/core/history_clusters_service_task_get_most_recent_clusters.cc b/components/history_clusters/core/history_clusters_service_task_get_most_recent_clusters.cc index 59c194d..97b764e 100644 --- a/components/history_clusters/core/history_clusters_service_task_get_most_recent_clusters.cc +++ b/components/history_clusters/core/history_clusters_service_task_get_most_recent_clusters.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/location.h" #include "base/metrics/histogram_functions.h" -#include "base/ranges/algorithm.h" #include "base/strings/stringprintf.h" #include "base/time/time_to_iso8601.h" #include "components/history/core/browser/history_service.h" @@ -20,19 +19,6 @@ namespace history_clusters { -namespace { - -// Get the most recent `ClusterVisit` in `cluster`. -history::ClusterVisit GetMostRecentClusterVisit(history::Cluster cluster) { - return *base::ranges::min_element( - cluster.visits, [](auto time1, auto time2) { return time1 < time2; }, - [](const auto& cluster_visit) { - return cluster_visit.annotated_visit.visit_row.visit_time; - }); -} - -} // namespace - HistoryClustersServiceTaskGetMostRecentClusters:: HistoryClustersServiceTaskGetMostRecentClusters( base::WeakPtr<HistoryClustersService> weak_history_clusters_service, @@ -191,7 +177,8 @@ auto continuation_params = clusters.empty() ? QueryClustersContinuationParams::DoneParams() : QueryClustersContinuationParams{ - GetMostRecentClusterVisit(clusters[0]) + clusters[0] + .GetMostRecentVisit() .annotated_visit.visit_row.visit_time, true, false, true, false}; done_ = true;
diff --git a/components/live_caption/views/caption_bubble.cc b/components/live_caption/views/caption_bubble.cc index f2cf504..fe55750 100644 --- a/components/live_caption/views/caption_bubble.cc +++ b/components/live_caption/views/caption_bubble.cc
@@ -53,6 +53,7 @@ #include "ui/views/layout/layout_provider.h" #include "ui/views/layout/layout_types.h" #include "ui/views/style/typography.h" +#include "ui/views/vector_icons.h" #include "ui/views/view_class_properties.h" #include "ui/views/widget/widget.h" @@ -401,10 +402,8 @@ }; #endif -CaptionBubble::CaptionBubble(base::OnceClosure destroyed_callback, - bool hide_on_inactivity) +CaptionBubble::CaptionBubble(base::OnceClosure destroyed_callback) : destroyed_callback_(std::move(destroyed_callback)), - hide_on_inactivity_(hide_on_inactivity), tick_clock_(base::DefaultTickClock::GetInstance()) { // Bubbles that use transparent colors should not paint their ClientViews to a // layer as doing so could result in visual artifacts. @@ -416,10 +415,6 @@ SetTitle(IDS_LIVE_CAPTION_BUBBLE_TITLE); set_has_parent(false); - // No need to set up timer if the bubble is not hidden on inactivity. - if (!hide_on_inactivity_) - return; - inactivity_timer_ = std::make_unique<base::RetainingOneShotTimer>( FROM_HERE, base::Seconds(kNoActivityIntervalSeconds), base::BindRepeating(&CaptionBubble::OnInactivityTimeout, @@ -568,6 +563,18 @@ base::Unretained(this)), IDS_LIVE_CAPTION_BUBBLE_CLOSE); + views::Button::PressedCallback pin_or_unpin_callback = base::BindRepeating( + &CaptionBubble::PinOrUnpinButtonPressed, base::Unretained(this)); + auto pin_button = BuildImageButton(pin_or_unpin_callback, + IDS_LIVE_CAPTION_BUBBLE_BACK_TO_TAB); + pin_button->SetVisible(!is_pinned_); + pin_button_ = header_container->AddChildView(std::move(pin_button)); + + auto unpin_button = BuildImageButton(std::move(pin_or_unpin_callback), + IDS_LIVE_CAPTION_BUBBLE_BACK_TO_TAB); + unpin_button->SetVisible(is_pinned_); + unpin_button_ = header_container->AddChildView(std::move(unpin_button)); + back_to_tab_button_ = header_container->AddChildView(std::move(back_to_tab_button)); close_button_ = header_container->AddChildView(std::move(close_button)); @@ -629,7 +636,8 @@ std::unique_ptr<views::NonClientFrameView> CaptionBubble::CreateNonClientFrameView(views::Widget* widget) { std::vector<views::View*> buttons = {back_to_tab_button_, close_button_, - expand_button_, collapse_button_}; + expand_button_, collapse_button_, + pin_button_, unpin_button_}; auto frame = std::make_unique<CaptionBubbleFrameView>( buttons, base::BindRepeating(&CaptionBubble::ResetInactivityTimer, base::Unretained(this))); @@ -640,8 +648,6 @@ void CaptionBubble::OnWidgetBoundsChanged(views::Widget* widget, const gfx::Rect& new_bounds) { DCHECK_EQ(widget, GetWidget()); - if (!hide_on_inactivity_) - return; // If the widget is visible and unfocused, probably due to a mouse drag, reset // the inactivity timer. @@ -652,8 +658,6 @@ void CaptionBubble::OnWidgetActivationChanged(views::Widget* widget, bool active) { DCHECK_EQ(widget, GetWidget()); - if (!hide_on_inactivity_) - return; ResetInactivityTimer(); } @@ -694,17 +698,33 @@ is_expanded_ = !is_expanded_; base::UmaHistogramBoolean("Accessibility.LiveCaption.ExpandBubble", is_expanded_); - views::Button *old_button = collapse_button_, *new_button = expand_button_; - if (is_expanded_) - std::swap(old_button, new_button); - bool button_had_focus = old_button->HasFocus(); - OnIsExpandedChanged(); - // TODO(crbug.com/1055150): Ensure that the button keeps focus on mac. - if (button_had_focus) - new_button->RequestFocus(); - if (hide_on_inactivity_) - ResetInactivityTimer(); + SwapButtons(collapse_button_, expand_button_, is_expanded_); + + // The change of expanded state may cause the title to change visibility, and + // it surely causes the content height to change, so redraw the bubble. + Redraw(); +} + +void CaptionBubble::PinOrUnpinButtonPressed() { + is_pinned_ = !is_pinned_; + base::UmaHistogramBoolean("Accessibility.LiveCaption.PinBubble", is_pinned_); + + SwapButtons(unpin_button_, pin_button_, is_pinned_); +} + +void CaptionBubble::SwapButtons(views::Button* first_button, + views::Button* second_button, + bool show_first_button) { + if (!show_first_button) + std::swap(first_button, second_button); + + second_button->SetVisible(false); + first_button->SetVisible(true); + ResetInactivityTimer(); + + if (!first_button->HasFocus()) + first_button->RequestFocus(); } void CaptionBubble::SetModel(CaptionBubbleModel* model) { @@ -725,7 +745,7 @@ label_->SetText(base::UTF8ToUTF16(text)); UpdateBubbleAndTitleVisibility(); - if (hide_on_inactivity_ && GetWidget()->IsVisible()) + if (GetWidget()->IsVisible()) ResetInactivityTimer(); } @@ -796,15 +816,6 @@ } #endif -void CaptionBubble::OnIsExpandedChanged() { - expand_button_->SetVisible(!is_expanded_); - collapse_button_->SetVisible(is_expanded_); - - // The change of expanded state may cause the title to change visibility, and - // it surely causes the content height to change, so redraw the bubble. - Redraw(); -} - void CaptionBubble::UpdateBubbleAndTitleVisibility() { // Show the title if there is room for it and no error. title_->SetVisible(model_ && !model_->HasError() && @@ -978,6 +989,12 @@ views::SetImageFromVectorIconWithColor(collapse_button_, vector_icons::kCaretUpIcon, kButtonDip, icon_color, icon_disabled_color); + views::SetImageFromVectorIconWithColor(pin_button_, views::kPinIcon, + kButtonDip, icon_color, + icon_disabled_color); + views::SetImageFromVectorIconWithColor(unpin_button_, views::kUnpinIcon, + kButtonDip, icon_color, + icon_disabled_color); } void CaptionBubble::SetBackgroundColor() { @@ -1082,7 +1099,8 @@ } void CaptionBubble::OnInactivityTimeout() { - if (HasMediaFoundationError() || IsMouseHovered() || GetWidget()->IsActive()) + if (HasMediaFoundationError() || IsMouseHovered() || is_pinned_ || + GetWidget()->IsActive()) return; // Clear the partial and final text in the caption bubble model and the label. @@ -1125,7 +1143,7 @@ bool CaptionBubble::HasActivity() { return model_ && ((inactivity_timer_ && inactivity_timer_->IsRunning()) || HasFocus() || - !model_->GetFullText().empty() || model_->HasError()); + !model_->GetFullText().empty() || model_->HasError() || is_pinned_); } views::Label* CaptionBubble::GetLabelForTesting() {
diff --git a/components/live_caption/views/caption_bubble.h b/components/live_caption/views/caption_bubble.h index af9d09cc..6479597aa 100644 --- a/components/live_caption/views/caption_bubble.h +++ b/components/live_caption/views/caption_bubble.h
@@ -67,7 +67,7 @@ class CaptionBubble : public views::BubbleDialogDelegateView { public: METADATA_HEADER(CaptionBubble); - CaptionBubble(base::OnceClosure destroyed_callback, bool hide_on_inactivity); + explicit CaptionBubble(base::OnceClosure destroyed_callback); CaptionBubble(const CaptionBubble&) = delete; CaptionBubble& operator=(const CaptionBubble&) = delete; ~CaptionBubble() override; @@ -124,6 +124,10 @@ void BackToTabButtonPressed(); void CloseButtonPressed(); void ExpandOrCollapseButtonPressed(); + void PinOrUnpinButtonPressed(); + void SwapButtons(views::Button* first_button, + views::Button* second_button, + bool show_first_button); // Called by CaptionBubbleModel to notify this object that the model's text // has changed. Sets the text of the caption bubble to the model's text. @@ -141,10 +145,6 @@ OnErrorClickedCallback callback, OnDoNotShowAgainClickedCallback error_silenced_callback); - // Called when the caption bubble expanded state has changed. Changes the - // number of lines displayed. - void OnIsExpandedChanged(); - // The caption bubble manages its own visibility based on whether there's // space for it to be shown, and if it has an error or text to display. void UpdateBubbleVisibility(); @@ -195,6 +195,8 @@ raw_ptr<views::ImageButton> close_button_; raw_ptr<views::ImageButton> expand_button_; raw_ptr<views::ImageButton> collapse_button_; + raw_ptr<views::ImageButton> pin_button_; + raw_ptr<views::ImageButton> unpin_button_; raw_ptr<CaptionBubbleFrameView> frame_; #if BUILDFLAG(IS_WIN) @@ -217,10 +219,10 @@ // Whether the caption bubble is expanded to show more lines of text. bool is_expanded_ = false; - bool has_been_shown_ = false; + // Whether the caption bubble is pinned or if it should hide on inactivity. + bool is_pinned_ = false; - // Whether we should hide the caption bubble on inactivity. - bool const hide_on_inactivity_; + bool has_been_shown_ = false; // Used to determine whether to propagate theme changes to the widget. SkColor text_color_ = gfx::kPlaceholderColor;
diff --git a/components/live_caption/views/caption_bubble_controller_views.cc b/components/live_caption/views/caption_bubble_controller_views.cc index 197c9ca..ee2f8e3 100644 --- a/components/live_caption/views/caption_bubble_controller_views.cc +++ b/components/live_caption/views/caption_bubble_controller_views.cc
@@ -23,8 +23,7 @@ CaptionBubbleControllerViews::CaptionBubbleControllerViews() { caption_bubble_ = new CaptionBubble( base::BindOnce(&CaptionBubbleControllerViews::OnCaptionBubbleDestroyed, - base::Unretained(this)), - /* hide_on_inactivity= */ true); + base::Unretained(this))); caption_widget_ = views::BubbleDialogDelegateView::CreateBubble(caption_bubble_); caption_bubble_->SetCaptionBubbleStyle();
diff --git a/components/lookalikes/core/lookalike_url_util.cc b/components/lookalikes/core/lookalike_url_util.cc index 9d9cfcb..1adab65 100644 --- a/components/lookalikes/core/lookalike_url_util.cc +++ b/components/lookalikes/core/lookalike_url_util.cc
@@ -113,13 +113,19 @@ // Squatting heuristic. These lists are manually curated using Chrome metrics. // We will check combinations of brand names and popular keywords. // e. g. google-login.com or youtubesecure.com. -// In each element of kBrandNamesforCSQ, first string is an original brand name +// For every brand name, brand_name[.]com should be checked to be valid. If +// no matched domain is found in top domains, brand_name[.]com will be +// suggested to the user for navigation. +// If brand_name[.]com is not valid for any brand name, each brand name should +// be mapped to a valid url manually and the data structure of +// ForCSQ should be changed accordingly. +// In each element of kBrandNamesForCSQ, first string is an original brand name // and second string is its skeleton. // If you are adding a brand name here, you can generate its skeleton using the // format_url binary (components/url_formatter/tools/format_url.cc) // TODO(crbug.com/1349490): Generate skeletons of hard coded brand names in // Chrome initialization and remove manual adding of skeletons to this list. -constexpr std::pair<const char*, const char*> kBrandNamesforCSQ[] = { +constexpr std::pair<const char*, const char*> kBrandNamesForCSQ[] = { {"adobe", "adobe"}, {"airbnb", "airbnb"}, {"alibaba", "alibaba"}, @@ -172,8 +178,8 @@ {"zillow", "zillow"}}; // Each element in kSkeletonsOfPopularKeywordsForCSQ is a skeleton of a popular -// keyword. In contrast to kBrandNamesforCSQ, the original keywords are not -// included. Because in kBrandNamesforCSQ, original brand names are used to +// keyword. In contrast to kBrandNamesForCSQ, the original keywords are not +// included. Because in kBrandNamesForCSQ, original brand names are used to // generate the matched domain, and original keywords are not needed for that // process. // If you are adding a keyword here, you can generate its skeleton @@ -188,7 +194,7 @@ ComboSquattingParams* GetComboSquattingParams() { static ComboSquattingParams params{ - kBrandNamesforCSQ, std::size(kBrandNamesforCSQ), + kBrandNamesForCSQ, std::size(kBrandNamesForCSQ), kSkeletonsOfPopularKeywordsForCSQ, std::size(kSkeletonsOfPopularKeywordsForCSQ)}; return ¶ms; @@ -622,6 +628,52 @@ return output; } +// Registry of the navigated domain is needed to find matched_domain +// in Combo Squatting domains. For example, registry of +// `google-login[.]co[.]br` is `co[.]br`. +std::string GetRegistry(const DomainInfo& navigated_domain) { + size_t registry_size = navigated_domain.domain_and_registry.size() - + navigated_domain.domain_without_registry.size() - 1; + + std::string domain_and_registry = navigated_domain.domain_and_registry; + std::string registry = + domain_and_registry.substr(domain_and_registry.size() - registry_size, + domain_and_registry.size() - 1); + return registry; +} + +// If a matched domain including the brand name and TLD of +// navigated domain is found in top domains, |matched_domain| +// is set to the found top domain. Otherwise, |matched_domain| will +// be set to brand_name[.]com. Hard coded brand names should be checked to have +// valid brand_name[.]com url. +std::string FindMatchedDomainForHardCodedComboSquatting( + const std::string& brand_name, + const DomainInfo& navigated_domain) { + DomainInfo suggested_matched_domain = + GetDomainInfo(brand_name + '.' + GetRegistry(navigated_domain)); + if (IsTopDomain(suggested_matched_domain)) { + return suggested_matched_domain.hostname; + } else { + return brand_name + ".com"; + } +} + +// Engaged sites are sorted based on engagement score, so |matched_domain| +// will be set to the first domain in the engaged sites lists that includes +// the brand name of the navigated domain. +std::string FindMatchedDomainForSiteEngagementComboSquatting( + const std::string& brand_name, + const DomainInfo& navigated_domain, + const std::vector<DomainInfo>& engaged_sites) { + for (auto& engaged_site : engaged_sites) { + if (brand_name == engaged_site.domain_without_registry) { + return engaged_site.hostname; + } + } + return std::string(); +} + // Returns true if the navigated_domain is flagged as Combo Squatting. // matched_domain is the suggested domain that will be shown to the user // instead of the navigated_domain in the warning UI. @@ -629,7 +681,9 @@ const std::vector<std::pair<std::string, std::string>>& brand_names, const ComboSquattingParams& combo_squatting_params, const DomainInfo& navigated_domain, - std::string* matched_domain) { + const std::vector<DomainInfo>& engaged_sites, + std::string* matched_domain, + bool is_hard_coded) { // Check if the domain has any brand name and any popular keyword. for (auto& brand : brand_names) { auto brand_name = brand.first; @@ -646,8 +700,13 @@ if (skeleton.find(keyword) != std::string::npos && std::string(brand_skeleton).find(keyword) == std::string::npos && std::string(keyword).find(brand_skeleton) == std::string::npos) { - // TODO(crbug.com/1341320): Compute a better matched_domain. - *matched_domain = brand_name + ".com"; + if (is_hard_coded) { + *matched_domain = FindMatchedDomainForHardCodedComboSquatting( + brand_name, navigated_domain); + } else { + *matched_domain = FindMatchedDomainForSiteEngagementComboSquatting( + brand_name, navigated_domain, engaged_sites); + } return true; } } @@ -1352,7 +1411,7 @@ void ResetComboSquattingParamsForTesting() { ComboSquattingParams* params = GetComboSquattingParams(); - *params = {kBrandNamesforCSQ, std::size(kBrandNamesforCSQ), + *params = {kBrandNamesForCSQ, std::size(kBrandNamesForCSQ), kSkeletonsOfPopularKeywordsForCSQ, std::size(kSkeletonsOfPopularKeywordsForCSQ)}; } @@ -1370,14 +1429,16 @@ brand_names.emplace_back(combo_squatting_params->brand_names[i]); } if (IsComboSquatting(brand_names, *combo_squatting_params, navigated_domain, - matched_domain)) { + engaged_sites, matched_domain, + /*is_hard_coded=*/true)) { return ComboSquattingType::kHardCoded; } // Then check Combo Squatting with brand names in engaged sites. brand_names = GetBrandNamesFromEngagedSites(engaged_sites); if (IsComboSquatting(brand_names, *combo_squatting_params, navigated_domain, - matched_domain)) { + engaged_sites, matched_domain, + /*is_hard_coded=*/false)) { return ComboSquattingType::kSiteEngagement; }
diff --git a/components/lookalikes/core/lookalike_url_util_unittest.cc b/components/lookalikes/core/lookalike_url_util_unittest.cc index 09eefe7..079ecdff 100644 --- a/components/lookalikes/core/lookalike_url_util_unittest.cc +++ b/components/lookalikes/core/lookalike_url_util_unittest.cc
@@ -623,6 +623,8 @@ // An engaged site with length less than threshold (4) for // consideration. GetDomainInfo(GURL("https://len.com")), + // An engaged site with a registry other than com. + GetDomainInfo(GURL("https://testcombo.org")), }; const struct TestCase { const char* domain; @@ -720,6 +722,18 @@ // Not CSQ, skeleton of brand name (lén) is from engaged sites list but it // is short. {"lén-online.com", "", ComboSquattingType::kNone}, + + // CSQ when domain and registry are in top domains. + {"google-login.co.kr", "google.co.kr", ComboSquattingType::kHardCoded}, + + // CSQ when brand name is in hard coded brand names, but domain and + // registry are not in top domains. + {"google-login.co.ir", "google.com", ComboSquattingType::kHardCoded}, + + // CSQ when domain and registry are in engaged sites, with registry other + // than com. + {"testcomboonline.org", "testcombo.org", + ComboSquattingType::kSiteEngagement}, }; for (const TestCase& test_case : kTestCases) { auto navigated =
diff --git a/components/management_strings.grdp b/components/management_strings.grdp index 663e1d1..0c08a94 100644 --- a/components/management_strings.grdp +++ b/components/management_strings.grdp
@@ -79,7 +79,7 @@ </if> <!-- ChromeOS managed status section --> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <message name="IDS_MANAGEMENT_DEVICE_NOT_MANAGED" desc="Message indicating that the device and account are not managed"> This device and account are not managed by a company or other organization. </message> @@ -99,7 +99,7 @@ chrome://management for managed devices, please add it to go/chrome-policy-privacy-note-mappings --> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <!-- Strings related to Local trust roots section --> <message name="IDS_MANAGEMENT_LOCAL_TRUST_ROOTS" desc="Title of the types of local trust roots section of the page"> Custom root certificates
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index f0eb920..d5ce38d 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc
@@ -219,6 +219,12 @@ } // namespace +// Determines whether the initial log should use the same logic as subsequent +// logs when building it. +const base::Feature kConsolidateMetricsServiceInitialLogLogic = { + "ConsolidateMetricsServiceInitialLogLogic", + base::FEATURE_DISABLED_BY_DEFAULT}; + // static void MetricsService::RegisterPrefs(PrefRegistrySimple* registry) { CleanExitBeacon::RegisterPrefs(registry); @@ -695,14 +701,18 @@ DCHECK_EQ(INIT_TASK_SCHEDULED, state_); state_ = INIT_TASK_DONE; - // Create the initial log. - if (!initial_metrics_log_) { - initial_metrics_log_ = CreateLog(MetricsLog::ONGOING_LOG); - // Note: We explicitly do not call OnDidCreateMetricsLog() here, as this - // function would have already been called in Start() and this log will - // already contain any histograms logged there. OnDidCreateMetricsLog() - // will be called again after the initial log is closed, for the next log. - // TODO(crbug.com/1171830): Consider getting rid of |initial_metrics_log_|. + if (!base::FeatureList::IsEnabled( + kConsolidateMetricsServiceInitialLogLogic)) { + // Create the initial log. + if (!initial_metrics_log_) { + initial_metrics_log_ = CreateLog(MetricsLog::ONGOING_LOG); + // Note: We explicitly do not call OnDidCreateMetricsLog() here, as this + // function would have already been called in Start() and this log will + // already contain any histograms logged there. OnDidCreateMetricsLog() + // will be called again after the initial log is closed, for the next log. + // TODO(crbug.com/1171830): Consider getting rid of + // |initial_metrics_log_|. + } } rotation_scheduler_->InitTaskComplete(); @@ -832,9 +842,24 @@ return; } + if (base::FeatureList::IsEnabled(kConsolidateMetricsServiceInitialLogLogic)) { + // The first ongoing log should be collected prior to sending any unsent + // logs. + if (state_ == INIT_TASK_DONE) { + client_->CollectFinalMetricsForLog( + base::BindOnce(&MetricsService::OnFinalLogInfoCollectionDone, + self_ptr_factory_.GetWeakPtr())); + return; + } + } + // If there are unsent logs, send the next one. If not, start the asynchronous // process of finalizing the current log for upload. - if (state_ == SENDING_LOGS && has_unsent_logs()) { + bool send_unsent_logs = + base::FeatureList::IsEnabled(kConsolidateMetricsServiceInitialLogLogic) + ? has_unsent_logs() + : state_ == SENDING_LOGS && has_unsent_logs(); + if (send_unsent_logs) { reporting_service_.Start(); rotation_scheduler_->RotationFinished(); } else { @@ -847,6 +872,10 @@ void MetricsService::OnFinalLogInfoCollectionDone() { DVLOG(1) << "OnFinalLogInfoCollectionDone"; + if (base::FeatureList::IsEnabled(kConsolidateMetricsServiceInitialLogLogic)) { + DCHECK(state_ >= INIT_TASK_DONE); + state_ = SENDING_LOGS; + } // Abort if metrics were turned off during the final info gathering. if (!recording_active()) { @@ -855,13 +884,27 @@ return; } - if (state_ == INIT_TASK_DONE) { - PrepareInitialMetricsLog(); - } else { - DCHECK_EQ(SENDING_LOGS, state_); + if (base::FeatureList::IsEnabled(kConsolidateMetricsServiceInitialLogLogic)) { CloseCurrentLog(); OpenNewLog(); + // Trim and store unsent logs, including the log that was just closed, so + // that they're not lost in case of a crash before upload time. However, the + // in-memory log store is unchanged. I.e., logs that are trimmed will still + // be available in memory. This is to give the log that was just created a + // chance to be sent in case it is trimmed. After uploading (whether + // successful or not), the log store is trimmed and stored again, and at + // that time, the in-memory log store will be updated. + log_store()->TrimAndPersistUnsentLogs(/*overwrite_in_memory_store=*/false); + } else { + if (state_ == INIT_TASK_DONE) { + PrepareInitialMetricsLog(); + } else { + DCHECK_EQ(SENDING_LOGS, state_); + CloseCurrentLog(); + OpenNewLog(); + } } + reporting_service_.Start(); rotation_scheduler_->RotationFinished(); HandleIdleSinceLastTransmission(true);
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h index 1a6b61d..37613d11 100644 --- a/components/metrics/metrics_service.h +++ b/components/metrics/metrics_service.h
@@ -59,6 +59,9 @@ class MetricsServiceClient; class MetricsStateManager; +// Exposed in the header file for tests. +extern const base::Feature kConsolidateMetricsServiceInitialLogLogic; + // See metrics_service.cc for a detailed description. class MetricsService : public base::HistogramFlattener { public:
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc index 9d20d1f..96e9741 100644 --- a/components/metrics/metrics_service_unittest.cc +++ b/components/metrics/metrics_service_unittest.cc
@@ -257,6 +257,12 @@ return GetHistogramSampleCount(log, kOnDidCreateMetricsLogHistogramName); } + int GetNumberOfUserActions(MetricsLogStore* test_log_store) { + ChromeUserMetricsExtension log; + EXPECT_TRUE(DecodeLogDataToProto(test_log_store->staged_log(), &log)); + return log.user_action_event_size(); + } + const base::FilePath user_data_dir_path() { return temp_dir_.GetPath(); } protected: @@ -271,15 +277,62 @@ base::ScopedTempDir temp_dir_; }; +class MetricsServiceTestWithConsolidateInitialLogLogicFeature + : public MetricsServiceTest, + public ::testing::WithParamInterface<bool> { + public: + MetricsServiceTestWithConsolidateInitialLogLogicFeature() = default; + ~MetricsServiceTestWithConsolidateInitialLogLogicFeature() override = default; + + bool ShouldConsolidateInitialLogLogic() { return GetParam(); } + + void SetUp() override { + MetricsServiceTest::SetUp(); + if (ShouldConsolidateInitialLogLogic()) { + feature_list_.InitWithFeatures( + {kConsolidateMetricsServiceInitialLogLogic}, {}); + } else { + feature_list_.InitWithFeatures( + {}, {kConsolidateMetricsServiceInitialLogLogic}); + } + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + struct StartupVisibilityTestParams { const std::string test_name; metrics::StartupVisibility startup_visibility; + bool consolidate_initial_log_logic; bool expected_beacon_value; }; class MetricsServiceTestWithStartupVisibility : public MetricsServiceTest, - public ::testing::WithParamInterface<StartupVisibilityTestParams> {}; + public ::testing::WithParamInterface<StartupVisibilityTestParams> { + public: + MetricsServiceTestWithStartupVisibility() = default; + ~MetricsServiceTestWithStartupVisibility() override = default; + + bool ShouldConsolidateInitialLogLogic() { + return GetParam().consolidate_initial_log_logic; + } + + void SetUp() override { + MetricsServiceTest::SetUp(); + if (ShouldConsolidateInitialLogLogic()) { + feature_list_.InitWithFeatures( + {kConsolidateMetricsServiceInitialLogLogic}, {}); + } else { + feature_list_.InitWithFeatures( + {}, {kConsolidateMetricsServiceInitialLogLogic}); + } + } + + private: + base::test::ScopedFeatureList feature_list_; +}; class ExperimentTestMetricsProvider : public TestMetricsProvider { public: @@ -320,7 +373,13 @@ } // namespace -TEST_F(MetricsServiceTest, InitialStabilityLogAfterCleanShutDown) { +INSTANTIATE_TEST_SUITE_P( + All, + MetricsServiceTestWithConsolidateInitialLogLogicFeature, + testing::Bool()); + +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + InitialStabilityLogAfterCleanShutDown) { base::HistogramTester histogram_tester; EnableMetricsReporting(); // Write a beacon file indicating that Chrome exited cleanly. Note that the @@ -361,7 +420,8 @@ StabilityEventType::kBrowserCrash, 0); } -TEST_F(MetricsServiceTest, InitialStabilityLogAtProviderRequest) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + InitialStabilityLogAtProviderRequest) { base::HistogramTester histogram_tester; EnableMetricsReporting(); @@ -441,14 +501,32 @@ StartupVisibilityTestParams{ .test_name = "UnknownVisibility", .startup_visibility = StartupVisibility::kUnknown, + .consolidate_initial_log_logic = false, .expected_beacon_value = true}, StartupVisibilityTestParams{ .test_name = "BackgroundVisibility", .startup_visibility = StartupVisibility::kBackground, + .consolidate_initial_log_logic = false, .expected_beacon_value = true}, StartupVisibilityTestParams{ .test_name = "ForegroundVisibility", .startup_visibility = StartupVisibility::kForeground, + .consolidate_initial_log_logic = false, + .expected_beacon_value = false}, + StartupVisibilityTestParams{ + .test_name = "UnknownVisibilityConsolidateInitialLogLogic", + .startup_visibility = StartupVisibility::kUnknown, + .consolidate_initial_log_logic = true, + .expected_beacon_value = true}, + StartupVisibilityTestParams{ + .test_name = "BackgroundVisibilityConsolidateInitialLogLogic", + .startup_visibility = StartupVisibility::kBackground, + .consolidate_initial_log_logic = true, + .expected_beacon_value = true}, + StartupVisibilityTestParams{ + .test_name = "ForegroundVisibilityConsolidateInitialLogLogic", + .startup_visibility = StartupVisibility::kForeground, + .consolidate_initial_log_logic = true, .expected_beacon_value = false}), [](const ::testing::TestParamInfo<StartupVisibilityTestParams>& params) { return params.param.test_name; @@ -555,7 +633,8 @@ StabilityEventType::kBrowserCrash, 1); } -TEST_F(MetricsServiceTest, InitialLogsHaveOnDidCreateMetricsLogHistograms) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + InitialLogsHaveOnDidCreateMetricsLogHistograms) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -596,7 +675,8 @@ EXPECT_EQ(1, GetSampleCountOfOnDidCreateLogHistogram(test_log_store)); } -TEST_F(MetricsServiceTest, MarkCurrentHistogramsAsReported) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + MarkCurrentHistogramsAsReported) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -628,7 +708,65 @@ base::StatisticsRecorder::ForgetHistogramForTesting("Test.After.Histogram"); } -TEST_F(MetricsServiceTest, FirstLogCreatedBeforeUnsentLogsSent) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + LogHasUserActions) { + // This test verifies that user actions are properly captured in UMA logs. + // In particular, it checks that the first log has actions, a behavior that + // was buggy in the past, plus additional checks for subsequent logs with + // different numbers of actions. This behavior is only fixed after + // consolidating the initial log logic. + if (!ShouldConsolidateInitialLogLogic()) + return; + + EnableMetricsReporting(); + TestMetricsServiceClient client; + TestMetricsService service(GetMetricsStateManager(), &client, + GetLocalState()); + + service.InitializeMetricsRecordingState(); + + // Start() will create an initial log. + service.Start(); + ASSERT_EQ(TestMetricsService::INIT_TASK_SCHEDULED, service.state()); + + base::RecordAction(base::UserMetricsAction("TestAction")); + base::RecordAction(base::UserMetricsAction("TestAction")); + base::RecordAction(base::UserMetricsAction("DifferentAction")); + + // Run pending tasks to finish init task and complete the first ongoing log. + task_runner_->RunPendingTasks(); + ASSERT_EQ(TestMetricsService::SENDING_LOGS, service.state()); + + MetricsLogStore* test_log_store = service.LogStoreForTest(); + + // Stage the next log, which should be the initial metrics log. + test_log_store->StageNextLog(); + EXPECT_EQ(3, GetNumberOfUserActions(test_log_store)); + + // Log another action. + base::RecordAction(base::UserMetricsAction("TestAction")); + test_log_store->DiscardStagedLog(); + service.StageCurrentLogForTest(); + EXPECT_EQ(1, GetNumberOfUserActions(test_log_store)); + + // Check a log with no actions. + test_log_store->DiscardStagedLog(); + service.StageCurrentLogForTest(); + EXPECT_EQ(0, GetNumberOfUserActions(test_log_store)); + + // And another one with a couple. + base::RecordAction(base::UserMetricsAction("TestAction")); + base::RecordAction(base::UserMetricsAction("TestAction")); + test_log_store->DiscardStagedLog(); + service.StageCurrentLogForTest(); + EXPECT_EQ(2, GetNumberOfUserActions(test_log_store)); +} + +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + FirstLogCreatedBeforeUnsentLogsSent) { + // This test checks that we will create and serialize the first ongoing log + // before starting to send unsent logs from the past session. The latter is + // simulated by injecting some fake ongoing logs into the MetricsLogStore. EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -660,7 +798,7 @@ EXPECT_EQ(2u, test_log_store->ongoing_log_count()); } -TEST_F(MetricsServiceTest, +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, MetricsProviderOnRecordingDisabledCalledOnInitialStop) { TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -676,7 +814,8 @@ EXPECT_TRUE(test_provider->on_recording_disabled_called()); } -TEST_F(MetricsServiceTest, MetricsProvidersInitialized) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + MetricsProvidersInitialized) { TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, GetLocalState()); @@ -692,7 +831,8 @@ // Verify that FieldTrials activated by a MetricsProvider are reported by the // FieldTrialsProvider. -TEST_F(MetricsServiceTest, ActiveFieldTrialsReported) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + ActiveFieldTrialsReported) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -728,7 +868,8 @@ IsFieldTrialPresent(uma_log.system_profile(), trial_name2, group_name2)); } -TEST_F(MetricsServiceTest, SystemProfileDataProvidedOnEnableRecording) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + SystemProfileDataProvidedOnEnableRecording) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -752,7 +893,7 @@ EXPECT_FALSE(service.persistent_system_profile_complete()); } -TEST_F(MetricsServiceTest, SplitRotation) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, SplitRotation) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -794,7 +935,8 @@ EXPECT_EQ(1U, task_runner_->NumPendingTasks()); } -TEST_F(MetricsServiceTest, LastLiveTimestamp) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + LastLiveTimestamp) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -837,7 +979,8 @@ GetLocalState()->GetTime(prefs::kStabilityBrowserLastLiveTimeStamp)); } -TEST_F(MetricsServiceTest, EnablementObserverNotification) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + EnablementObserverNotification) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -863,7 +1006,8 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) // ResetClientId is only enabled on certain targets. -TEST_F(MetricsServiceTest, SetClientIdToExternalId) { +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, + SetClientIdToExternalId) { EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, @@ -883,7 +1027,7 @@ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) #if BUILDFLAG(IS_CHROMEOS_ASH) -TEST_F(MetricsServiceTest, +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, OngoingLogNotFlushedBeforeInitialLogWhenUserLogStoreSet) { EnableMetricsReporting(); TestMetricsServiceClient client; @@ -920,7 +1064,7 @@ EXPECT_EQ(1u, alternate_ongoing_log_store_ptr->size()); } -TEST_F(MetricsServiceTest, +TEST_P(MetricsServiceTestWithConsolidateInitialLogLogicFeature, OngoingLogFlushedAfterInitialLogWhenUserLogStoreSet) { EnableMetricsReporting(); TestMetricsServiceClient client;
diff --git a/components/neterror/resources/neterror.js b/components/neterror/resources/neterror.js index 9d92f8e7..d85545c3 100644 --- a/components/neterror/resources/neterror.js +++ b/components/neterror/resources/neterror.js
@@ -130,7 +130,7 @@ let primaryControlOnLeft = true; // clang-format off -// <if expr="is_macosx or is_ios or is_linux or chromeos_ash or chromeos_lacros or is_android"> +// <if expr="is_macosx or is_ios or is_linux or is_chromeos or is_android"> // clang-format on primaryControlOnLeft = false; // </if>
diff --git a/components/new_or_sad_tab_strings.grdp b/components/new_or_sad_tab_strings.grdp index 04e7d95b..6c8a867 100644 --- a/components/new_or_sad_tab_strings.grdp +++ b/components/new_or_sad_tab_strings.grdp
@@ -61,7 +61,7 @@ Open page in a new Incognito tab </message> </if> - <if expr="is_macosx or chromeos_ash or chromeos_lacros"> + <if expr="is_macosx or is_chromeos"> <message name="IDS_SAD_TAB_RELOAD_CLOSE_TABS" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to close other Chrome tabs or apps running on their computer (Mac, ChromeOS)."> Close other tabs or apps </message> @@ -71,7 +71,7 @@ Close other tabs or programs </message> </if> - <if expr="is_macosx or chromeos_ash or chromeos_lacros or is_ios"> + <if expr="is_macosx or is_chromeos or is_ios"> <message name="IDS_SAD_TAB_RELOAD_CLOSE_NOTABS" desc="One of the bullet points displayed on the web page if a reload failed to fix the issue, advising the user to close other apps running on their computer or device."> Close other apps </message>
diff --git a/components/offline_pages/core/downloads/download_ui_adapter.h b/components/offline_pages/core/downloads/download_ui_adapter.h index c7ddbb30..26372fdd 100644 --- a/components/offline_pages/core/downloads/download_ui_adapter.h +++ b/components/offline_pages/core/downloads/download_ui_adapter.h
@@ -27,7 +27,6 @@ using OfflineContentAggregator = offline_items_collection::OfflineContentAggregator; using OfflineItem = offline_items_collection::OfflineItem; -using OfflineItemSchedule = offline_items_collection::OfflineItemSchedule; using OfflineItemShareInfo = offline_items_collection::OfflineItemShareInfo; using UpdateDelta = offline_items_collection::UpdateDelta;
diff --git a/components/optimization_guide/core/hints_fetcher_unittest.cc b/components/optimization_guide/core/hints_fetcher_unittest.cc index 27281c2f..04f2cf94 100644 --- a/components/optimization_guide/core/hints_fetcher_unittest.cc +++ b/components/optimization_guide/core/hints_fetcher_unittest.cc
@@ -354,11 +354,11 @@ if (!ShouldPersistHintsToDisk()) return; - const base::Value* hosts_fetched = pref_service()->GetDictionary( + const base::Value::Dict& hosts_fetched = pref_service()->GetValueDict( prefs::kHintsFetcherHostsSuccessfullyFetched); absl::optional<double> value; for (const std::string& host : hosts) { - value = hosts_fetched->FindDoubleKey(HashHostForDictionary(host)); + value = hosts_fetched.FindDouble(HashHostForDictionary(host)); // This reduces the necessary precision for the check on the expiry time for // the hosts stored in the pref. The exact time is not necessary, being // within 10 minutes is acceptable. @@ -382,10 +382,10 @@ if (!ShouldPersistHintsToDisk()) return; - const base::Value* hosts_fetched = pref_service()->GetDictionary( + const base::Value::Dict& hosts_fetched = pref_service()->GetValueDict( prefs::kHintsFetcherHostsSuccessfullyFetched); for (const std::string& host : hosts) { - EXPECT_FALSE(hosts_fetched->FindDoubleKey(HashHostForDictionary(host))); + EXPECT_FALSE(hosts_fetched.FindDouble(HashHostForDictionary(host))); } } @@ -401,17 +401,21 @@ if (!ShouldPersistHintsToDisk()) return; - const base::Value* hosts_fetched = pref_service()->GetDictionary( - prefs::kHintsFetcherHostsSuccessfullyFetched); - for (const std::string& host : hosts) { - EXPECT_TRUE(hosts_fetched->FindDoubleKey(HashHostForDictionary(host))); + { + const base::Value::Dict& hosts_fetched = pref_service()->GetValueDict( + prefs::kHintsFetcherHostsSuccessfullyFetched); + for (const std::string& host : hosts) { + EXPECT_TRUE(hosts_fetched.FindDouble(HashHostForDictionary(host))); + } } HintsFetcher::ClearHostsSuccessfullyFetched(pref_service()); - hosts_fetched = pref_service()->GetDictionary( - prefs::kHintsFetcherHostsSuccessfullyFetched); - for (const std::string& host : hosts) { - EXPECT_FALSE(hosts_fetched->FindDoubleKey(HashHostForDictionary(host))); + { + const base::Value::Dict& hosts_fetched = pref_service()->GetValueDict( + prefs::kHintsFetcherHostsSuccessfullyFetched); + for (const std::string& host : hosts) { + EXPECT_FALSE(hosts_fetched.FindDouble(HashHostForDictionary(host))); + } } } @@ -427,19 +431,22 @@ if (!ShouldPersistHintsToDisk()) return; - const base::Value* hosts_fetched = pref_service()->GetDictionary( - prefs::kHintsFetcherHostsSuccessfullyFetched); - for (const std::string& host : hosts) { - EXPECT_TRUE(hosts_fetched->FindDoubleKey(HashHostForDictionary(host))); + { + const base::Value::Dict& hosts_fetched = pref_service()->GetValueDict( + prefs::kHintsFetcherHostsSuccessfullyFetched); + for (const std::string& host : hosts) { + EXPECT_TRUE(hosts_fetched.FindDouble(HashHostForDictionary(host))); + } } HintsFetcher::ClearSingleFetchedHost(pref_service(), "host1.com"); - hosts_fetched = pref_service()->GetDictionary( - prefs::kHintsFetcherHostsSuccessfullyFetched); + { + const base::Value::Dict& hosts_fetched = pref_service()->GetValueDict( + prefs::kHintsFetcherHostsSuccessfullyFetched); - EXPECT_FALSE( - hosts_fetched->FindDoubleKey(HashHostForDictionary("host1.com"))); - EXPECT_TRUE(hosts_fetched->FindDoubleKey(HashHostForDictionary("host2.com"))); + EXPECT_FALSE(hosts_fetched.FindDouble(HashHostForDictionary("host1.com"))); + EXPECT_TRUE(hosts_fetched.FindDouble(HashHostForDictionary("host2.com"))); + } } TEST_P(HintsFetcherTest, HintsFetcherHostsCovered) {
diff --git a/components/page_load_metrics/browser/observers/core/OWNERS b/components/page_load_metrics/browser/observers/core/OWNERS index d5deb2c3..4dd841b 100644 --- a/components/page_load_metrics/browser/observers/core/OWNERS +++ b/components/page_load_metrics/browser/observers/core/OWNERS
@@ -1,2 +1,3 @@ -npm@chromium.org +iclelland@chromium.org +yoavweiss@chromium.org sullivan@chromium.org
diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc index b08cb9f..2f14765 100644 --- a/components/password_manager/content/browser/content_password_manager_driver.cc +++ b/components/password_manager/content/browser/content_password_manager_driver.cc
@@ -265,8 +265,7 @@ } void ContentPasswordManagerDriver::PasswordFormsRendered( - const std::vector<autofill::FormData>& raw_forms, - bool did_stop_loading) { + const std::vector<autofill::FormData>& raw_forms) { if (!password_manager::bad_message::CheckFrameNotPrerendering( render_frame_host_)) return; @@ -280,7 +279,7 @@ for (auto& form : forms) SetFrameAndFormMetaData(render_frame_host_, form); - GetPasswordManager()->OnPasswordFormsRendered(this, forms, did_stop_loading); + GetPasswordManager()->OnPasswordFormsRendered(this, forms); } void ContentPasswordManagerDriver::PasswordFormSubmitted(
diff --git a/components/password_manager/content/browser/content_password_manager_driver.h b/components/password_manager/content/browser/content_password_manager_driver.h index 3236c988..5d36e5c 100644 --- a/components/password_manager/content/browser/content_password_manager_driver.h +++ b/components/password_manager/content/browser/content_password_manager_driver.h
@@ -124,8 +124,7 @@ void PasswordFormsParsed( const std::vector<autofill::FormData>& forms_data) override; void PasswordFormsRendered( - const std::vector<autofill::FormData>& visible_forms_data, - bool did_stop_loading) override; + const std::vector<autofill::FormData>& visible_forms_data) override; void PasswordFormSubmitted(const autofill::FormData& form_data) override; void InformAboutUserInput(const autofill::FormData& form_data) override; void DynamicFormSubmission(autofill::mojom::SubmissionIndicatorEvent
diff --git a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc index 8ba8d720..e0c08a1 100644 --- a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc +++ b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
@@ -132,8 +132,7 @@ MOCK_METHOD(void, OnPasswordFormsRendered, (PasswordManagerDriver * driver, - const std::vector<autofill::FormData>&, - bool), + const std::vector<autofill::FormData>&), (override)); MOCK_METHOD(void, OnPasswordFormSubmitted, @@ -354,9 +353,9 @@ EXPECT_CALL(password_manager_, OnPasswordFormsRendered( - _, ElementsAre(FormDataEqualTo(ExpectedFormData())), _)); + _, ElementsAre(FormDataEqualTo(ExpectedFormData())))); - driver()->PasswordFormsRendered({form}, false); + driver()->PasswordFormsRendered({form}); } TEST_F(ContentPasswordManagerDriverURLTest, PasswordFormSubmitted) {
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc index 5d1cc68..6e0d48b 100644 --- a/components/password_manager/core/browser/leak_detection_delegate.cc +++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -92,12 +92,11 @@ false); if (is_leaked || force_dialog_for_testing) { PasswordScriptsFetcher* scripts_fetcher = nullptr; - // Password change scripts require password generation, so only bother - // querying for script availability if generation is available. - // Similarly, password change scripts should only be offered during sign-in + // Password change scripts should only be offered during sign-in // (not during sign-up), so don't query if this was a new-password form. - if (client_->GetPasswordFeatureManager()->IsGenerationEnabled() && - !is_likely_signup_form_ && + if (!is_likely_signup_form_ && + client_->GetPasswordFeatureManager() + ->AreRequirementsForAutomatedPasswordChangeFulfilled() && password_manager::features::IsPasswordScriptsFetchingEnabled() && base::FeatureList::IsEnabled( password_manager::features::kPasswordChange)) {
diff --git a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc index f06c1d5..ff4ea2e 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -471,7 +471,8 @@ TEST_F(LeakDetectionDelegateWithPasswordChangeTest, ChecksForScriptsOnSigninForm) { - ON_CALL(*client().GetPasswordFeatureManager(), IsGenerationEnabled()) + ON_CALL(*client().GetPasswordFeatureManager(), + AreRequirementsForAutomatedPasswordChangeFulfilled) .WillByDefault(Return(true)); const PasswordForm form = CreateTestForm();
diff --git a/components/password_manager/core/browser/mock_password_feature_manager.h b/components/password_manager/core/browser/mock_password_feature_manager.h index 35c4f45..0e28b10 100644 --- a/components/password_manager/core/browser/mock_password_feature_manager.h +++ b/components/password_manager/core/browser/mock_password_feature_manager.h
@@ -16,7 +16,10 @@ ~MockPasswordFeatureManager() override; MOCK_CONST_METHOD0(IsGenerationEnabled, bool()); - + MOCK_METHOD(bool, + AreRequirementsForAutomatedPasswordChangeFulfilled, + (), + (const override)); MOCK_CONST_METHOD0(IsOptedInForAccountStorage, bool()); MOCK_CONST_METHOD0(ShouldShowAccountStorageOptIn, bool()); MOCK_CONST_METHOD1(ShouldShowAccountStorageReSignin, bool(const GURL&));
diff --git a/components/password_manager/core/browser/password_feature_manager.h b/components/password_manager/core/browser/password_feature_manager.h index 22a786ab..c679eab 100644 --- a/components/password_manager/core/browser/password_feature_manager.h +++ b/components/password_manager/core/browser/password_feature_manager.h
@@ -22,6 +22,11 @@ virtual bool IsGenerationEnabled() const = 0; + // Whether the entry-point independent requirements are met to offer + // automated password change. Currently, that means that a user must be + // syncing. + virtual bool AreRequirementsForAutomatedPasswordChangeFulfilled() const = 0; + // Whether the current signed-in user (aka unconsented primary account) has // opted in to use the Google account storage for passwords (as opposed to // local/profile storage).
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc index 7c91b68..f09c1c8a 100644 --- a/components/password_manager/core/browser/password_feature_manager_impl.cc +++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -29,6 +29,20 @@ } } +bool PasswordFeatureManagerImpl:: + AreRequirementsForAutomatedPasswordChangeFulfilled() const { + // TODO(crbug.com/1349782): Re-enable for account store users once adjustments + // to script fetchers and WebsiteLoginManager are made. + switch (password_manager_util::GetPasswordSyncState(sync_service_)) { + case SyncState::kNotSyncing: + case SyncState::kAccountPasswordsActiveNormalEncryption: + return false; + case SyncState::kSyncingWithCustomPassphrase: + case SyncState::kSyncingNormalEncryption: + return true; + } +}; + bool PasswordFeatureManagerImpl::IsOptedInForAccountStorage() const { return features_util::IsOptedInForAccountStorage(pref_service_, sync_service_);
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.h b/components/password_manager/core/browser/password_feature_manager_impl.h index e521a07..f19edb5 100644 --- a/components/password_manager/core/browser/password_feature_manager_impl.h +++ b/components/password_manager/core/browser/password_feature_manager_impl.h
@@ -30,7 +30,7 @@ ~PasswordFeatureManagerImpl() override = default; bool IsGenerationEnabled() const override; - + bool AreRequirementsForAutomatedPasswordChangeFulfilled() const override; bool IsOptedInForAccountStorage() const override; bool ShouldShowAccountStorageOptIn() const override; bool ShouldShowAccountStorageReSignin(
diff --git a/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc b/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc index 228a530b..22d150fd 100644 --- a/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc +++ b/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc
@@ -97,3 +97,56 @@ EXPECT_FALSE(password_feature_manager_.IsGenerationEnabled()); } + +TEST_F(PasswordFeatureManagerImplTest, + RequirementsForAutomatedPasswordChangeMetForSyncingUser) { + sync_service_.SetAccountInfo(account_); + sync_service_.SetHasSyncConsent(true); + sync_service_.SetDisableReasons({}); + sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); + sync_service_.SetActiveDataTypes(syncer::ModelTypeSet(syncer::PASSWORDS)); + + ASSERT_EQ(password_manager_util::GetPasswordSyncState(&sync_service_), + password_manager::SyncState::kSyncingNormalEncryption); + + EXPECT_TRUE(password_feature_manager_ + .AreRequirementsForAutomatedPasswordChangeFulfilled()); +} + +TEST_F(PasswordFeatureManagerImplTest, + RequirementsForAutomatedPasswordChangeNotMetForNonSyncingUser) { + sync_service_.SetAccountInfo(account_); + sync_service_.SetHasSyncConsent(false); + sync_service_.SetDisableReasons( + {syncer::SyncService::DisableReason::DISABLE_REASON_USER_CHOICE}); + sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); + sync_service_.SetActiveDataTypes({}); + + ASSERT_EQ(password_manager_util::GetPasswordSyncState(&sync_service_), + password_manager::SyncState::kNotSyncing); + + EXPECT_FALSE(password_feature_manager_ + .AreRequirementsForAutomatedPasswordChangeFulfilled()); +} + +TEST_F(PasswordFeatureManagerImplTest, + RequirementsForAutomatedPasswordChangeNotMetForAccountStoreUser) { + base::test::ScopedFeatureList features; + features.InitAndEnableFeature( + password_manager::features::kEnablePasswordsAccountStorage); + + sync_service_.SetAccountInfo(account_); + sync_service_.SetHasSyncConsent(false); + sync_service_.SetDisableReasons( + {syncer::SyncService::DisableReason::DISABLE_REASON_USER_CHOICE}); + sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); + + password_feature_manager_.OptInToAccountStorage(); + + ASSERT_EQ( + password_manager_util::GetPasswordSyncState(&sync_service_), + password_manager::SyncState::kAccountPasswordsActiveNormalEncryption); + + EXPECT_FALSE(password_feature_manager_ + .AreRequirementsForAutomatedPasswordChangeFulfilled()); +}
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index 13974c9a..f07c10d1 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -902,8 +902,7 @@ void PasswordManager::OnPasswordFormsRendered( password_manager::PasswordManagerDriver* driver, - const std::vector<FormData>& visible_forms_data, - bool did_stop_loading) { + const std::vector<FormData>& visible_forms_data) { CreatePendingLoginManagers(driver, visible_forms_data); std::unique_ptr<BrowserSavePasswordProgressLogger> logger; if (password_manager_util::IsLoggingActive(client_)) { @@ -940,16 +939,6 @@ visible_forms_data_.insert(visible_forms_data_.end(), visible_forms_data.begin(), visible_forms_data.end()); - if (!did_stop_loading && - !submitted_manager->GetSubmittedForm() - ->form_data.is_gaia_with_skip_save_password_form) { - // |form_data.is_gaia_with_skip_save_password_form| = true means that this - // is a Chrome sign-in page. Chrome sign-in pages are redirected to an empty - // pages, and for some reasons |did_stop_loading| might be false. So - // |did_stop_loading| is ignored for them. - return; - } - if (!driver->IsInPrimaryMainFrame() && submitted_manager->driver_id() != driver->GetId()) { // Frames different from the main frame and the frame of the submitted form
diff --git a/components/password_manager/core/browser/password_manager.h b/components/password_manager/core/browser/password_manager.h index bb070841..893b8c58 100644 --- a/components/password_manager/core/browser/password_manager.h +++ b/components/password_manager/core/browser/password_manager.h
@@ -77,8 +77,7 @@ const std::vector<autofill::FormData>& forms_data) override; void OnPasswordFormsRendered( PasswordManagerDriver* driver, - const std::vector<autofill::FormData>& visible_forms_data, - bool did_stop_loading) override; + const std::vector<autofill::FormData>& visible_forms_data) override; void OnPasswordFormSubmitted(PasswordManagerDriver* driver, const autofill::FormData& form_data) override; void OnPasswordFormCleared(PasswordManagerDriver* driver,
diff --git a/components/password_manager/core/browser/password_manager_interface.h b/components/password_manager/core/browser/password_manager_interface.h index 729b9e5..45116642 100644 --- a/components/password_manager/core/browser/password_manager_interface.h +++ b/components/password_manager/core/browser/password_manager_interface.h
@@ -36,8 +36,7 @@ // Handles password forms being rendered. virtual void OnPasswordFormsRendered( PasswordManagerDriver* driver, - const std::vector<autofill::FormData>& visible_forms_data, - bool did_stop_loading) = 0; + const std::vector<autofill::FormData>& visible_forms_data) = 0; // Handles a password form being submitted. virtual void OnPasswordFormSubmitted(PasswordManagerDriver* driver,
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index d041029..34b318e4 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -664,7 +664,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) .WillRepeatedly(Return(true)); @@ -677,7 +677,7 @@ // Now the password manager waits for the navigation to complete. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Simulate saving the form, as if the info bar was accepted. PasswordForm saved_form; @@ -701,7 +701,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Simulate the user generating the password and submitting the form. EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) @@ -724,7 +724,7 @@ // Now the password manager waits for the navigation to complete. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_EQ(form_data.fields[0].value, form_to_save.username_value); // What was "new password" field in the submitted form, becomes the current // password field in the form to save. @@ -820,7 +820,7 @@ EXPECT_CALL(client_, AutomaticPasswordSave); // Now the password manager waits for the navigation to complete. - manager()->OnPasswordFormsRendered(&driver_, {}, true); + manager()->OnPasswordFormsRendered(&driver_, {}); } TEST_P(PasswordManagerTest, PasswordNoLongerGeneratedOnIOS) { @@ -895,7 +895,7 @@ EXPECT_CALL(*store_, GetLogins(PasswordFormDigest(form), _)) .WillOnce(WithArg<1>(InvokeConsumer(store_.get(), existing_different))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); ASSERT_TRUE(manager()->form_managers().front()); const VotesUploader& votes_uploader = manager()->form_managers().front()->votes_uploader(); @@ -913,7 +913,7 @@ observed.clear(); manager()->DidNavigateMainFrame(true); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Check that suggested value was properly recorded in VotesUploader. EXPECT_EQ(form.username_value, votes_uploader.suggested_username()); @@ -936,7 +936,7 @@ .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), form))); EXPECT_CALL(driver_, FillPasswordForm(_)).Times(2); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // The user is typing a credential manually. Till the credential is different // from the saved one, the fallback should be available. @@ -968,7 +968,7 @@ observed.clear(); manager()->DidNavigateMainFrame(true); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_EQ(1, user_action_tester.GetActionCount("PasswordManager_LoginPassed")); } @@ -1019,7 +1019,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(*client_.GetStoreResultFilter(), ShouldSave(_)) .WillRepeatedly(Return(false)); @@ -1034,7 +1034,7 @@ EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); observed.clear(); manager()->DidNavigateMainFrame(true); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Tests that a UKM metric "Login Passed" is sent when the submitted credentials @@ -1050,7 +1050,7 @@ .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), form))); EXPECT_CALL(driver_, FillPasswordForm(_)).Times(AnyNumber()); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // The user submits the form. OnPasswordFormSubmitted(form.form_data); @@ -1070,7 +1070,7 @@ base::UserActionTester user_action_tester; observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_EQ(1, user_action_tester.GetActionCount("PasswordManager_LoginPassed")); } @@ -1082,14 +1082,14 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // No message from the renderer that a password was submitted. No // expected calls. EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, FormSubmit) { @@ -1101,7 +1101,7 @@ EXPECT_FALSE(manager()->IsPasswordFieldDetectedOnPage()); manager()->OnPasswordFormsParsed(&driver_, observed); EXPECT_TRUE(manager()->IsPasswordFieldDetectedOnPage()); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); ASSERT_TRUE(manager()->form_managers().front()); const VotesUploader& votes_uploader = manager()->form_managers().front()->votes_uploader(); @@ -1117,7 +1117,7 @@ observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Check that suggested value was properly recorded in VotesUploader. EXPECT_EQ(form.username_value, votes_uploader.suggested_username()); @@ -1150,7 +1150,7 @@ EXPECT_FALSE(manager()->IsPasswordFieldDetectedOnPage()); manager()->OnPasswordFormsParsed(&driver_, observed); EXPECT_TRUE(manager()->IsPasswordFieldDetectedOnPage()); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -1161,7 +1161,7 @@ observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // This test verifies a fix for http://crbug.com/236673 @@ -1186,7 +1186,7 @@ .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Now navigate to a second page. manager()->DidNavigateMainFrame(true); @@ -1195,7 +1195,7 @@ // URL. observed = {second_form.form_data}; manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Now submit this form EXPECT_CALL(client_, IsSavingAndFillingEnabled(second_form.url)) @@ -1208,7 +1208,7 @@ // Navigation after form submit, no forms appear. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Simulate saving the form, as if the info bar was accepted and make sure // that the saved form matches the second form, not the first. @@ -1226,7 +1226,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) .WillRepeatedly(Return(true)); @@ -1240,7 +1240,7 @@ // The form reappears, but is not visible in the layout: manager()->OnPasswordFormsParsed(&driver_, observed); observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Simulate saving the form. EXPECT_CALL(*store_, AddLogin(FormMatches(form))); @@ -1261,7 +1261,7 @@ .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), form))); manager()->OnPasswordFormsParsed(&driver_, observed); observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, FillPasswordsOnDisabledManager) { @@ -1289,7 +1289,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled).WillRepeatedly(Return(true)); OnPasswordFormSubmitted(form_data); @@ -1318,7 +1318,7 @@ EXPECT_CALL(client_, ResetSubmissionTrackingAfterTouchToFill()); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, ChangePasswordFormReappearance) { @@ -1329,7 +1329,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled).WillRepeatedly(Return(true)); OnPasswordFormSubmitted(form_data); @@ -1351,7 +1351,7 @@ EXPECT_CALL(client_, AutomaticPasswordSave).Times(0); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, SyncCredentialsNotSaved) { @@ -1362,7 +1362,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // User should not be prompted and password should not be saved. EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); @@ -1386,50 +1386,46 @@ OnPasswordFormSubmitted(form_data); observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, HashSavedOnGaiaFormWithSkipSavePassword) { - for (bool did_stop_loading : {false, true}) { - SCOPED_TRACE(testing::Message("did_stop_loading = ") << did_stop_loading); - EXPECT_CALL(*store_, GetLogins(_, _)) - .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); - EXPECT_CALL(driver_, FillPasswordForm(_)).Times(0); - std::vector<FormData> observed; - FormData form_data(MakeSimpleGAIAFormData()); - // Simulate that this is Gaia form that should be ignored for - // saving/filling. - form_data.is_gaia_with_skip_save_password_form = true; - observed.push_back(form_data); + EXPECT_CALL(*store_, GetLogins(_, _)) + .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); + EXPECT_CALL(driver_, FillPasswordForm(_)).Times(0); + std::vector<FormData> observed; + FormData form_data(MakeSimpleGAIAFormData()); + // Simulate that this is Gaia form that should be ignored for + // saving/filling. + form_data.is_gaia_with_skip_save_password_form = true; + observed.push_back(form_data); - EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) - .WillRepeatedly(Return(true)); + EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) + .WillRepeatedly(Return(true)); - manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsParsed(&driver_, observed); + manager()->OnPasswordFormsRendered(&driver_, observed); - ON_CALL(*client_.GetStoreResultFilter(), ShouldSaveGaiaPasswordHash(_)) - .WillByDefault(Return(true)); - ON_CALL(*client_.GetStoreResultFilter(), ShouldSave(_)) - .WillByDefault(Return(false)); - ON_CALL(*client_.GetStoreResultFilter(), IsSyncAccountEmail(_)) - .WillByDefault(Return(true)); + ON_CALL(*client_.GetStoreResultFilter(), ShouldSaveGaiaPasswordHash(_)) + .WillByDefault(Return(true)); + ON_CALL(*client_.GetStoreResultFilter(), ShouldSave(_)) + .WillByDefault(Return(false)); + ON_CALL(*client_.GetStoreResultFilter(), IsSyncAccountEmail(_)) + .WillByDefault(Return(true)); - EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); + EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); - EXPECT_CALL( - reuse_manager_, - SaveGaiaPasswordHash( - "googleuser", form_data.fields[1].value, - /*is_primary_account=*/true, - metrics_util::GaiaPasswordHashChange::SAVED_IN_CONTENT_AREA)); + EXPECT_CALL(reuse_manager_, + SaveGaiaPasswordHash( + "googleuser", form_data.fields[1].value, + /*is_primary_account=*/true, + metrics_util::GaiaPasswordHashChange::SAVED_IN_CONTENT_AREA)); - OnPasswordFormSubmitted(form_data); - observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, did_stop_loading); - testing::Mock::VerifyAndClearExpectations(&client_); - testing::Mock::VerifyAndClearExpectations(&store_); - } + OnPasswordFormSubmitted(form_data); + observed.clear(); + manager()->OnPasswordFormsRendered(&driver_, observed); + testing::Mock::VerifyAndClearExpectations(&client_); + testing::Mock::VerifyAndClearExpectations(&store_); } TEST_P(PasswordManagerTest, @@ -1482,7 +1478,7 @@ EXPECT_CALL(driver_, FillPasswordForm(_)); manager()->OnPasswordFormsParsed(&driver_, observed); EXPECT_CALL(driver_, FillPasswordForm(_)); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Submit form and finish navigation. EXPECT_CALL(client_, IsSavingAndFillingEnabled(observed_form.url)) @@ -1501,7 +1497,7 @@ EXPECT_CALL(*store_, UpdateLogin(_)); observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // When there is a sync password saved, and the user successfully uses the @@ -1517,7 +1513,7 @@ observed.push_back(form.form_data); EXPECT_CALL(driver_, FillPasswordForm(_)).Times(2); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Submit form and finish navigation. EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) @@ -1540,7 +1536,7 @@ EXPECT_CALL(*store_, RemoveLogin(_)).Times(0); observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // While sync credentials are not saved, they are still filled to avoid users @@ -1633,7 +1629,7 @@ // Parse, render and submit the secure form. std::vector<FormData> observed = {secure_form.form_data}; manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); OnPasswordFormSubmitted(secure_form.form_data); // Make sure |PromptUserToSaveOrUpdatePassword| gets called, and the resulting @@ -1647,7 +1643,7 @@ EXPECT_CALL(client_, IsSavingAndFillingEnabled(insecure_form.url)) .WillRepeatedly(Return(true)); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); OnPasswordFormSubmitted(insecure_form.form_data); // Expect no further calls to |PromptUserToSaveOrUpdatePassword| due to @@ -1658,7 +1654,7 @@ // forms. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Make sure that the form saved by the user is indeed the secure form. ASSERT_TRUE(form_manager_to_save); @@ -1688,7 +1684,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillOnce(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -1701,7 +1697,7 @@ // Now the password manager waits for the login to complete successfully. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); ASSERT_TRUE(form_manager_to_save); EXPECT_EQ(form_data.fields[1].value, form_manager_to_save->GetPendingCredentials().password_value); @@ -1722,7 +1718,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) .WillRepeatedly(Return(true)); @@ -1736,7 +1732,7 @@ observed.clear(); manager()->DidNavigateMainFrame(true); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Simulate saving the form, as if the info bar was accepted. EXPECT_CALL(*store_, AddLogin(FormMatches(form))); @@ -1819,7 +1815,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); manager()->OnInformAboutUserInput(&driver_, form.form_data); std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save; @@ -1846,7 +1842,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); manager()->OnInformAboutUserInput(&driver_, gaia_form.form_data); // Trigger a dynamic form submission, ensure that the user does not see a @@ -1872,7 +1868,7 @@ EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) .WillRepeatedly(Return(true)); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); manager()->OnInformAboutUserInput(&driver_, form.form_data); std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save; @@ -1895,7 +1891,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), form))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) .WillRepeatedly(Return(true)); @@ -1914,7 +1910,7 @@ observed.clear(); manager()->DidNavigateMainFrame(true); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_THAT(form, FormMatches(updated_form)); EXPECT_THAT(form, FormMatches(notified_form)); @@ -1932,7 +1928,7 @@ base::WeakPtr<PasswordStoreConsumer> store_consumer; EXPECT_CALL(*store_, GetLogins(_, _)).WillOnce(SaveArg<1>(&store_consumer)); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) .WillRepeatedly(Return(true)); @@ -1952,7 +1948,7 @@ // Now the password manager waits for the navigation to complete. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Simulate saving the form, as if the info bar was accepted. EXPECT_CALL(*store_, AddLogin(FormMatches(form))); @@ -1967,7 +1963,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -1984,7 +1980,7 @@ // navigation. OnPasswordFormSubmitted(form_data); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // If the user edits the generated password, but does not remove it completely, @@ -1996,7 +1992,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2017,7 +2013,7 @@ // Simulate submission failing, with the same form being visible after // navigation. manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Generated password are saved even if it looks like the submit failed (the @@ -2031,7 +2027,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2053,7 +2049,7 @@ // Simulate submission failing, with the same form being visible after // navigation. manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Verify that passwords which are no longer generated trigger the confirmation @@ -2066,7 +2062,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2090,7 +2086,7 @@ // Simulate a successful submission. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, PasswordGenerationUsernameChanged) { @@ -2100,7 +2096,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2121,7 +2117,7 @@ observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_EQ(form_data.fields[0].value, form_to_save.username_value); EXPECT_EQ(form_data.fields[1].value, form_to_save.password_value); } @@ -2135,7 +2131,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); base::HistogramTester histogram_tester; @@ -2174,7 +2170,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); base::HistogramTester histogram_tester; @@ -2210,7 +2206,7 @@ EXPECT_CALL(client_, AutomaticPasswordSave) .Times(found_matched_logins_in_store ? 0 : 1); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // The user accepts generated password and makes successful login. form.password_value = form.new_password_value; @@ -2237,7 +2233,7 @@ } manager()->DidNavigateMainFrame(true); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); ::testing::Mock::VerifyAndClearExpectations(store_.get()); EXPECT_CALL(*store_, IsAbleToSavePasswords()).WillRepeatedly(Return(true)); @@ -2301,7 +2297,7 @@ .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), android_form))); manager()->OnPasswordFormsParsed(&driver_, observed_forms); observed_forms.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); EXPECT_EQ(android_form.username_value, form_data.username_field.value); EXPECT_EQ(android_form.password_value, form_data.password_field.value); @@ -2337,7 +2333,7 @@ observed_forms.clear(); manager()->DidNavigateMainFrame(true); manager()->OnPasswordFormsParsed(&driver_, observed_forms); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); EXPECT_THAT(saved_form, FormMatches(android_form)); EXPECT_THAT(saved_form, FormMatches(saved_notified_form)); } @@ -2356,7 +2352,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), android_form))); manager()->OnPasswordFormsParsed(&driver_, observed_forms); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); EXPECT_CALL(client_, IsSavingAndFillingEnabled(observed_form.url)) .WillRepeatedly(Return(true)); @@ -2375,7 +2371,7 @@ observed_forms.clear(); manager()->DidNavigateMainFrame(true); manager()->OnPasswordFormsParsed(&driver_, observed_forms); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); PasswordForm saved_form; EXPECT_CALL(*store_, AddLogin(_)).Times(0); @@ -2402,7 +2398,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.url)) .WillRepeatedly(Return(true)); @@ -2417,7 +2413,7 @@ .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Check that no sync password hash is saved when no username is available, @@ -2432,7 +2428,7 @@ observed.push_back(form_data); EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2444,7 +2440,7 @@ EXPECT_CALL(reuse_manager_, SaveGaiaPasswordHash).Times(0); OnPasswordFormSubmitted(form_data); observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Check that no sync password hash is saved when the submitted credentials are @@ -2455,7 +2451,7 @@ std::vector<FormData> observed = {form_data}; EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2470,7 +2466,7 @@ OnPasswordFormSubmitted(form_data); observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, ManualFallbackForSaving) { @@ -2489,7 +2485,7 @@ .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), stored_form))); EXPECT_CALL(driver_, FillPasswordForm(_)).Times(2); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // The username of the stored form is the same, there should be update bubble. std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save; @@ -2541,7 +2537,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(SaveArg<1>(&store_consumer)); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // There is no response from the store. Don't show the fallback. EXPECT_CALL(client_, ShowManualFallbackForSavingPtr(_, _, _)).Times(0); @@ -2568,7 +2564,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // A user accepts a password generated by Chrome. It triggers password // presaving and showing manual fallback. @@ -2608,7 +2604,7 @@ std::vector<FormData> observed; observed.push_back(form_data); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Submit form and finish navigation. EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) @@ -2630,7 +2626,7 @@ observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Non-Sync Gaia password hash should be saved upon submission of Gaia login @@ -2643,7 +2639,7 @@ std::vector<FormData> observed; observed.push_back(form_data); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Submit form and finish navigation. EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2660,7 +2656,7 @@ OnPasswordFormSubmitted(form_data); observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Non-Sync Gaia password hash should be saved upon submission of change @@ -2673,7 +2669,7 @@ std::vector<FormData> observed; observed.push_back(form_data); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Submit form and finish navigation. EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2691,7 +2687,7 @@ observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Enterprise password hash should be saved upon submission of enterprise login @@ -2704,7 +2700,7 @@ std::vector<FormData> observed; observed.push_back(form_data); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Submit form and finish navigation. EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) @@ -2720,7 +2716,7 @@ OnPasswordFormSubmitted(form_data); observed.clear(); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // If there are no forms to parse, certificate errors should not be reported. @@ -2815,7 +2811,7 @@ std::vector<FormData> observed; observed.push_back(form_data); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); auto submitted_form_data = form_data; submitted_form_data.fields[0].value = u"username"; @@ -2834,10 +2830,10 @@ } else { EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); } - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Multiple calls of OnPasswordFormsRendered should be handled gracefully. - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); testing::Mock::VerifyAndClearExpectations(&client_); } } @@ -2856,7 +2852,7 @@ std::vector<FormData> observed; observed.push_back(form_data); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); manager()->OnInformAboutUserInput(&driver_, form_data); auto submitted_form_data = form_data; @@ -2880,7 +2876,7 @@ EXPECT_CALL(*store_, GetLogins(_, _)) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); @@ -2905,7 +2901,7 @@ EXPECT_CALL(client_, IsSavingAndFillingEnabled(form_data.url)) .WillRepeatedly(Return(true)); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); OnPasswordFormSubmitted(form_data); @@ -2916,7 +2912,7 @@ observed.clear(); base::HistogramTester histogram_tester; manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); histogram_tester.ExpectUniqueSample( "PasswordManager.SuccessfulLoginHappened", origin_is_secure, 1); } @@ -2936,7 +2932,7 @@ .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), stored_form))); EXPECT_CALL(driver_, FillPasswordForm(_)).Times(2); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // The username of the stored form is the same, there should be update bubble. std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save; @@ -3111,7 +3107,7 @@ } manager()->DidNavigateMainFrame(form_may_be_submitted); - manager()->OnPasswordFormsRendered(&driver_, {}, true); + manager()->OnPasswordFormsRendered(&driver_, {}); EXPECT_THAT(form_manager_to_save->GetPendingCredentials(), FormMatches(form)); @@ -3328,7 +3324,7 @@ .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save))); // The form disappeared, so the submission is considered to be successful. - manager()->OnPasswordFormsRendered(&driver_, {}, true); + manager()->OnPasswordFormsRendered(&driver_, {}); ASSERT_TRUE(form_manager_to_save); EXPECT_THAT(form_manager_to_save->GetPendingCredentials(), FormMatches(submitted_form)); @@ -3353,7 +3349,7 @@ EXPECT_FALSE(manager()->GetSubmittedManagerForTest()); EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); - manager()->OnPasswordFormsRendered(&driver_, {}, true); + manager()->OnPasswordFormsRendered(&driver_, {}); } // Check that on non-password form, saving and filling fallbacks are available @@ -3394,7 +3390,7 @@ OnPasswordFormSubmitted(credit_card_form.form_data); EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); manager()->DidNavigateMainFrame(true); - manager()->OnPasswordFormsRendered(&driver_, {}, true); + manager()->OnPasswordFormsRendered(&driver_, {}); } #if !BUILDFLAG(IS_IOS) @@ -3410,7 +3406,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); EXPECT_CALL(client_, IsSavingAndFillingEnabled).WillRepeatedly(Return(true)); OnPasswordFormSubmitted(form_data); @@ -3427,7 +3423,7 @@ // Now the password manager waits for the navigation to complete. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } #endif // !BUILDFLAG(IS_IOS) @@ -3559,7 +3555,7 @@ std::unique_ptr<PasswordFormManagerForUI> form_manager; EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)) .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager))); - manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, true); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */); ASSERT_TRUE(form_manager); // Simulate accepting the prompt and expect saving the new credential. @@ -3605,7 +3601,7 @@ std::unique_ptr<PasswordFormManagerForUI> form_manager; EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)) .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager))); - manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, true); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */); ASSERT_TRUE(form_manager); // Simulate accepting the prompt and expect updating the credential (without @@ -3730,15 +3726,14 @@ EXPECT_CALL(iframe_driver, IsInPrimaryMainFrame()) .WillRepeatedly(Return(false)); EXPECT_CALL(iframe_driver, GetId()).WillRepeatedly(Return(123)); - manager()->OnPasswordFormsRendered(&iframe_driver, {} /* observed */, true); + manager()->OnPasswordFormsRendered(&iframe_driver, {} /* observed */); EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); Mock::VerifyAndClearExpectations(&client_); // Simulate finish loading of some iframe. Check that the prompt is shown. EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)); EXPECT_CALL(client_, IsSavingAndFillingEnabled).WillRepeatedly(Return(true)); - manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, - true /* did stop loading */); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */); } TEST_P(PasswordManagerTest, FormSubmittedOnIFrame) { @@ -3759,8 +3754,7 @@ EXPECT_CALL(another_iframe_driver, IsInPrimaryMainFrame()) .WillRepeatedly(Return(false)); EXPECT_CALL(another_iframe_driver, GetId()).WillRepeatedly(Return(456)); - manager()->OnPasswordFormsRendered(&another_iframe_driver, {} /* observed */, - true); + manager()->OnPasswordFormsRendered(&another_iframe_driver, {} /* observed */); EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); Mock::VerifyAndClearExpectations(&client_); @@ -3768,8 +3762,7 @@ // is shown. EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)); EXPECT_CALL(client_, IsSavingAndFillingEnabled).WillRepeatedly(Return(true)); - manager()->OnPasswordFormsRendered(&iframe_driver, {} /* observed */, - true /* did stop loading */); + manager()->OnPasswordFormsRendered(&iframe_driver, {} /* observed */); } TEST_P(PasswordManagerTest, FormSubmittedOnIFramePrimaryMainFrameLoaded) { @@ -3787,8 +3780,7 @@ // Simulate finish loading of the main frame. Check that the prompt is shown. EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)); - manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, - true /* did stop loading */); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */); } TEST_P(PasswordManagerTest, NoPromptAutofillAssistantManuallyCuratedScript) { @@ -3809,8 +3801,7 @@ manager()->OnInformAboutUserInput(&driver_, form.form_data); manager()->DidNavigateMainFrame(true /* form_may_be_submitted */); - manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, - true /* did stop loading */); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */); } } @@ -3851,8 +3842,7 @@ // Manager detected a successful submission. As a script has finished, // pending credentials have reset. manager()->ResetPendingCredentials(); - manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, - true /* did stop loading */); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */); // No form manager is ready for saving. EXPECT_FALSE(manager()->GetSubmittedManagerForTest()); @@ -3869,8 +3859,7 @@ manager()->OnPasswordFormsParsed(&driver_, {form2.form_data}); OnPasswordFormSubmitted(form2.form_data); - manager()->OnPasswordFormsRendered(&driver_, {} /* observed */, - true /* did stop loading */); + manager()->OnPasswordFormsRendered(&driver_, {} /* observed */); Mock::VerifyAndClearExpectations(&client_); } } @@ -4149,7 +4138,7 @@ EXPECT_CALL(*store_, GetLogins) .WillOnce(WithArg<1>(InvokeConsumer(store_.get(), form))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Password was not updated yet. EXPECT_FALSE(manager()->IsFormManagerPendingPasswordUpdate()); @@ -4174,7 +4163,7 @@ EXPECT_CALL(*store_, GetLogins) .WillOnce(WithArg<1>(InvokeConsumer(store_.get(), form))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // The user updates the password and submits the form. FormData updated_data(form.form_data); @@ -4198,7 +4187,7 @@ EXPECT_CALL(*store_, GetLogins) .WillOnce(WithArg<1>(InvokeConsumer(store_.get(), form))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Password was not updated yet. EXPECT_FALSE(manager()->IsFormManagerPendingPasswordUpdate()); @@ -4237,7 +4226,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Test if visit is properly recorded and submission is not marked. histogram_tester.ExpectUniqueSample( @@ -4276,7 +4265,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get()))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // Test if visit is properly recorded and submission is not marked. histogram_tester.ExpectUniqueSample( @@ -4310,7 +4299,7 @@ PasswordForm observed_form(MakeSimpleForm()); std::vector<FormData> observed_forms = {observed_form.form_data}; manager()->OnPasswordFormsParsed(&driver_, observed_forms); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); EXPECT_CALL(client_, IsSavingAndFillingEnabled(observed_form.url)) .WillRepeatedly(Return(true)); OnPasswordFormSubmitted(observed_form.form_data); @@ -4319,7 +4308,7 @@ EXPECT_TRUE(manager()->GetSubmittedManagerForTest()); observed_forms.clear(); manager()->OnPasswordFormsParsed(&driver_, observed_forms); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); // There should be no submitted manager after the login detection. EXPECT_FALSE(manager()->GetSubmittedManagerForTest()); @@ -4338,7 +4327,7 @@ PasswordForm observed_form(MakeSimpleForm()); std::vector<FormData> observed_forms = {observed_form.form_data}; manager()->OnPasswordFormsParsed(&driver_, observed_forms); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); EXPECT_CALL(client_, IsSavingAndFillingEnabled(observed_form.url)) .WillRepeatedly(Return(true)); OnPasswordFormSubmitted(observed_form.form_data); @@ -4350,7 +4339,7 @@ observed_forms.clear(); manager()->OnPasswordFormsParsed(&driver_, observed_forms); - manager()->OnPasswordFormsRendered(&driver_, observed_forms, true); + manager()->OnPasswordFormsRendered(&driver_, observed_forms); } #endif // BUILDFLAG(IS_ANDROID) @@ -4368,7 +4357,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), form))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); task_environment_.RunUntilIdle(); @@ -4381,7 +4370,7 @@ // Now the password manager waits for the navigation to complete. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Tests that check for leaks happens even if there are muted credentials for @@ -4402,7 +4391,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), form))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); task_environment_.RunUntilIdle(); @@ -4417,7 +4406,7 @@ // Now the password manager waits for the navigation to complete. observed.clear(); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } // Check that a leak warning is not shown for a single username submission. @@ -4438,7 +4427,7 @@ EXPECT_CALL(*store_, GetLogins) .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), username_form))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // User submits the single username. No leak warning expected. OnPasswordFormSubmitted(username_form.form_data); @@ -4454,7 +4443,7 @@ InsecurityMetadata(base::Time(), IsMuted(false))}); observed = {password_form.form_data}; manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); // User submits the single password field. OnPasswordFormSubmitted(password_form.form_data); @@ -4465,7 +4454,7 @@ EXPECT_CALL(*weak_factory, TryCreateLeakCheck) .WillOnce(Return(ByMove(std::move(check_instance)))); manager()->OnPasswordFormsParsed(&driver_, observed); - manager()->OnPasswordFormsRendered(&driver_, observed, true); + manager()->OnPasswordFormsRendered(&driver_, observed); } TEST_P(PasswordManagerTest, ParsingNewFormsTriggersSettingFetch) {
diff --git a/components/password_manager/ios/shared_password_controller.mm b/components/password_manager/ios/shared_password_controller.mm index e36c05d0..f7d11ec 100644 --- a/components/password_manager/ios/shared_password_controller.mm +++ b/components/password_manager/ios/shared_password_controller.mm
@@ -577,7 +577,7 @@ // added elements to the form. if (!triggeredByFormChange) { _passwordManager->OnPasswordFormsRendered(_delegate.passwordManagerDriver, - forms, true); + forms); } }
diff --git a/components/password_manager/ios/shared_password_controller_unittest.mm b/components/password_manager/ios/shared_password_controller_unittest.mm index d5a56e3..fab74ba 100644 --- a/components/password_manager/ios/shared_password_controller_unittest.mm +++ b/components/password_manager/ios/shared_password_controller_unittest.mm
@@ -54,9 +54,7 @@ (override)); MOCK_METHOD(void, OnPasswordFormsRendered, - (PasswordManagerDriver*, - const std::vector<autofill::FormData>&, - bool), + (PasswordManagerDriver*, const std::vector<autofill::FormData>&), (override)); MOCK_METHOD(void, OnPasswordFormSubmitted,
diff --git a/components/payments/content/android/jni_payment_app.cc b/components/payments/content/android/jni_payment_app.cc index a4660ce..601e7d09 100644 --- a/components/payments/content/android/jni_payment_app.cc +++ b/components/payments/content/android/jni_payment_app.cc
@@ -66,6 +66,8 @@ payment_app_->GetAppMethodNames().end())); } +// TODO(crbug.com/1209835): Remove jdata_byte_buffer here, as it is no longer +// used. bool JniPaymentApp::IsValidForPaymentMethodData( JNIEnv* env, const JavaParamRef<jstring>& jmethod, @@ -84,9 +86,7 @@ PaymentMethodData data = ConvertPaymentMethodData(mojo_data); return payment_app_->IsValidForModifier( - ConvertJavaStringToUTF8(env, jmethod), !data.supported_networks.empty(), - std::set<std::string>(data.supported_networks.begin(), - data.supported_networks.end())); + ConvertJavaStringToUTF8(env, jmethod)); } bool JniPaymentApp::HandlesShippingAddress(JNIEnv* env) {
diff --git a/components/payments/content/android/payment_app_service_bridge.cc b/components/payments/content/android/payment_app_service_bridge.cc index d7d7ebe..0e40b20 100644 --- a/components/payments/content/android/payment_app_service_bridge.cc +++ b/components/payments/content/android/payment_app_service_bridge.cc
@@ -91,6 +91,8 @@ const JavaParamRef<jstring>& jtop_origin, const JavaParamRef<jobject>& jpayment_request_spec, const JavaParamRef<jstring>& jtwa_package_name, + // TODO(crbug.com/1209835): Remove jmay_crawl_for_installable_payment_apps, + // as it is no longer used. jboolean jmay_crawl_for_installable_payment_apps, jboolean jis_off_the_record, const JavaParamRef<jobject>& jcallback) { @@ -117,8 +119,7 @@ payments::android::PaymentRequestSpec::FromJavaPaymentRequestSpec( env, jpayment_request_spec), jtwa_package_name ? ConvertJavaStringToUTF8(env, jtwa_package_name) : "", - web_data_service, jmay_crawl_for_installable_payment_apps, - jis_off_the_record, + web_data_service, jis_off_the_record, base::BindOnce(&OnCanMakePaymentCalculated, ScopedJavaGlobalRef<jobject>(env, jcallback)), base::BindRepeating(&OnPaymentAppCreated, @@ -175,7 +176,6 @@ base::WeakPtr<PaymentRequestSpec> spec, const std::string& twa_package_name, scoped_refptr<PaymentManifestWebDataService> web_data_service, - bool may_crawl_for_installable_payment_apps, bool is_off_the_record, CanMakePaymentCalculatedCallback can_make_payment_calculated_callback, PaymentAppCreatedCallback payment_app_created_callback, @@ -186,8 +186,7 @@ // Not using std::make_unique, because that requires a public constructor. std::unique_ptr<PaymentAppServiceBridge> bridge(new PaymentAppServiceBridge( number_of_factories, render_frame_host, top_origin, spec, - twa_package_name, std::move(web_data_service), - may_crawl_for_installable_payment_apps, is_off_the_record, + twa_package_name, std::move(web_data_service), is_off_the_record, std::move(can_make_payment_calculated_callback), std::move(payment_app_created_callback), std::move(payment_app_creation_error_callback), @@ -203,7 +202,6 @@ base::WeakPtr<PaymentRequestSpec> spec, const std::string& twa_package_name, scoped_refptr<PaymentManifestWebDataService> web_data_service, - bool may_crawl_for_installable_payment_apps, bool is_off_the_record, CanMakePaymentCalculatedCallback can_make_payment_calculated_callback, PaymentAppCreatedCallback payment_app_created_callback, @@ -219,8 +217,6 @@ spec_(spec), twa_package_name_(twa_package_name), payment_manifest_web_data_service_(web_data_service), - may_crawl_for_installable_payment_apps_( - may_crawl_for_installable_payment_apps), is_off_the_record_(is_off_the_record), can_make_payment_calculated_callback_( std::move(can_make_payment_calculated_callback)), @@ -294,10 +290,6 @@ return payment_manifest_web_data_service_; } -bool PaymentAppServiceBridge::MayCrawlForInstallablePaymentApps() { - return may_crawl_for_installable_payment_apps_; -} - bool PaymentAppServiceBridge::IsOffTheRecord() const { return is_off_the_record_; }
diff --git a/components/payments/content/android/payment_app_service_bridge.h b/components/payments/content/android/payment_app_service_bridge.h index 8d73bb4..55fe517e 100644 --- a/components/payments/content/android/payment_app_service_bridge.h +++ b/components/payments/content/android/payment_app_service_bridge.h
@@ -48,7 +48,6 @@ base::WeakPtr<PaymentRequestSpec> spec, const std::string& twa_package_name, scoped_refptr<PaymentManifestWebDataService> web_data_service, - bool may_crawl_for_installable_payment_apps, bool is_off_the_record, CanMakePaymentCalculatedCallback can_make_payment_calculated_callback, PaymentAppCreatedCallback payment_app_created_callback, @@ -78,7 +77,6 @@ const override; scoped_refptr<PaymentManifestWebDataService> GetPaymentManifestWebDataService() const override; - bool MayCrawlForInstallablePaymentApps() override; bool IsOffTheRecord() const override; const std::vector<autofill::AutofillProfile*>& GetBillingProfiles() override; bool IsRequestedAutofillDataAvailable() override; @@ -105,7 +103,6 @@ base::WeakPtr<PaymentRequestSpec> spec, const std::string& twa_package_name, scoped_refptr<PaymentManifestWebDataService> web_data_service, - bool may_crawl_for_installable_payment_apps, bool is_off_the_record, CanMakePaymentCalculatedCallback can_make_payment_calculated_callback, PaymentAppCreatedCallback payment_app_created_callback, @@ -122,7 +119,6 @@ const std::string twa_package_name_; scoped_refptr<PaymentManifestWebDataService> payment_manifest_web_data_service_; - bool may_crawl_for_installable_payment_apps_; bool is_off_the_record_; std::vector<autofill::AutofillProfile*> dummy_profiles_;
diff --git a/components/payments/content/android_payment_app.cc b/components/payments/content/android_payment_app.cc index a029b87..302b430 100644 --- a/components/payments/content/android_payment_app.cc +++ b/components/payments/content/android_payment_app.cc
@@ -117,10 +117,7 @@ return nullptr; } -bool AndroidPaymentApp::IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const { +bool AndroidPaymentApp::IsValidForModifier(const std::string& method) const { bool is_valid = false; IsValidForPaymentMethodIdentifier(method, &is_valid); return is_valid;
diff --git a/components/payments/content/android_payment_app.h b/components/payments/content/android_payment_app.h index 2d1f944..e85e8f9 100644 --- a/components/payments/content/android_payment_app.h +++ b/components/payments/content/android_payment_app.h
@@ -61,10 +61,7 @@ std::u16string GetLabel() const override; std::u16string GetSublabel() const override; const SkBitmap* icon_bitmap() const override; - bool IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const override; + bool IsValidForModifier(const std::string& method) const override; base::WeakPtr<PaymentApp> AsWeakPtr() override; bool HandlesShippingAddress() const override; bool HandlesPayerName() const override;
diff --git a/components/payments/content/payment_app.h b/components/payments/content/payment_app.h index bae20dee..3b8ffd85 100644 --- a/components/payments/content/payment_app.h +++ b/components/payments/content/payment_app.h
@@ -110,14 +110,8 @@ const; // Returns true if this payment app can be used to fulfill a request - // specifying |method| as supported method of payment. The parsed basic-card - // specific data (supported_networks) is relevant only for the - // AutofillPaymentApp, which runs inside of the browser process and thus - // should not be parsing untrusted JSON strings from the renderer. - virtual bool IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const = 0; + // specifying |method| as supported method of payment. + virtual bool IsValidForModifier(const std::string& method) const = 0; // Sets |is_valid| to true if this payment app can handle payments for the // given |payment_method_identifier|. The |is_valid| is an out-param instead
diff --git a/components/payments/content/payment_app_factory.h b/components/payments/content/payment_app_factory.h index 64f17f5a..842e805 100644 --- a/components/payments/content/payment_app_factory.h +++ b/components/payments/content/payment_app_factory.h
@@ -78,7 +78,6 @@ CreateInternalAuthenticator() const = 0; virtual scoped_refptr<PaymentManifestWebDataService> GetPaymentManifestWebDataService() const = 0; - virtual bool MayCrawlForInstallablePaymentApps() = 0; virtual bool IsOffTheRecord() const = 0; // Returns the merchant provided information, or null if the payment is
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc index 5e9e269..5e0dbbd 100644 --- a/components/payments/content/payment_request.cc +++ b/components/payments/content/payment_request.cc
@@ -221,13 +221,6 @@ url != google_play_billing_url; }); std::vector<JourneyLogger::PaymentMethodCategory> method_categories; - // Note that only a test can add autofill payment apps when basic-card - // feature is disabled. - if (base::FeatureList::IsEnabled(::features::kPaymentRequestBasicCard) && - !spec_->supported_card_networks().empty()) { - method_categories.push_back( - JourneyLogger::PaymentMethodCategory::kBasicCard); - } if (base::Contains(spec_->url_payment_method_identifiers(), google_pay_url) || base::Contains(spec_->url_payment_method_identifiers(), android_pay_url)) {
diff --git a/components/payments/content/payment_request_spec.cc b/components/payments/content/payment_request_spec.cc index 3253e67d..858924f9 100644 --- a/components/payments/content/payment_request_spec.cc +++ b/components/payments/content/payment_request_spec.cc
@@ -30,31 +30,7 @@ // Validates the |method_data| and fills the output parameters. void PopulateValidatedMethodData( - const std::vector<PaymentMethodData>& method_data_vector, - std::vector<std::string>* supported_card_networks, - std::set<std::string>* basic_card_specified_networks, - std::set<std::string>* supported_card_networks_set, - std::vector<GURL>* url_payment_method_identifiers, - std::set<std::string>* payment_method_identifiers_set, - std::map<std::string, std::set<std::string>>* stringified_method_data) { - data_util::ParseSupportedMethods(method_data_vector, supported_card_networks, - basic_card_specified_networks, - url_payment_method_identifiers, - payment_method_identifiers_set); - if (!base::FeatureList::IsEnabled(::features::kPaymentRequestBasicCard)) { - // Clears the basic-card related items that ParseSupportedMethods() added. - supported_card_networks->clear(); - basic_card_specified_networks->clear(); - } - supported_card_networks_set->insert(supported_card_networks->begin(), - supported_card_networks->end()); -} - -void PopulateValidatedMethodData( const std::vector<mojom::PaymentMethodDataPtr>& method_data_mojom, - std::vector<std::string>* supported_card_networks, - std::set<std::string>* basic_card_specified_networks, - std::set<std::string>* supported_card_networks_set, std::vector<GURL>* url_payment_method_identifiers, std::set<std::string>* payment_method_identifiers_set, std::map<std::string, std::set<std::string>>* stringified_method_data) { @@ -68,11 +44,9 @@ method_data_vector.push_back(ConvertPaymentMethodData(method_data_entry)); } - PopulateValidatedMethodData( - method_data_vector, supported_card_networks, - basic_card_specified_networks, supported_card_networks_set, - url_payment_method_identifiers, payment_method_identifiers_set, - stringified_method_data); + data_util::ParseSupportedMethods(method_data_vector, + url_payment_method_identifiers, + payment_method_identifiers_set); } } // namespace @@ -98,10 +72,9 @@ if (!details_->modifiers) details_->modifiers = std::vector<mojom::PaymentDetailsModifierPtr>(); UpdateSelectedShippingOption(/*after_update=*/false); - PopulateValidatedMethodData( - method_data_, &supported_card_networks_, &basic_card_specified_networks_, - &supported_card_networks_set_, &url_payment_method_identifiers_, - &payment_method_identifiers_set_, &stringified_method_data_); + PopulateValidatedMethodData(method_data_, &url_payment_method_identifiers_, + &payment_method_identifiers_set_, + &stringified_method_data_); query_for_quota_ = stringified_method_data_; @@ -284,11 +257,6 @@ return PaymentShippingType::SHIPPING; } -bool PaymentRequestSpec::IsMethodSupportedThroughBasicCard( - const std::string& method_name) { - return basic_card_specified_networks_.count(method_name) > 0; -} - std::u16string PaymentRequestSpec::GetFormattedCurrencyAmount( const mojom::PaymentCurrencyAmountPtr& currency_amount) { CurrencyFormatter* formatter = @@ -379,23 +347,8 @@ DCHECK(details_->modifiers); for (const auto& modifier : *details_->modifiers) { - std::set<std::string> supported_card_networks_set; - // The following 4 are unused but required by PopulateValidatedMethodData. - std::set<std::string> basic_card_specified_networks; - std::vector<std::string> supported_networks; - std::vector<GURL> url_payment_method_identifiers; - std::set<std::string> payment_method_identifiers_set; - std::map<std::string, std::set<std::string>> stringified_method_data; - PopulateValidatedMethodData( - {ConvertPaymentMethodData(modifier->method_data)}, &supported_networks, - &basic_card_specified_networks, &supported_card_networks_set, - &url_payment_method_identifiers, &payment_method_identifiers_set, - &stringified_method_data); - if (selected_app->IsValidForModifier( - modifier->method_data->supported_method, - !modifier->method_data->supported_networks.empty(), - supported_card_networks_set)) { + modifier->method_data->supported_method)) { return &modifier; } }
diff --git a/components/payments/content/payment_request_spec.h b/components/payments/content/payment_request_spec.h index 097b6a8..359df288 100644 --- a/components/payments/content/payment_request_spec.h +++ b/components/payments/content/payment_request_spec.h
@@ -13,7 +13,6 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" -#include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/field_types.h" #include "components/payments/content/initialization_task.h" #include "components/payments/core/currency_formatter.h" @@ -131,14 +130,6 @@ return query_for_quota_; } - bool supports_basic_card() const { return !supported_card_networks_.empty(); } - - const std::vector<std::string>& supported_card_networks() const { - return supported_card_networks_; - } - const std::set<std::string>& supported_card_networks_set() const { - return supported_card_networks_set_; - } const std::map<std::string, std::set<std::string>>& stringified_method_data() const { return stringified_method_data_; @@ -149,10 +140,6 @@ const std::set<std::string>& payment_method_identifiers_set() const { return payment_method_identifiers_set_; } - // Returns whether the |method_name| was specified as supported through the - // "basic-card" payment method. If false, it means either the |method_name| is - // not supported at all, or specified directly in supportedMethods. - bool IsMethodSupportedThroughBasicCard(const std::string& method_name); // Uses CurrencyFormatter to format the value of |currency_amount| with the // currency symbol for its currency. @@ -246,20 +233,8 @@ // One currency formatter is instantiated and cached per currency code. std::map<std::string, CurrencyFormatter> currency_formatters_; - // A list/set of supported basic card networks. The list is used to keep the - // order in which they were specified by the merchant. The set is used for - // fast lookup of supported methods. - std::vector<std::string> supported_card_networks_; - std::set<std::string> supported_card_networks_set_; - - // Only the set of basic-card specified networks. NOTE: callers should use - // |supported_card_networks_set_| to check merchant support. - std::set<std::string> basic_card_specified_networks_; - // A list of supported url-based payment method identifiers specified by the - // merchant. This encompasses one of the two types of payment method - // identifiers, the other being standardized payment method identifiers i.e., - // basic-card. + // merchant. std::vector<GURL> url_payment_method_identifiers_; // The set of all payment method identifiers.
diff --git a/components/payments/content/payment_request_spec_unittest.cc b/components/payments/content/payment_request_spec_unittest.cc index dd75449..c0769a5 100644 --- a/components/payments/content/payment_request_spec_unittest.cc +++ b/components/payments/content/payment_request_spec_unittest.cc
@@ -71,224 +71,6 @@ base::test::ScopedFeatureList feature_list_; }; -// Test that empty method data is parsed correctly. -TEST_F(PaymentRequestSpecBasiCardEnabledTest, EmptyMethodData) { - std::vector<mojom::PaymentMethodDataPtr> method_data; - RecreateSpecWithMethodData(std::move(method_data)); - - // No supported card networks. - EXPECT_EQ(0u, spec()->supported_card_networks().size()); -} - -TEST_F(PaymentRequestSpecBasiCardEnabledTest, - IsMethodSupportedThroughBasicCard) { - mojom::PaymentMethodDataPtr entry1 = mojom::PaymentMethodData::New(); - entry1->supported_method = "visa"; - mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New(); - entry2->supported_method = "mastercard"; - mojom::PaymentMethodDataPtr entry3 = mojom::PaymentMethodData::New(); - entry3->supported_method = "invalid"; - mojom::PaymentMethodDataPtr entry4 = mojom::PaymentMethodData::New(); - entry4->supported_method = "visa"; - mojom::PaymentMethodDataPtr entry5 = mojom::PaymentMethodData::New(); - entry5->supported_method = "basic-card"; - entry5->supported_networks.push_back(mojom::BasicCardNetwork::UNIONPAY); - entry5->supported_networks.push_back(mojom::BasicCardNetwork::JCB); - entry5->supported_networks.push_back(mojom::BasicCardNetwork::VISA); - - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry1)); - method_data.push_back(std::move(entry2)); - method_data.push_back(std::move(entry3)); - method_data.push_back(std::move(entry4)); - method_data.push_back(std::move(entry5)); - - RecreateSpecWithMethodData(std::move(method_data)); - - // unionpay and jcb are supported through basic-card. visa is supported - // through basic card because it was specified in basic-card in addition to - // supportedMethods. - EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("unionpay")); - EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("jcb")); - EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("visa")); - EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("mastercard")); - EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("diners")); - EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("garbage")); -} - -// Order matters when parsing the supportedMethods and basic card networks. -TEST_F(PaymentRequestSpecBasiCardEnabledTest, - IsMethodSupportedThroughBasicCard_DifferentOrder) { - mojom::PaymentMethodDataPtr entry1 = mojom::PaymentMethodData::New(); - entry1->supported_method = "basic-card"; - entry1->supported_networks.push_back(mojom::BasicCardNetwork::UNIONPAY); - entry1->supported_networks.push_back(mojom::BasicCardNetwork::VISA); - mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New(); - entry2->supported_method = "visa"; - mojom::PaymentMethodDataPtr entry3 = mojom::PaymentMethodData::New(); - entry3->supported_method = "unionpay"; - mojom::PaymentMethodDataPtr entry4 = mojom::PaymentMethodData::New(); - entry4->supported_method = "jcb"; - - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry1)); - method_data.push_back(std::move(entry2)); - method_data.push_back(std::move(entry3)); - method_data.push_back(std::move(entry4)); - - RecreateSpecWithMethodData(std::move(method_data)); - - // unionpay and visa are supported through basic-card; they were specified - // first as basic card networks. - EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("unionpay")); - EXPECT_TRUE(spec()->IsMethodSupportedThroughBasicCard("visa")); - // "jcb" is NOT supported through basic card; it was specified directly - // as a supportedMethods - EXPECT_FALSE(spec()->IsMethodSupportedThroughBasicCard("jcb")); -} - -// Test that parsing supported methods (with invalid values and duplicates) -// works as expected. -TEST_F(PaymentRequestSpecBasiCardEnabledTest, SupportedMethods) { - mojom::PaymentMethodDataPtr entry1 = mojom::PaymentMethodData::New(); - entry1->supported_method = "basic-card"; - entry1->supported_networks.push_back(mojom::BasicCardNetwork::VISA); - mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New(); - entry2->supported_method = "mastercard"; - mojom::PaymentMethodDataPtr entry3 = mojom::PaymentMethodData::New(); - entry3->supported_method = "invalid"; - mojom::PaymentMethodDataPtr entry4 = mojom::PaymentMethodData::New(); - entry4->supported_method = ""; - mojom::PaymentMethodDataPtr entry5 = mojom::PaymentMethodData::New(); - entry5->supported_method = "basic-card"; - entry5->supported_networks.push_back(mojom::BasicCardNetwork::VISA); - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry1)); - method_data.push_back(std::move(entry2)); - method_data.push_back(std::move(entry3)); - method_data.push_back(std::move(entry4)); - method_data.push_back(std::move(entry5)); - - RecreateSpecWithMethodData(std::move(method_data)); - - // Card networks are not valid |supported_method| so only 'visa' is left. - EXPECT_THAT(spec()->supported_card_networks(), ElementsAre("visa")); -} - -// Test that parsing supported methods in different method data entries fails as -// soon as one entry doesn't specify anything in supported_methods. -TEST_F(PaymentRequestSpecBasiCardEnabledTest, - SupportedMethods_MultipleEntries_OneEmpty) { - // First entry is valid. - mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New(); - entry->supported_method = "basic-card"; - entry->supported_networks.push_back(mojom::BasicCardNetwork::VISA); - // Empty method data entry. - mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New(); - // Valid one follows the empty. - mojom::PaymentMethodDataPtr entry3 = mojom::PaymentMethodData::New(); - entry3->supported_method = "mastercard"; - - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry)); - method_data.push_back(std::move(entry2)); - method_data.push_back(std::move(entry3)); - - RecreateSpecWithMethodData(std::move(method_data)); - - // Visa was parsed, but not mastercard. - EXPECT_EQ(1u, spec()->supported_card_networks().size()); - EXPECT_EQ("visa", spec()->supported_card_networks()[0]); -} - -// Test that only specifying basic-card means that all are supported. -TEST_F(PaymentRequestSpecBasiCardEnabledTest, SupportedMethods_OnlyBasicCard) { - mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New(); - entry->supported_method = "basic-card"; - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry)); - - RecreateSpecWithMethodData(std::move(method_data)); - - // All of the basic card networks are supported. - EXPECT_EQ(8u, spec()->supported_card_networks().size()); - EXPECT_EQ("amex", spec()->supported_card_networks()[0]); - EXPECT_EQ("diners", spec()->supported_card_networks()[1]); - EXPECT_EQ("discover", spec()->supported_card_networks()[2]); - EXPECT_EQ("jcb", spec()->supported_card_networks()[3]); - EXPECT_EQ("mastercard", spec()->supported_card_networks()[4]); - EXPECT_EQ("mir", spec()->supported_card_networks()[5]); - EXPECT_EQ("unionpay", spec()->supported_card_networks()[6]); - EXPECT_EQ("visa", spec()->supported_card_networks()[7]); -} - -// Test that specifying a method AND basic-card means that all are supported, -// but with the method as first. -TEST_F(PaymentRequestSpecBasiCardEnabledTest, - SupportedMethods_BasicCard_WithSpecificMethod) { - mojom::PaymentMethodDataPtr entry1 = mojom::PaymentMethodData::New(); - entry1->supported_method = "jcb"; - mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New(); - entry2->supported_method = "basic-card"; - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry1)); - method_data.push_back(std::move(entry2)); - - RecreateSpecWithMethodData(std::move(method_data)); - - // All of the basic card networks are supported, but JCB is first because it - // was specified first. - EXPECT_EQ(8u, spec()->supported_card_networks().size()); - EXPECT_THAT(spec()->supported_card_networks(), - UnorderedElementsAre("jcb", "amex", "diners", "discover", - "mastercard", "mir", "unionpay", "visa")); -} - -// Test that specifying basic-card with a supported network (with previous -// supported methods) will work as expected -TEST_F(PaymentRequestSpecBasiCardEnabledTest, - SupportedMethods_BasicCard_Overlap) { - mojom::PaymentMethodDataPtr entry1 = mojom::PaymentMethodData::New(); - entry1->supported_method = "mastercard"; - mojom::PaymentMethodDataPtr entry2 = mojom::PaymentMethodData::New(); - entry2->supported_method = "visa"; - // Visa and mastercard are repeated, but in reverse order. - mojom::PaymentMethodDataPtr entry3 = mojom::PaymentMethodData::New(); - entry3->supported_method = "basic-card"; - entry3->supported_networks.push_back(mojom::BasicCardNetwork::VISA); - entry3->supported_networks.push_back(mojom::BasicCardNetwork::MASTERCARD); - entry3->supported_networks.push_back(mojom::BasicCardNetwork::UNIONPAY); - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry1)); - method_data.push_back(std::move(entry2)); - method_data.push_back(std::move(entry3)); - - RecreateSpecWithMethodData(std::move(method_data)); - - EXPECT_EQ(3u, spec()->supported_card_networks().size()); - EXPECT_THAT(spec()->supported_card_networks(), - ElementsAre("visa", "mastercard", "unionpay")); -} - -// Test that specifying basic-card with supported networks after specifying -// some methods -TEST_F(PaymentRequestSpecBasiCardEnabledTest, - SupportedMethods_BasicCard_WithSupportedNetworks) { - mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New(); - entry->supported_method = "basic-card"; - entry->supported_networks.push_back(mojom::BasicCardNetwork::VISA); - entry->supported_networks.push_back(mojom::BasicCardNetwork::UNIONPAY); - std::vector<mojom::PaymentMethodDataPtr> method_data; - method_data.push_back(std::move(entry)); - - RecreateSpecWithMethodData(std::move(method_data)); - - // Only the specified networks are supported. - EXPECT_EQ(2u, spec()->supported_card_networks().size()); - EXPECT_EQ("visa", spec()->supported_card_networks()[0]); - EXPECT_EQ("unionpay", spec()->supported_card_networks()[1]); -} - // Test that the last shipping option is selected, even in the case of // updateWith. TEST_F(PaymentRequestSpecBasiCardEnabledTest, ShippingOptionsSelection) {
diff --git a/components/payments/content/payment_request_state.cc b/components/payments/content/payment_request_state.cc index db01fae..44e32ed 100644 --- a/components/payments/content/payment_request_state.cc +++ b/components/payments/content/payment_request_state.cc
@@ -80,8 +80,6 @@ delegate_(delegate), journey_logger_(journey_logger), personal_data_manager_(personal_data_manager), - are_requested_methods_supported_( - !spec_->supported_card_networks().empty()), payment_request_delegate_(payment_request_delegate), profile_comparator_(app_locale, *spec) { PopulateProfileCache(); @@ -166,10 +164,6 @@ return is_requested_autofill_data_available_; } -bool PaymentRequestState::MayCrawlForInstallablePaymentApps() { - return !spec_ || !spec_->supports_basic_card(); -} - bool PaymentRequestState::IsOffTheRecord() const { return GetPaymentRequestDelegate()->IsOffTheRecord(); } @@ -676,20 +670,6 @@ UpdateIsReadyToPayAndNotifyObservers(); } - // Record the missing required payment fields when no complete payment - // info exists. - if (available_apps_.empty()) { - if (spec_ && spec_->supports_basic_card()) { - // All fields are missing when basic-card is requested but no card exits. - base::UmaHistogramSparse("PaymentRequest.MissingPaymentFields", - CREDIT_CARD_EXPIRED | CREDIT_CARD_NO_CARDHOLDER | - CREDIT_CARD_NO_NUMBER | - CREDIT_CARD_NO_BILLING_ADDRESS); - } - } else if (available_apps_[0]->type() == PaymentApp::Type::AUTOFILL) { - NOTREACHED() << "Autofill app shouldn't be available"; - } - SelectDefaultShippingAddressAndNotifyObservers(); if (journey_logger_) {
diff --git a/components/payments/content/payment_request_state.h b/components/payments/content/payment_request_state.h index 3a243e1..3f8cbf4 100644 --- a/components/payments/content/payment_request_state.h +++ b/components/payments/content/payment_request_state.h
@@ -137,7 +137,6 @@ GetPaymentManifestWebDataService() const override; const std::vector<autofill::AutofillProfile*>& GetBillingProfiles() override; bool IsRequestedAutofillDataAvailable() override; - bool MayCrawlForInstallablePaymentApps() override; bool IsOffTheRecord() const override; void OnPaymentAppCreated(std::unique_ptr<PaymentApp> app) override; void OnPaymentAppCreationError(
diff --git a/components/payments/content/payment_response_helper.cc b/components/payments/content/payment_response_helper.cc index cb11a2c..0f55d87 100644 --- a/components/payments/content/payment_response_helper.cc +++ b/components/payments/content/payment_response_helper.cc
@@ -171,14 +171,7 @@ mojom::PaymentResponsePtr payment_response = mojom::PaymentResponse::New(); - // Make sure that we return the method name that the merchant specified for - // this app: cards can be either specified through their name (e.g., "visa") - // or through basic-card's supportedNetworks. - payment_response->method_name = - base::FeatureList::IsEnabled(::features::kPaymentRequestBasicCard) && - spec_->IsMethodSupportedThroughBasicCard(method_name_) - ? methods::kBasicCard - : method_name_; + payment_response->method_name = method_name_; payment_response->stringified_details = stringified_details_; // Shipping Address section
diff --git a/components/payments/content/secure_payment_confirmation_app.cc b/components/payments/content/secure_payment_confirmation_app.cc index c3085027..70af460 100644 --- a/components/payments/content/secure_payment_confirmation_app.cc +++ b/components/payments/content/secure_payment_confirmation_app.cc
@@ -164,9 +164,7 @@ } bool SecurePaymentConfirmationApp::IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const { + const std::string& method) const { bool is_valid = false; IsValidForPaymentMethodIdentifier(method, &is_valid); return is_valid;
diff --git a/components/payments/content/secure_payment_confirmation_app.h b/components/payments/content/secure_payment_confirmation_app.h index ca7381b..ed30177 100644 --- a/components/payments/content/secure_payment_confirmation_app.h +++ b/components/payments/content/secure_payment_confirmation_app.h
@@ -78,10 +78,7 @@ std::u16string GetLabel() const override; std::u16string GetSublabel() const override; const SkBitmap* icon_bitmap() const override; - bool IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const override; + bool IsValidForModifier(const std::string& method) const override; base::WeakPtr<PaymentApp> AsWeakPtr() override; bool HandlesShippingAddress() const override; bool HandlesPayerName() const override;
diff --git a/components/payments/content/service_worker_payment_app.cc b/components/payments/content/service_worker_payment_app.cc index 80e064c..60a2b73 100644 --- a/components/payments/content/service_worker_payment_app.cc +++ b/components/payments/content/service_worker_payment_app.cc
@@ -430,9 +430,7 @@ } bool ServiceWorkerPaymentApp::IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const { + const std::string& method) const { // Payment app that needs installation only supports url based payment // methods. if (needs_installation_) @@ -440,49 +438,7 @@ bool is_valid = false; IsValidForPaymentMethodIdentifier(method, &is_valid); - if (!is_valid) - return false; - - // Return true if 'basic-card' is not the only matched payment method. This - // assumes that there is no duplicated payment methods. - if (method != methods::kBasicCard) - return true; - - if (!base::FeatureList::IsEnabled(::features::kPaymentRequestBasicCard)) - return false; - - // Checking the capabilities of this app against the modifier. - // Return true if card networks are not specified in the modifier. - if (!supported_networks_specified) - return true; - - // Return false if no capabilities for this app. - if (stored_payment_app_info_->capabilities.empty()) - return false; - - uint32_t i = 0; - for (; i < stored_payment_app_info_->capabilities.size(); i++) { - if (supported_networks_specified) { - std::set<std::string> app_supported_networks; - for (const auto& network : - stored_payment_app_info_->capabilities[i].supported_card_networks) { - app_supported_networks.insert(GetBasicCardNetworkName( - static_cast<mojom::BasicCardNetwork>(network))); - } - - if (base::STLSetIntersection<std::set<std::string>>( - app_supported_networks, supported_networks) - .empty()) { - continue; - } - } - - break; - } - - // i >= stored_payment_app_info_->capabilities.size() indicates no matched - // capabilities. - return i < stored_payment_app_info_->capabilities.size(); + return is_valid; } base::WeakPtr<PaymentApp> ServiceWorkerPaymentApp::AsWeakPtr() {
diff --git a/components/payments/content/service_worker_payment_app.h b/components/payments/content/service_worker_payment_app.h index cfab3daf..ad0aad4 100644 --- a/components/payments/content/service_worker_payment_app.h +++ b/components/payments/content/service_worker_payment_app.h
@@ -90,10 +90,7 @@ std::string GetId() const override; std::u16string GetLabel() const override; std::u16string GetSublabel() const override; - bool IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const override; + bool IsValidForModifier(const std::string& method) const override; base::WeakPtr<PaymentApp> AsWeakPtr() override; const SkBitmap* icon_bitmap() const override; std::set<std::string> GetApplicationIdentifiersThatHideThisApp()
diff --git a/components/payments/content/service_worker_payment_app_factory.cc b/components/payments/content/service_worker_payment_app_factory.cc index 64f1591..38722c6 100644 --- a/components/payments/content/service_worker_payment_app_factory.cc +++ b/components/payments/content/service_worker_payment_app_factory.cc
@@ -191,7 +191,6 @@ delegate->GetFrameSecurityOrigin(), delegate->GetPaymentManifestWebDataService(), mojo::Clone(delegate->GetMethodData()), - delegate->MayCrawlForInstallablePaymentApps(), base::BindOnce(&ServiceWorkerPaymentAppCreator::CreatePaymentApps, creator_raw_pointer->GetWeakPtr()), base::BindOnce([]() {
diff --git a/components/payments/content/service_worker_payment_app_finder.cc b/components/payments/content/service_worker_payment_app_finder.cc index 7bd1d2c5..8b43425 100644 --- a/components/payments/content/service_worker_payment_app_finder.cc +++ b/components/payments/content/service_worker_payment_app_finder.cc
@@ -133,7 +133,6 @@ std::unique_ptr<PaymentManifestDownloader> downloader, scoped_refptr<PaymentManifestWebDataService> cache, const std::vector<mojom::PaymentMethodDataPtr>& requested_method_data, - bool may_crawl_for_installable_payment_apps, ServiceWorkerPaymentAppFinder::GetAllPaymentAppsCallback callback, base::OnceClosure finished_using_resources_callback) { DCHECK(!verifier_); @@ -150,8 +149,7 @@ verifier_ = std::make_unique<ManifestVerifier>( merchant_origin, web_contents, downloader_.get(), parser_.get(), cache_.get()); - if (may_crawl_for_installable_payment_apps && - base::FeatureList::IsEnabled( + if (base::FeatureList::IsEnabled( features::kWebPaymentsJustInTimePaymentApp)) { crawler_ = std::make_unique<InstallablePaymentAppCrawler>( merchant_origin, initiator_render_frame_host, downloader_.get(), @@ -408,7 +406,6 @@ const url::Origin& merchant_origin, scoped_refptr<PaymentManifestWebDataService> cache, std::vector<mojom::PaymentMethodDataPtr> requested_method_data, - bool may_crawl_for_installable_payment_apps, GetAllPaymentAppsCallback callback, base::OnceClosure finished_writing_cache_callback_for_testing) { DCHECK(!requested_method_data.empty()); @@ -451,8 +448,7 @@ self_delete_factory->GetAllPaymentApps( merchant_origin, &render_frame_host(), std::move(downloader), cache, - requested_method_data, may_crawl_for_installable_payment_apps, - std::move(callback), + requested_method_data, std::move(callback), std::move(finished_writing_cache_callback_for_testing)); }
diff --git a/components/payments/content/service_worker_payment_app_finder.h b/components/payments/content/service_worker_payment_app_finder.h index f7c5fd69..9b060b2 100644 --- a/components/payments/content/service_worker_payment_app_finder.h +++ b/components/payments/content/service_worker_payment_app_finder.h
@@ -74,7 +74,6 @@ const url::Origin& merchant_origin, scoped_refptr<PaymentManifestWebDataService> cache, std::vector<mojom::PaymentMethodDataPtr> requested_method_data, - bool may_crawl_for_installable_payment_apps, GetAllPaymentAppsCallback callback, base::OnceClosure finished_writing_cache_callback_for_testing);
diff --git a/components/payments/content/service_worker_payment_app_unittest.cc b/components/payments/content/service_worker_payment_app_unittest.cc index a4696c0c..14ff6ad 100644 --- a/components/payments/content/service_worker_payment_app_unittest.cc +++ b/components/payments/content/service_worker_payment_app_unittest.cc
@@ -100,7 +100,27 @@ void TearDown() override {} - void CreateServiceWorkerPaymentApp(bool with_url_method) { + void CreateInstallableServiceWorkerPaymentApp() { + constexpr int kBitmapDimension = 16; + + std::unique_ptr<WebAppInstallationInfo> app_info = + std::make_unique<WebAppInstallationInfo>(); + app_info->name = "bobpay"; + app_info->sw_js_url = "sw.js"; + app_info->sw_scope = "/some/scope/"; + app_info->icon = std::make_unique<SkBitmap>(); + app_info->icon->allocN32Pixels(kBitmapDimension, kBitmapDimension); + app_info->icon->eraseColor(SK_ColorRED); + + icon_bitmap_ = app_info->icon.get(); + app_ = std::make_unique<ServiceWorkerPaymentApp>( + web_contents_, GURL("https://testmerchant.com"), + GURL("https://testmerchant.com/bobpay"), spec_->AsWeakPtr(), + std::move(app_info), /*enabled_method=*/"https://bobpay.com", + /*is_incognito=*/false, /*show_processing_spinner=*/base::DoNothing()); + } + + void CreateInstalledServiceWorkerPaymentApp(bool with_url_method) { constexpr int kBitmapDimension = 16; std::unique_ptr<content::StoredPaymentApp> stored_app = @@ -154,7 +174,7 @@ // Test app info and status are correct. TEST_F(ServiceWorkerPaymentAppTest, AppInfo) { - CreateServiceWorkerPaymentApp(true); + CreateInstalledServiceWorkerPaymentApp(true); EXPECT_TRUE(GetApp()->IsCompleteForPayment()); @@ -169,7 +189,7 @@ // Test payment request event data can be correctly constructed for invoking // InvokePaymentApp. TEST_F(ServiceWorkerPaymentAppTest, CreatePaymentRequestEventData) { - CreateServiceWorkerPaymentApp(true); + CreateInstalledServiceWorkerPaymentApp(true); mojom::PaymentRequestEventDataPtr event_data = CreatePaymentRequestEventData(); @@ -201,12 +221,12 @@ // Test CanMakePaymentEventData can be correctly constructed for invoking // Validate. TEST_F(ServiceWorkerPaymentAppTest, CreateCanMakePaymentEvent) { - CreateServiceWorkerPaymentApp(false); + CreateInstalledServiceWorkerPaymentApp(false); mojom::CanMakePaymentEventDataPtr event_data = CreateCanMakePaymentEventData(); EXPECT_TRUE(event_data.is_null()); - CreateServiceWorkerPaymentApp(true); + CreateInstalledServiceWorkerPaymentApp(true); event_data = CreateCanMakePaymentEventData(); EXPECT_FALSE(event_data.is_null()); @@ -229,86 +249,22 @@ TEST_F(ServiceWorkerPaymentAppTest, ValidateCanMakePayment) { // CanMakePaymentEvent is not fired because this test app does not have any // explicitly verified methods. - CreateServiceWorkerPaymentApp(/*with_url_method=*/true); + CreateInstalledServiceWorkerPaymentApp(/*with_url_method=*/true); GetApp()->ValidateCanMakePayment(base::BindOnce( [](ServiceWorkerPaymentApp*, bool result) { EXPECT_TRUE(result); })); EXPECT_FALSE(GetApp()->HasEnrolledInstrument()); } -class ServiceWorkerPaymentAppBasicCardDisabledTest - : public ServiceWorkerPaymentAppTest { - public: - ServiceWorkerPaymentAppBasicCardDisabledTest( - const ServiceWorkerPaymentAppBasicCardDisabledTest&) = delete; - ServiceWorkerPaymentAppBasicCardDisabledTest& operator=( - const ServiceWorkerPaymentAppBasicCardDisabledTest&) = delete; +TEST_F(ServiceWorkerPaymentAppTest, IsValidForModifier) { + CreateInstalledServiceWorkerPaymentApp(true); + EXPECT_TRUE(GetApp()->IsValidForModifier(/*method=*/"https://bobpay.com")); + EXPECT_TRUE(GetApp()->IsValidForModifier(/*method=*/"basic-card")); + EXPECT_FALSE(GetApp()->IsValidForModifier(/*method=*/"foo-bar")); - protected: - ServiceWorkerPaymentAppBasicCardDisabledTest() { - feature_list_.InitAndDisableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Test modifiers can be matched based on capabilities. -TEST_F(ServiceWorkerPaymentAppBasicCardDisabledTest, IsValidForModifier) { - CreateServiceWorkerPaymentApp(true); - - EXPECT_FALSE(GetApp()->IsValidForModifier( - /*method=*/"basic-card", /*supported_networks_specified=*/false, - /*supported_networks=*/{})); - - EXPECT_TRUE(GetApp()->IsValidForModifier( - /*method=*/"https://bobpay.com", /*supported_networks_specified=*/true, - /*supported_networks=*/{})); - - EXPECT_FALSE(GetApp()->IsValidForModifier( - /*method=*/"basic-card", /*supported_networks_specified=*/true, - /*supported_networks=*/{"mastercard"})); - - EXPECT_FALSE(GetApp()->IsValidForModifier( - /*method=*/"basic-card", /*supported_networks_specified=*/true, - /*supported_networks=*/{"unionpay"})); -} - -class ServiceWorkerPaymentAppBasicCardEnabledTest - : public ServiceWorkerPaymentAppTest { - public: - ServiceWorkerPaymentAppBasicCardEnabledTest( - const ServiceWorkerPaymentAppBasicCardEnabledTest&) = delete; - ServiceWorkerPaymentAppBasicCardEnabledTest& operator=( - const ServiceWorkerPaymentAppBasicCardEnabledTest&) = delete; - - protected: - ServiceWorkerPaymentAppBasicCardEnabledTest() { - feature_list_.InitAndEnableFeature(::features::kPaymentRequestBasicCard); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Test modifiers can be matched based on capabilities. -TEST_F(ServiceWorkerPaymentAppBasicCardEnabledTest, IsValidForModifier) { - CreateServiceWorkerPaymentApp(true); - - EXPECT_TRUE(GetApp()->IsValidForModifier( - /*method=*/"basic-card", /*supported_networks_specified=*/false, - /*supported_networks=*/{})); - - EXPECT_TRUE(GetApp()->IsValidForModifier( - /*method=*/"https://bobpay.com", /*supported_networks_specified=*/true, - /*supported_networks=*/{})); - - EXPECT_FALSE(GetApp()->IsValidForModifier( - /*method=*/"basic-card", /*supported_networks_specified=*/true, - /*supported_networks=*/{"mastercard"})); - - EXPECT_TRUE(GetApp()->IsValidForModifier( - /*method=*/"basic-card", /*supported_networks_specified=*/true, - /*supported_networks=*/{"unionpay"})); + CreateInstallableServiceWorkerPaymentApp(); + EXPECT_TRUE(GetApp()->IsValidForModifier(/*method=*/"https://bobpay.com")); + EXPECT_FALSE(GetApp()->IsValidForModifier(/*method=*/"basic-card")); + EXPECT_FALSE(GetApp()->IsValidForModifier(/*method=*/"foo-bar")); } } // namespace payments
diff --git a/components/payments/content/test_payment_app.cc b/components/payments/content/test_payment_app.cc index 3f199341..f7d59da0 100644 --- a/components/payments/content/test_payment_app.cc +++ b/components/payments/content/test_payment_app.cc
@@ -43,10 +43,7 @@ std::u16string TestPaymentApp::GetSublabel() const { return std::u16string(); } -bool TestPaymentApp::IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const { +bool TestPaymentApp::IsValidForModifier(const std::string& method) const { return false; } base::WeakPtr<PaymentApp> TestPaymentApp::AsWeakPtr() {
diff --git a/components/payments/content/test_payment_app.h b/components/payments/content/test_payment_app.h index 267801ad..a46f1e3cf 100644 --- a/components/payments/content/test_payment_app.h +++ b/components/payments/content/test_payment_app.h
@@ -30,10 +30,7 @@ std::string GetId() const override; std::u16string GetLabel() const override; std::u16string GetSublabel() const override; - bool IsValidForModifier( - const std::string& method, - bool supported_networks_specified, - const std::set<std::string>& supported_networks) const override; + bool IsValidForModifier(const std::string& method) const override; base::WeakPtr<PaymentApp> AsWeakPtr() override; bool HandlesShippingAddress() const override; bool HandlesPayerName() const override;
diff --git a/components/payments/core/payment_request_data_util.cc b/components/payments/core/payment_request_data_util.cc index d9c52c0..094f24a 100644 --- a/components/payments/core/payment_request_data_util.cc +++ b/components/payments/core/payment_request_data_util.cc
@@ -88,19 +88,11 @@ void ParseSupportedMethods( const std::vector<PaymentMethodData>& method_data, - std::vector<std::string>* out_supported_networks, - std::set<std::string>* out_basic_card_specified_networks, std::vector<GURL>* out_url_payment_method_identifiers, std::set<std::string>* out_payment_method_identifiers) { - DCHECK(out_supported_networks->empty()); - DCHECK(out_basic_card_specified_networks->empty()); DCHECK(out_url_payment_method_identifiers->empty()); DCHECK(out_payment_method_identifiers->empty()); - const std::set<std::string> kBasicCardNetworks{ - "amex", "diners", "discover", "jcb", - "mastercard", "mir", "unionpay", "visa"}; - std::set<GURL> url_payment_method_identifiers; for (const PaymentMethodData& method_data_entry : method_data) { @@ -109,39 +101,15 @@ out_payment_method_identifiers->insert(method_data_entry.supported_method); - if (method_data_entry.supported_method == methods::kBasicCard) { - if (method_data_entry.supported_networks.empty()) { - // Empty |supported_networks| means all networks are supported. - out_supported_networks->insert(out_supported_networks->end(), - kBasicCardNetworks.begin(), - kBasicCardNetworks.end()); - out_basic_card_specified_networks->insert(kBasicCardNetworks.begin(), - kBasicCardNetworks.end()); - } else { - // The merchant has specified a few basic card supported networks. Use - // the mapping to transform to known basic-card types. - for (const std::string& supported_network : - method_data_entry.supported_networks) { - if (kBasicCardNetworks.find(supported_network) != - kBasicCardNetworks.end() && - out_basic_card_specified_networks->find(supported_network) == - out_basic_card_specified_networks->end()) { - out_supported_networks->push_back(supported_network); - out_basic_card_specified_networks->insert(supported_network); - } - } - } - } else { - // Here |method_data_entry.supported_method| could be a deprecated - // supported network (e.g., "visa"), some invalid string or a URL-based - // payment method identifier. Capture this last category if it is valid. - // Avoid duplicates. - GURL url(method_data_entry.supported_method); - if (UrlUtil::IsValidUrlBasedPaymentMethodIdentifier(url)) { - const auto result = url_payment_method_identifiers.insert(url); - if (result.second) - out_url_payment_method_identifiers->push_back(url); - } + // |method_data_entry.supported_method| could be a deprecated supported + // method (e.g., "basic-card" or "visa"), some invalid string or a URL-based + // payment method identifier. Capture this last category if it is valid. + // Avoid duplicates. + GURL url(method_data_entry.supported_method); + if (UrlUtil::IsValidUrlBasedPaymentMethodIdentifier(url)) { + const auto result = url_payment_method_identifiers.insert(url); + if (result.second) + out_url_payment_method_identifiers->push_back(url); } } }
diff --git a/components/payments/core/payment_request_data_util.h b/components/payments/core/payment_request_data_util.h index 97012ee..1600389 100644 --- a/components/payments/core/payment_request_data_util.h +++ b/components/payments/core/payment_request_data_util.h
@@ -39,23 +39,11 @@ const autofill::AutofillProfile& billing_profile, const std::string& app_locale); -// Parse all the supported payment methods from the merchant including 1) the -// supported card networks from supportedMethods and "basic-card"'s -// supportedNetworks and 2) the url-based payment method identifiers. -// |out_supported_networks| is filled with a list of networks -// in the order that they were specified by the merchant. -// |out_basic_card_supported_networks| is a subset of |out_supported_networks| -// that includes all networks that were specified as part of "basic-card". This -// is used to know whether to return the card network name (e.g., "visa") or -// "basic-card" in the PaymentResponse. |method_data.supported_networks| is -// expected to only contain basic-card card network names (the list is at -// https://www.w3.org/Payments/card-network-ids). +// Parse the supported URL payment methods from the merchant. // |out_url_payment_method_identifiers| is filled with a list of all the // payment method identifiers specified by the merchant that are URL-based. void ParseSupportedMethods( const std::vector<PaymentMethodData>& method_data, - std::vector<std::string>* out_supported_networks, - std::set<std::string>* out_basic_card_supported_networks, std::vector<GURL>* out_url_payment_method_identifiers, std::set<std::string>* out_payment_method_identifiers);
diff --git a/components/payments/core/payment_request_data_util_unittest.cc b/components/payments/core/payment_request_data_util_unittest.cc index a71e0fc..fe19c87 100644 --- a/components/payments/core/payment_request_data_util_unittest.cc +++ b/components/payments/core/payment_request_data_util_unittest.cc
@@ -31,10 +31,10 @@ using testing::UnorderedElementsAre; using testing::UnorderedElementsAreArray; -static const char kBasicCardMethodName[] = "basic-card"; -static const char* kBasicCardNetworks[] = {"amex", "diners", "discover", - "jcb", "mastercard", "mir", - "unionpay", "visa"}; +// These payment method identifiers are unsupported by ParseSupportedMethods. +// This does not mean they are unsupported by PaymentRequest in general. +static const char* kUnsupportedPaymentMethodIdentifiers[] = { + "foo", "secure-payment-confirmation", "file://invalid_url"}; // Tests that the serialized version of the PaymentAddress is according to the // PaymentAddress spec. @@ -93,186 +93,54 @@ json_response); } -// A test fixture to check ParseSupportedMethods() returns empty supported -// networks when // input is an unsupported payment method. +// A test fixture to check ParseSupportedMethods() returns empty identifier +// lists when input is an unsupported payment method. typedef ::testing::TestWithParam<const char*> InvalidSupportedMethodTest; TEST_P(InvalidSupportedMethodTest, Test) { PaymentMethodData method_data; // GetParam() is expected to be an unsupported payment method identifier. - const char* network = GetParam(); - method_data.supported_method = network; + const char* method = GetParam(); + method_data.supported_method = method; std::vector<PaymentMethodData> method_data_list{method_data}; - std::vector<std::string> supported_networks; - std::set<std::string> basic_card_specified_networks; std::vector<GURL> url_payment_method_identifiers; std::set<std::string> payment_method_identifiers; - payments::data_util::ParseSupportedMethods( - method_data_list, &supported_networks, &basic_card_specified_networks, - &url_payment_method_identifiers, &payment_method_identifiers); + payments::data_util::ParseSupportedMethods(method_data_list, + &url_payment_method_identifiers, + &payment_method_identifiers); - EXPECT_TRUE(supported_networks.empty()); - EXPECT_TRUE(basic_card_specified_networks.empty()); EXPECT_TRUE(url_payment_method_identifiers.empty()); - EXPECT_THAT(payment_method_identifiers, ElementsAre(network)); + EXPECT_THAT(payment_method_identifiers, ElementsAre(method)); } -// Tests that card networks are not recognized as valid |supported_methods|. INSTANTIATE_TEST_SUITE_P( - PaymentRequestDataUtil_ParseSupportedMethods_CardNetworks, + PaymentRequestDataUtil_ParseSupportedMethods_InvalidIdentifiers, InvalidSupportedMethodTest, - ::testing::ValuesIn(kBasicCardNetworks)); + ::testing::ValuesIn(kUnsupportedPaymentMethodIdentifiers)); -// Tests that an arbitrary string is not a valid |supported_methods|. -INSTANTIATE_TEST_SUITE_P( - PaymentRequestDataUtil_ParseSupportedMethods_ArbitraryPMI, - InvalidSupportedMethodTest, - ::testing::Values("foo")); - -// A test fixture to check ParseSupportedMethods() correctly returns the card -// networks for the "basic-card" payment method. -typedef ::testing::TestWithParam<const char*> SupportedNetworksTest; -#if BUILDFLAG(IS_IOS) && !TARGET_OS_SIMULATOR -// TODO(crbug.com/1008023): Enable this test on iOS devices. -#define MAYBE_SupportedNetworks DISABLED_SupportedNetworks -#else -#define MAYBE_SupportedNetworks SupportedNetworks -#endif // BUILDFLAG(IS_IOS) && !TARGET_OS_SIMULATOR -TEST_P(SupportedNetworksTest, MAYBE_SupportedNetworks) { - PaymentMethodData method_data; - method_data.supported_method = kBasicCardMethodName; - // GetParam() is expected to be a basic-card network. - std::string network = GetParam(); - method_data.supported_networks.push_back(network); - - std::vector<PaymentMethodData> method_data_list{method_data}; - std::vector<std::string> supported_networks; - std::set<std::string> basic_card_specified_networks; - std::vector<GURL> url_payment_method_identifiers; - std::set<std::string> payment_method_identifiers; - - payments::data_util::ParseSupportedMethods( - method_data_list, &supported_networks, &basic_card_specified_networks, - &url_payment_method_identifiers, &payment_method_identifiers); - - EXPECT_THAT(supported_networks, ElementsAre(network)); - EXPECT_THAT(basic_card_specified_networks, ElementsAre(network)); - EXPECT_TRUE(url_payment_method_identifiers.empty()); - EXPECT_THAT(payment_method_identifiers, ElementsAre(kBasicCardMethodName)); -} - -// Tests that the card networks are valid |supported_networks| for "basic-card". -INSTANTIATE_TEST_SUITE_P(PaymentRequestDataUtil_ParseSupportedMethods_BasicCard, - SupportedNetworksTest, - ::testing::ValuesIn(kBasicCardNetworks)); - -// Tests that empty |supported_networks| means all networks are supported. -TEST(PaymentRequestDataUtil, - ParseSupportedMethods_AllNetworksSupportedByDefault) { - PaymentMethodData method_data; - method_data.supported_method = kBasicCardMethodName; - - std::vector<PaymentMethodData> method_data_list{method_data}; - std::vector<std::string> supported_networks; - std::set<std::string> basic_card_specified_networks; - std::vector<GURL> url_payment_method_identifiers; - std::set<std::string> payment_method_identifiers; - - payments::data_util::ParseSupportedMethods( - method_data_list, &supported_networks, &basic_card_specified_networks, - &url_payment_method_identifiers, &payment_method_identifiers); - - EXPECT_THAT(supported_networks, ElementsAreArray(kBasicCardNetworks)); - EXPECT_THAT(basic_card_specified_networks, - UnorderedElementsAreArray(kBasicCardNetworks)); - EXPECT_TRUE(url_payment_method_identifiers.empty()); - EXPECT_THAT(payment_method_identifiers, ElementsAre(kBasicCardMethodName)); -} - -// Tests that a unrecognized |supported_networks| is ignored. -TEST(PaymentRequestDataUtil, ParseSupportedMethods_UnknownBasicCardNetwork) { - PaymentMethodData method_data; - method_data.supported_method = kBasicCardMethodName; - method_data.supported_networks.push_back("foo"); - - std::vector<PaymentMethodData> method_data_list{method_data}; - std::vector<std::string> supported_networks; - std::set<std::string> basic_card_specified_networks; - std::vector<GURL> url_payment_method_identifiers; - std::set<std::string> payment_method_identifiers; - - payments::data_util::ParseSupportedMethods( - method_data_list, &supported_networks, &basic_card_specified_networks, - &url_payment_method_identifiers, &payment_method_identifiers); - - EXPECT_TRUE(supported_networks.empty()); - EXPECT_TRUE(basic_card_specified_networks.empty()); - EXPECT_TRUE(url_payment_method_identifiers.empty()); - EXPECT_THAT(payment_method_identifiers, ElementsAre(kBasicCardMethodName)); -} - -// Tests that |PaymentMethodData| with invalid |supported_methods| is ignored. -TEST(PaymentRequestDataUtil, ParseSupportedMethods_InvalidPaymentMethodData) { - PaymentMethodData valid_method_data; - valid_method_data.supported_method = kBasicCardMethodName; - valid_method_data.supported_networks.push_back("visa"); - - PaymentMethodData invalid_method_data; - invalid_method_data.supported_method = "mastercard"; - - std::vector<PaymentMethodData> method_data_list{valid_method_data, - invalid_method_data}; - std::vector<std::string> supported_networks; - std::set<std::string> basic_card_specified_networks; - std::vector<GURL> url_payment_method_identifiers; - std::set<std::string> payment_method_identifiers; - - payments::data_util::ParseSupportedMethods( - method_data_list, &supported_networks, &basic_card_specified_networks, - &url_payment_method_identifiers, &payment_method_identifiers); - - EXPECT_THAT(supported_networks, ElementsAre("visa")); - EXPECT_THAT(basic_card_specified_networks, ElementsAre("visa")); - EXPECT_TRUE(url_payment_method_identifiers.empty()); - EXPECT_THAT(payment_method_identifiers, - UnorderedElementsAre(kBasicCardMethodName, "mastercard")); -} - -// Tests multiple payment methods are parsed correctly, and that if more than -// one "basic-card" entries exist, they are effectively merged with no -// duplicates. +// Tests multiple payment methods are parsed correctly, and that URL-based +// methods are extracted correctly. TEST(PaymentRequestDataUtil, ParseSupportedMethods_MultipleEntries) { - PaymentMethodData basic_card_data_1; - basic_card_data_1.supported_method = kBasicCardMethodName; - basic_card_data_1.supported_networks.push_back("visa"); - - PaymentMethodData basic_card_data_2; - basic_card_data_2.supported_method = kBasicCardMethodName; - basic_card_data_2.supported_networks.push_back("mastercard"); - basic_card_data_2.supported_networks.push_back("visa"); + const char kUnknownMethod[] = "unknown-method"; + PaymentMethodData method_data_1; + method_data_1.supported_method = kUnknownMethod; const char kBobPayMethod[] = "https://bobpay.xyz/"; - PaymentMethodData url_method; - url_method.supported_method = kBobPayMethod; + PaymentMethodData method_data_2; + method_data_2.supported_method = kBobPayMethod; - std::vector<PaymentMethodData> method_data_list{ - basic_card_data_1, basic_card_data_2, url_method}; - std::vector<std::string> supported_networks; - std::set<std::string> basic_card_specified_networks; + std::vector<PaymentMethodData> method_data_list{method_data_1, method_data_2}; std::vector<GURL> url_payment_method_identifiers; std::set<std::string> payment_method_identifiers; - payments::data_util::ParseSupportedMethods( - method_data_list, &supported_networks, &basic_card_specified_networks, - &url_payment_method_identifiers, &payment_method_identifiers); + payments::data_util::ParseSupportedMethods(method_data_list, + &url_payment_method_identifiers, + &payment_method_identifiers); - EXPECT_THAT(supported_networks, ElementsAre("visa", "mastercard")); - EXPECT_THAT(basic_card_specified_networks, - UnorderedElementsAre("visa", "mastercard")); EXPECT_THAT(url_payment_method_identifiers, ElementsAre(kBobPayMethod)); EXPECT_THAT(payment_method_identifiers, - UnorderedElementsAre(kBasicCardMethodName, kBobPayMethod)); + UnorderedElementsAre(kUnknownMethod, kBobPayMethod)); } TEST(PaymentRequestDataUtil, FilterStringifiedMethodData) {
diff --git a/components/permissions_strings.grdp b/components/permissions_strings.grdp index 89fcc650..e7f54cf 100644 --- a/components/permissions_strings.grdp +++ b/components/permissions_strings.grdp
@@ -77,7 +77,7 @@ Allow 2 permissions? </message> </if> - <if expr="is_android or chromeos_ash or chromeos_lacros or is_win"> + <if expr="is_android or is_chromeos or is_win"> <message name="IDS_PROTECTED_MEDIA_IDENTIFIER_PERMISSION_FRAGMENT" desc="Permission fragment shown in the permissions bubble when a web page requests access to the computer's protected media identifier."> Know your unique device identifier </message>
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index b71ea36..586ee57 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -1447,6 +1447,7 @@ 'type': 'main', 'schema': { 'type': 'boolean' }, 'supported_on': ['chrome.win7:11-', 'chrome.mac:11-', 'chrome.linux:11-'], + 'future_on': ['fuchsia'], 'features': { 'dynamic_refresh': True, 'per_profile': False, @@ -4386,6 +4387,7 @@ 'type': 'main', 'schema': { 'type': 'boolean' }, 'supported_on': ['chrome.win:57-', 'chrome.mac:88-', 'chrome.linux:88-'], + 'future_on': ['fuchsia'], 'features': { 'dynamic_refresh': False, 'per_profile': False, @@ -22206,6 +22208,7 @@ 'type': 'main', 'schema': { 'type': 'boolean' }, 'supported_on': ['chrome.win:66-', 'chrome.linux:66-', 'chrome.mac:66-', 'chrome_os:66-'], + 'future_on': ['fuchsia'], 'features': { 'dynamic_refresh': True, 'per_profile': True, @@ -30662,6 +30665,7 @@ ], 'default': True, 'supported_on': ['chrome.win:93-', 'chrome.linux:93-', 'chrome.mac:93-'], + 'future_on': ['fuchsia'], 'features': { 'dynamic_refresh': True, 'per_profile': True,
diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp index dedce88..f644e20 100644 --- a/components/policy_strings.grdp +++ b/components/policy_strings.grdp
@@ -318,7 +318,7 @@ <ph name="DEBUG_INFO">$1<ex>ERROR: Field name 'SomeRandomField' is unknown. (at toplevel)</ex></ph> </message> </if> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <message name="IDS_POLICY_SCOPE_ERROR" desc="Text displayed in the status column when a policy is set in an unsupported scope."> Policy scope is not supported. </message>
diff --git a/components/printing/browser/print_to_pdf/pdf_print_job.cc b/components/printing/browser/print_to_pdf/pdf_print_job.cc index 88bad6a..d935d99 100644 --- a/components/printing/browser/print_to_pdf/pdf_print_job.cc +++ b/components/printing/browser/print_to_pdf/pdf_print_job.cc
@@ -25,7 +25,7 @@ PdfPrintJob::~PdfPrintJob() { // The callback is supposed to be consumed at this point confirming - // that job result was reported to the job starter. + // that the job result was reported to the job starter. DCHECK(!print_to_pdf_callback_); } @@ -44,7 +44,7 @@ } absl::variant<printing::PageRanges, PdfPrintResult> pages = - print_to_pdf::TextPageRangesToPageRanges(page_ranges); + TextPageRangesToPageRanges(page_ranges); if (absl::holds_alternative<PdfPrintResult>(pages)) { std::move(callback).Run(absl::get<PdfPrintResult>(pages), nullptr); return;
diff --git a/components/printing/browser/print_to_pdf/pdf_print_job.h b/components/printing/browser/print_to_pdf/pdf_print_job.h index ee85e7c..55eff11 100644 --- a/components/printing/browser/print_to_pdf/pdf_print_job.h +++ b/components/printing/browser/print_to_pdf/pdf_print_job.h
@@ -68,7 +68,7 @@ base::ReadOnlySharedMemoryRegion region); void ReportMemoryRegion(const base::ReadOnlySharedMemoryRegion& region); - void FailJob(print_to_pdf::PdfPrintResult result); + void FailJob(PdfPrintResult result); raw_ptr<content::RenderFrameHost> printing_rfh_; PrintToPdfCallback print_to_pdf_callback_;
diff --git a/components/printing_component_strings.grdp b/components/printing_component_strings.grdp index f1ad867b..bdc98144 100644 --- a/components/printing_component_strings.grdp +++ b/components/printing_component_strings.grdp
@@ -12,7 +12,7 @@ Print Compositor Service </message> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <message name="IDS_PRINT_CHAMBER_HUMIDITY" desc="PWG5100.21 (8.1.1) chamber-humidity"> Chamber humidity </message>
diff --git a/components/reporting/proto/synced/metric_data.proto b/components/reporting/proto/synced/metric_data.proto index f4fe7fb6..9f18d06 100644 --- a/components/reporting/proto/synced/metric_data.proto +++ b/components/reporting/proto/synced/metric_data.proto
@@ -239,6 +239,24 @@ repeated NetworkInterface network_interfaces = 1; } +// Touch screens info data. +message TouchScreenInfo { + // The touchpad library name used by the input stack. + optional string library_name = 1; + // List of the touchscreen devices. + repeated TouchScreenDevice touch_screen_devices = 2; +} + +// Information about the internal touch screen of a device. +message TouchScreenDevice { + // Name of the device (touchscreen). + optional string display_name = 1; + // Number of touch points this device supports. + optional int32 touch_points = 2; + // True if the specified touchscreen device is stylus capable. + optional bool has_stylus = 3; +} + // Information about keylocker. This is supported on Intel CPUs. message KeylockerInfo { // If keylocker is supported on the devices CPUs. @@ -263,6 +281,8 @@ optional MemoryInfo memory_info = 3; // Network interfaces info. optional NetworksInfo networks_info = 4; + // Touch screen info. + optional TouchScreenInfo touch_screen_info = 5; } // Audio telemetry data recorded intermittently
diff --git a/components/signin/DEPS b/components/signin/DEPS index 6a3669d..8da8c60 100644 --- a/components/signin/DEPS +++ b/components/signin/DEPS
@@ -1,5 +1,5 @@ include_rules = [ - "+ash/components/account_manager", + "+chromeos/ash/components/account_manager", "+components/account_manager_core", "+components/content_settings", "+components/google/core",
diff --git a/components/signin/public/identity_manager/BUILD.gn b/components/signin/public/identity_manager/BUILD.gn index fac2ebe4..01e7630 100644 --- a/components/signin/public/identity_manager/BUILD.gn +++ b/components/signin/public/identity_manager/BUILD.gn
@@ -139,7 +139,7 @@ } if (is_chromeos_ash) { - deps += [ "//ash/components/account_manager" ] + deps += [ "//chromeos/ash/components/account_manager" ] } } @@ -175,7 +175,7 @@ ] if (is_chromeos_ash) { - deps += [ "//ash/components/account_manager" ] + deps += [ "//chromeos/ash/components/account_manager" ] } if (is_chromeos_lacros) {
diff --git a/components/signin/public/identity_manager/identity_manager_unittest.cc b/components/signin/public/identity_manager/identity_manager_unittest.cc index 2adf52d1..db6e058 100644 --- a/components/signin/public/identity_manager/identity_manager_unittest.cc +++ b/components/signin/public/identity_manager/identity_manager_unittest.cc
@@ -65,7 +65,7 @@ #endif #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/account_manager/account_manager_factory.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account.h" #include "components/account_manager_core/account_manager_facade_impl.h" #include "components/account_manager_core/chromeos/account_manager.h"
diff --git a/components/signin/public/identity_manager/identity_test_environment.cc b/components/signin/public/identity_manager/identity_test_environment.cc index b0947a4..7c4d172 100644 --- a/components/signin/public/identity_manager/identity_test_environment.cc +++ b/components/signin/public/identity_manager/identity_test_environment.cc
@@ -40,7 +40,7 @@ #include "services/network/test/test_url_loader_factory.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/account_manager/account_manager_factory.h" +#include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account_manager_facade_impl.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
diff --git a/components/sync/protocol/bookmark_specifics.proto b/components/sync/protocol/bookmark_specifics.proto index ffa83896..d1f4706 100644 --- a/components/sync/protocol/bookmark_specifics.proto +++ b/components/sync/protocol/bookmark_specifics.proto
@@ -88,4 +88,8 @@ // redundant to the similar field in SyncEntity. If this field in specifics is // set, it takes precedence over the one in SyncEntity. optional UniquePosition unique_position = 16; + + // Introduced in M106, corresponds to BookmarkNode::date_last_used() + // represented as microseconds since the Windows epoch. + optional int64 last_used_time_us = 17; }
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h index 0d645cc..b59ffac 100644 --- a/components/sync/protocol/proto_visitors.h +++ b/components/sync/protocol/proto_visitors.h
@@ -268,6 +268,7 @@ VISIT(parent_guid); VISIT_ENUM(type); VISIT(unique_position); + VISIT(last_used_time_us); } VISIT_PROTO_FIELDS(const sync_pb::ChromiumExtensionsActivity& proto) {
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions.cc b/components/sync_bookmarks/bookmark_specifics_conversions.cc index 18c39c5f..5428ee3 100644 --- a/components/sync_bookmarks/bookmark_specifics_conversions.cc +++ b/components/sync_bookmarks/bookmark_specifics_conversions.cc
@@ -298,6 +298,10 @@ bm_specifics->set_creation_time_us( node->date_added().ToDeltaSinceWindowsEpoch().InMicroseconds()); *bm_specifics->mutable_unique_position() = unique_position; + if (!node->is_folder() && node->date_last_used() != base::Time()) { + bm_specifics->set_last_used_time_us( + node->date_last_used().ToDeltaSinceWindowsEpoch().InMicroseconds()); + } if (node->GetMetaInfoMap()) { UpdateBookmarkSpecificsMetaInfo(node->GetMetaInfoMap(), bm_specifics); @@ -372,6 +376,15 @@ const bookmarks::BookmarkNode* node = model->AddURL(parent, index, NodeTitleFromSpecifics(specifics), GURL(specifics.url()), &metainfo, creation_time, guid); + if (specifics.has_last_used_time_us()) { + const int64_t last_used_time_us = specifics.last_used_time_us(); + const base::Time last_used_time = + base::Time::FromDeltaSinceWindowsEpoch( + // Use FromDeltaSinceWindowsEpoch because last_used_time_us has + // always used the Windows epoch. + base::Microseconds(last_used_time_us)); + model->UpdateLastUsedTime(node, last_used_time); + } SetBookmarkFaviconFromSpecifics(specifics, node, favicon_service); return node; } @@ -404,6 +417,15 @@ if (!node->is_folder()) { model->SetURL(node, GURL(specifics.url())); SetBookmarkFaviconFromSpecifics(specifics, node, favicon_service); + + if (specifics.has_last_used_time_us()) { + const int64_t last_used_time_us = specifics.last_used_time_us(); + const base::Time last_used_time = base::Time::FromDeltaSinceWindowsEpoch( + // Use FromDeltaSinceWindowsEpoch because last_used_time_us has + // always used the Windows epoch. + base::Microseconds(last_used_time_us)); + model->UpdateLastUsedTime(node, last_used_time); + } } }
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc index 748fb516..6b52a433 100644 --- a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc +++ b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
@@ -94,6 +94,7 @@ kUrl); ASSERT_THAT(node, NotNull()); model->SetDateAdded(node, kTime); + model->UpdateLastUsedTime(node, kTime); model->SetNodeMetaInfo(node, kKey1, kValue1); model->SetNodeMetaInfo(node, kKey2, kValue2); @@ -110,6 +111,9 @@ EXPECT_THAT(base::Time::FromDeltaSinceWindowsEpoch( base::Microseconds(bm_specifics.creation_time_us())), Eq(kTime)); + EXPECT_THAT(base::Time::FromDeltaSinceWindowsEpoch( + base::Microseconds(bm_specifics.last_used_time_us())), + Eq(kTime)); EXPECT_TRUE(syncer::UniquePosition::FromProto(bm_specifics.unique_position()) .Equals(kUniquePosition)); for (const sync_pb::MetaInfo& meta_info : bm_specifics.meta_info()) { @@ -120,6 +124,32 @@ } TEST(BookmarkSpecificsConversionsTest, + ShouldCreateSpecificsFromBookmarkNodeNoDateLastUsed) { + const GURL kUrl("http://www.url.com"); + const std::string kTitle = "Title"; + const syncer::UniquePosition kUniquePosition = + syncer::UniquePosition::InitialPosition( + syncer::UniquePosition::RandomSuffix()); + + std::unique_ptr<bookmarks::BookmarkModel> model = + bookmarks::TestBookmarkClient::CreateModel(); + + const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node(); + const bookmarks::BookmarkNode* node = model->AddURL( + /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle), + kUrl); + + sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode( + node, model.get(), kUniquePosition.ToProto(), + /*force_favicon_load=*/false); + const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark(); + EXPECT_THAT(bm_specifics.guid(), Eq(node->guid().AsLowercaseString())); + EXPECT_THAT(bm_specifics.parent_guid(), + Eq(bookmarks::BookmarkNode::kBookmarkBarNodeGuid)); + EXPECT_FALSE(bm_specifics.has_last_used_time_us()); +} + +TEST(BookmarkSpecificsConversionsTest, ShouldCreateSpecificsFromBookmarkNodeWithIllegalTitle) { std::unique_ptr<bookmarks::BookmarkModel> model = bookmarks::TestBookmarkClient::CreateModel(); @@ -156,6 +186,7 @@ const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark(); EXPECT_FALSE(bm_specifics.has_url()); EXPECT_THAT(bm_specifics.type(), Eq(sync_pb::BookmarkSpecifics::FOLDER)); + EXPECT_FALSE(bm_specifics.has_last_used_time_us()); } TEST(BookmarkSpecificsConversionsTest, @@ -307,6 +338,8 @@ bm_specifics.set_legacy_canonicalized_title(kTitle); bm_specifics.set_creation_time_us( kTime.ToDeltaSinceWindowsEpoch().InMicroseconds()); + bm_specifics.set_last_used_time_us( + kTime.ToDeltaSinceWindowsEpoch().InMicroseconds()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::URL); // Parent GUID and unique position are ignored by @@ -339,6 +372,7 @@ EXPECT_FALSE(node->is_folder()); EXPECT_THAT(node->url(), Eq(kUrl)); EXPECT_THAT(node->date_added(), Eq(kTime)); + EXPECT_THAT(node->date_last_used(), Eq(kTime)); std::string value1; node->GetMetaInfo(kKey1, &value1); EXPECT_THAT(value1, Eq(kValue1)); @@ -569,6 +603,8 @@ bm_specifics.set_legacy_canonicalized_title(kNewTitle); bm_specifics.set_creation_time_us( kTime.ToDeltaSinceWindowsEpoch().InMicroseconds()); + bm_specifics.set_last_used_time_us( + kTime.ToDeltaSinceWindowsEpoch().InMicroseconds()); sync_pb::MetaInfo* meta_info1 = bm_specifics.add_meta_info(); meta_info1->set_key(kKey1); meta_info1->set_value(kNewValue1);
diff --git a/components/version_ui/resources/about_version.js b/components/version_ui/resources/about_version.js index 31a99b4..e18c1af 100644 --- a/components/version_ui/resources/about_version.js +++ b/components/version_ui/resources/about_version.js
@@ -82,7 +82,7 @@ } // </if> -// <if expr="chromeos_ash or chromeos_lacros"> +// <if expr="is_chromeos"> /** * Callback from the backend to inform if Lacros is primary or not. * @param {string} isPrimary True if it is primary. @@ -124,7 +124,7 @@ addWebUIListener('return-os-firmware-version', returnOsFirmwareVersion); addWebUIListener('return-arc-version', returnARCVersion); // </if> - // <if expr="chromeos_ash or chromeos_lacros"> + // <if expr="is_chromeos"> addWebUIListener('return-lacros-primary', returnLacrosPrimary); // </if>
diff --git a/components/viz/service/display/overlay_combination_cache.cc b/components/viz/service/display/overlay_combination_cache.cc index 80a11c6..75e9847 100644 --- a/components/viz/service/display/overlay_combination_cache.cc +++ b/components/viz/service/display/overlay_combination_cache.cc
@@ -22,9 +22,9 @@ OverlayCacheKey::OverlayCacheKey( const OverlayProposedCandidate& proposed_candidate) { - // Rounding the display_rect here matches the behaviour of Ozone when testing + // Rounding the display_rect here matches the behaviour of DRM when testing // OverlayCandidates. - display_rect = gfx::ToNearestRect(proposed_candidate.candidate.display_rect); + display_rect = gfx::ToRoundedRect(proposed_candidate.candidate.display_rect); strategy = proposed_candidate.strategy->GetUMAEnum(); }
diff --git a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc index 8b704589..fa2e214b 100644 --- a/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc +++ b/content/browser/webrtc/webrtc_capture_from_element_browsertest.cc
@@ -89,7 +89,7 @@ } // TODO(https://crbug.com/1334876): Flaky. -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) #define MAYBE_VerifyCanvasWebGLCaptureColor \ DISABLED_VerifyCanvasWebGLCaptureColor #else
diff --git a/content/gpu/gpu_sandbox_hook_linux.cc b/content/gpu/gpu_sandbox_hook_linux.cc index ffe939f..a35dc32a 100644 --- a/content/gpu/gpu_sandbox_hook_linux.cc +++ b/content/gpu/gpu_sandbox_hook_linux.cc
@@ -287,13 +287,9 @@ } void AddArmGpuPermissions(std::vector<BrokerFilePermission>* permissions) { - // On ARM we're enabling the sandbox before the X connection is made, - // so we need to allow access to |.Xauthority|. - static const char kXAuthorityPath[] = "/home/chronos/.Xauthority"; static const char kLdSoCache[] = "/etc/ld.so.cache"; // Files needed by the ARM GPU userspace. - permissions->push_back(BrokerFilePermission::ReadOnly(kXAuthorityPath)); permissions->push_back(BrokerFilePermission::ReadOnly(kLdSoCache)); permissions->push_back(BrokerFilePermission::ReadOnly(kLibGlesPath)); permissions->push_back(BrokerFilePermission::ReadOnly(kLibEglPath));
diff --git a/docs/updater/functional_spec.md b/docs/updater/functional_spec.md index c232461..a1cfdb68 100644 --- a/docs/updater/functional_spec.md +++ b/docs/updater/functional_spec.md
@@ -29,7 +29,15 @@ PE. The tag is supported for both EXE and MSI formats. #### Tag Format -TODO(crbug.com/1328903) - document the rest of the tag format. +Tags have a format of a UTF-8 string `Gact2.0Omaha{length}{tag}`, where +`{length}` is a big-endian uint16, and `{tag}` is `{length}` bytes long. + +The format of the `{tag}` piece is further documented in +[tag.h](https://chromium.googlesource.com/chromium/src/+/main/chrome/updater/tag.h#159). + +The project also contains code used by non-Google embedders to support UTF-16 +tags of the format `Gact2.0Omaha{tag}ahamO0.2tcaG`, but Chromium-branded and +Google-branded builds assume the first case. ##### Brand code The brand code is a string of up to 4 characters long. The brand code is @@ -45,12 +53,14 @@ translated. ### Bundle Installer +TODO(crbug.com/1035895): Implement bundle installers. + The bundle installer allows installation of more than one application. The bundle installer is typically used in software distribution scenarios. -TODO(crbug.com/1035895): Document bundled installers. - ### Standalone Installer +TODO(crbug.com/1281688): Implement standalone installers. + TODO(crbug.com/1035895): Document the standalone installer, including building a standalone installer for a given application. @@ -65,15 +75,13 @@ 2. when downloading the application payload is not desirable for any reason. 3. during OEM installation. -TODO(crbug.com/1139014): Document OEM. - Applications on macOS frequently install via "drag-install", and then install the updater using a standalone installer on the application's first-run. The updater app can be embedded in a macOS application bundle as a helper and then invoked with appropriate command line arguments to install itself. ### MSI Wrapper -TODO(crbug.com/1327497) - document. +TODO(crbug.com/1327497) - Implement and document. ### Scope The updater is installed in one of the following modes (or scopes): @@ -262,20 +270,14 @@ with its own. ### Installer User Interface -TODO(crbug.com/1035895): Document UI/UX. +During installation, the user is presented with a UI that displays the progress +of the download and installation. The user may close the dialog, which cancels +the installation. A cancelled installation still results in an event ping to +the server indicating an installation failure. -The user interface is localized in the following languages: TBD. +The user interface is localized in the same languages as the Chromium project. -TODO(crbug.com/1014591): Implement install cancellation, including cancellation -ping. - -The install flow can be stopped before the payload finishes downloading. In this -case, the event ping associated with the install attempt will be sent with an -`eventresult` of 4 (cancelled). - -TODO(crbug.com/1286580): Implement silent mode. - -Has a silent mode where the UI is not displayed at all. +TODO(crbug.com/1286580): Implement and document silent mode. #### Help Button If the installation fails, the updater shows an error message with a "Help" @@ -283,15 +285,6 @@ The page is opened with a query string: `?product={AppId}&errorcode={ErrorCode}`. -### Install Source - -TODO(crbug.com/1327491) - Implement the following algorithm. - -The `installsource` identifies the originator of an install. It is provided on -the command line of the metainstaller. - -TODO(crbug.com/1327491) - is this needed? If yes, document the algorithm. - ## Updates There is no limit for the number of retries to update an application if the update fails repeatedly. @@ -337,7 +330,9 @@ update). #### Usage Counts -TODO(crbug.com/1329328) - document the client responsibilities. +The updater implements [date-last counting](protocol_3_1.md#User-Counting), +allowing servers to anonymously count the number of active updaters and +applications. #### Cohort Tracking The client records the `cohort`, `cohortname`, and `cohorthint` values from the @@ -353,15 +348,27 @@ for longer than this, the updater assumes failure and continues operation. However, the updater does not kill the installer process. -The macOS API is [defined here](installer_api_mac.md). +The application installer API varies by platform. [macOS](installer_api_mac.md), [Windows](https://chromium.googlesource.com/chromium/src/+/main/chrome/updater/win/installer_api.h). -TODO(crbug.com/1035895): Document Windows installer APIs - -TODO(crbug.com/1339454): Run installers at BELOW_NORMAL_PRIORITY_CLASS if the -update flow is a background flow. +TODO(crbug.com/1339454): Implement running installers at +BELOW_NORMAL_PRIORITY_CLASS if the update flow is a background flow. ### Enterprise Enrollment -TODO(crbug.com/1339451): Document enterprise enrollment and the token. +The updater may be enrolled with a particular enterprise. Enrollment is +coordinated with a device management server by means of an enrollment token and +a device management token. The enrollment token is placed on the device by other +programs or the enterprise administrator and serves as an indicator of which +enterprise the device should attempt to enroll with. The updater sends the +enrollment token, along with the device's machine name, os information, and +(on Windows) BIOS serial number. If the server accepts the enrollment, it +responds with a device-specific device management token, which is used in +future requests to fetch device-specific policies from the device management +server. + +TODO(crbug.com/1339451): Document location of enrollment token. + +TODO(crbug.com/1339451): Document timing of enterprise enrollment and policy +fetches. ### Enterprise Policies Enterprise policies can prevent the installation of applications: @@ -372,6 +379,20 @@ Refer to chrome/updater/protos/omaha\_settings.proto for more details. +Policies may be set by platform-specific means (group policy on Windows, managed +preferences on macOS), or by communication with the device management server. + +TODO(crbug.com/1339451): Document how conflicts between multiple policy sources +are resolved. + +#### Deploying enterprise applications via updater policy +For each application that needs to be deployed via the updater, the policy for +that application can be set to either `Force installs (system wide)` or `Force +installs (per user)`. + +The updater then downloads and installs the application on all machines where +the policy is deployed, and where the application is not already installed. + ### Dynamic Install Parameters #### `needsadmin` @@ -550,9 +571,7 @@ publisher key. The corresponding public key is hardcoded into the updater. ### Differential Updates -TODO(crbug.com/1035895): Document differential updates. - -TODO(crbug.com/1331030): Implement differential update support. +TODO(crbug.com/1331030): Implement and document differential update support. ### Update Timing The updater runs periodic tasks every hour, checking its own status, detecting @@ -584,12 +603,10 @@ The update tasks are scheduled using the OS task scheduler. The time resolution for tasks is 1 minute. Tasks are set to run 5 minutes after -they've been created. +they've been created. If a task execution is missed, it will run as soon as the +system is able to. -TODO(crbug.com/1328935): implement built in task scheduler as a failover -mechanism - -TODO(crbug.com/1035895): Does the updater run at user login on Windows? +The updater also runs at user login. ### On-Demand Updates The updater exposes an RPC interface for any user to trigger an update check. @@ -654,14 +671,6 @@ * The updater searches the file system for Crashpad directories belonging to {Company}. -### Enterprise Policies -TODO(crbug.com/1035895): Document relevant enterprise policies. - -#### Windows -TODO(crbug.com/1035895): Implement this section. (ADMX file export.) - -ADMX templates are provided. - ### Telemetry When the updater installs an application (an installer is run) it sends an event with `"eventtype": 2` indicating the outcome of installation. The updater @@ -707,9 +716,13 @@ ## Services ### Crash Reporting -TODO(crbug.com/1035895): Document updater crash reporting. +The updater uses Crashpad for crash reporting. Each updater process spawns a +crash handler child process. Each crash handler process is capable of uploading +crashes. -### Process Launcher (Deprecated, please use the Application Commands feature) +### Process Launcher +(This feature is deprecated, please use the Application Commands feature.) + The feature allows installed products to pre-register and later run elevated command lines in the format `c:\program files\foo\exe.exe params`. Multiple command lines can be registered per `app_id`. @@ -889,18 +902,8 @@ directory. ### Tagging Tools -TODO(crbug.com/1035895): Document tagging tools. - -## Updater for the enterprise - -TODO(crbug.com/1347910): Document updater for the enterprise. - -### Deploying enterprise applications via updater policy - -For each application that needs to be deployed via the updater, the policy for -that application can be set to either `Force installs (system wide)` or `Force -installs (per user)`. - -The updater then downloads and installs the application on all machines where -the policy is deployed, and where the application is not already installed. - +The project contains a helper tool for tagging called `certificate_tag.exe`. +This tool can be +[used](https://chromium.googlesource.com/chromium/src/+/main/chrome/updater/tools/main.cc#59) +to inject a superfluous certificate into a signed binary to support the +creation of tagged binaries.
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc index 01455f3..60567f3 100644 --- a/extensions/common/extension_features.cc +++ b/extensions/common/extension_features.cc
@@ -100,7 +100,7 @@ // creating the script context too early which can be bad for performance. const base::Feature kAvoidEarlyExtensionScriptContextCreation{ "AvoidEarlyExtensionScriptContextCreation", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // The feature enabling offscreen documents in Manifest V3 extensions. const base::Feature kExtensionsOffscreenDocuments{
diff --git a/extensions/renderer/bindings/api_signature.cc b/extensions/renderer/bindings/api_signature.cc index b69948f..efd246b 100644 --- a/extensions/renderer/bindings/api_signature.cc +++ b/extensions/renderer/bindings/api_signature.cc
@@ -353,9 +353,12 @@ } // A required argument was not matched. There is only one case in which this - // is allowed: a required callback when Promises are supported instead; if - // this is the case, |allow_omitted_final_argument| is true. - if (allow_omitted_final_argument && expected.size() == 1) { + // is allowed: a required callback has been left off of the provided arguments + // when Promises are supported; if this is the case, + // |allow_omitted_final_argument| is true and there should be no provided + // arguments left. + if (allow_omitted_final_argument && provided.size() == 0 && + expected.size() == 1) { (*result)[index] = v8::Local<v8::Value>(); return true; }
diff --git a/extensions/renderer/bindings/api_signature_unittest.cc b/extensions/renderer/bindings/api_signature_unittest.cc index 5869cf5b..fe9594c 100644 --- a/extensions/renderer/bindings/api_signature_unittest.cc +++ b/extensions/renderer/bindings/api_signature_unittest.cc
@@ -826,7 +826,15 @@ &access_checker); ExpectPass(*required_callback_signature, "[]", "[]", binding::AsyncResponseType::kPromise); - // If the context doesn't support promises, parsing should fail. + + // Ensure that the promise support allowing the final argument to be + // optional doesn't mean we can ignore it entirely if it doesn't match the + // signature. See: http://crbug.com/1350315 + ExpectFailure(*required_callback_signature, "['foo']", + NoMatchingSignature()); + + // If the context doesn't support promises, parsing should fail if the + // required callback is left off. context_allows_promises = false; ExpectFailure(*required_callback_signature, "[]", NoMatchingSignature()); }
diff --git a/fuchsia_web/webengine/BUILD.gn b/fuchsia_web/webengine/BUILD.gn index feb5b650..bf3cc6e 100644 --- a/fuchsia_web/webengine/BUILD.gn +++ b/fuchsia_web/webengine/BUILD.gn
@@ -140,15 +140,12 @@ assert_no_deps = _disallowed_deps deps = [ + ":cast_streaming_receiver", ":context_provider", ":switches", ":web_engine_export_from_implementation", "//base", "//base:base_static", - "//components/cast/message_port:message_port_fuchsia", - "//components/cast_streaming/browser", - "//components/cast_streaming/public:config_conversions", - "//components/cast_streaming/public/mojom", "//components/cast_streaming/renderer", "//components/cdm/renderer", "//components/client_hints/browser:in_memory", @@ -273,8 +270,6 @@ "browser/navigation_policy_handler.h", "browser/navigation_policy_throttle.cc", "browser/navigation_policy_throttle.h", - "browser/receiver_session_client.cc", - "browser/receiver_session_client.h", "browser/theme_manager.cc", "browser/theme_manager.h", "browser/url_request_rewrite_type_converters.cc", @@ -301,8 +296,6 @@ "browser/web_engine_net_log_observer.h", "browser/web_engine_permission_delegate.cc", "browser/web_engine_permission_delegate.h", - "common/cast_streaming.cc", - "common/cast_streaming.h", "common/cors_exempt_headers.cc", "common/cors_exempt_headers.h", "common/web_engine_content_client.cc", @@ -514,7 +507,6 @@ "browser/accessibility_bridge_browsertest.cc", "browser/accessibility_browsertest.cc", "browser/autoplay_browsertest.cc", - "browser/cast_streaming_browsertest.cc", "browser/client_hints_browsertest.cc", "browser/content_directory_browsertest.cc", "browser/context_impl_browsertest.cc", @@ -552,12 +544,9 @@ defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] deps = [ ":browsertest_core", + ":cast_streaming_receiver_browsertests", ":switches", ":web_engine_core", - "//base/test:test_support", - "//components/cast/message_port:message_port", - "//components/cast_streaming/browser", - "//components/cast_streaming/browser:test_sender", "//components/policy/content:safe_sites_navigation_throttle", "//components/safe_search_api:safe_search_api", "//components/safe_search_api:test_support", @@ -653,13 +642,12 @@ "//ui/events:test_support", "//ui/ozone", ] - use_cfv2 = false - additional_manifest_fragments = [ - # TODO(crbug.com/1185811): Figure out why jit_capabilities is needed. - "//build/config/fuchsia/test/jit_capabilities.test-cmx", + use_cfv1 = false - "//build/config/fuchsia/test/network_capabilities.test-cmx", - "//build/config/fuchsia/test/vulkan_capabilities.test-cmx", + additional_manifest_fragments = [ + "//build/config/fuchsia/test/cfv1_launcher.shard.test-cml", + "//build/config/fuchsia/test/network.shard.test-cml", + "//media/fuchsia/test_support.shard.test-cml", ] additional_manifests = [ # Required by ContextProvider unit-tests to launch the FakeContext process. @@ -714,3 +702,41 @@ "//build/config/fuchsia/test/web_instance_host_capabilities.test-cmx", ] } + +source_set("cast_streaming_receiver") { + public_deps = [ + "//base", + "//components/cast_streaming/browser", + "//components/cast_streaming/public/mojom", + "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.web", + ] + deps = [ + ":switches", + "//components/cast/message_port", + "//components/cast_streaming/public:config_conversions", + "//url", + ] + sources = [ + "browser/receiver_session_client.cc", + "browser/receiver_session_client.h", + "common/cast_streaming.cc", + "common/cast_streaming.h", + ] +} + +source_set("cast_streaming_receiver_browsertests") { + testonly = true + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + sources = [ "browser/cast_streaming_browsertest.cc" ] + deps = [ + ":browsertest_core", + ":web_engine_core", + "//components/cast/message_port", + "//components/cast_streaming/browser:test_sender", + + # TODO(crbug.com/1348698): Remove this when test_sender provides all deps. + "//components/openscreen_platform:openscreen_platform_network_service", + "//content/test:test_support", + "//fuchsia_web/common/test:test_support", + ] +}
diff --git a/fuchsia_web/webengine/browser/DEPS b/fuchsia_web/webengine/browser/DEPS index 15da599e..aafd36c 100644 --- a/fuchsia_web/webengine/browser/DEPS +++ b/fuchsia_web/webengine/browser/DEPS
@@ -34,7 +34,6 @@ "+services/network/public/mojom", "+services/resource_coordinator/public", "+third_party/blink/public", - "+third_party/openscreen/src", "+third_party/skia/include/core", "+third_party/widevine/cdm", "+ui/accessibility",
diff --git a/fuchsia_web/webengine/browser/receiver_session_client.cc b/fuchsia_web/webengine/browser/receiver_session_client.cc index 9626395..089d165f 100644 --- a/fuchsia_web/webengine/browser/receiver_session_client.cc +++ b/fuchsia_web/webengine/browser/receiver_session_client.cc
@@ -9,6 +9,7 @@ #include "components/cast/message_port/message_port.h" #include "components/cast_streaming/browser/public/receiver_session.h" #include "components/cast_streaming/public/config_conversions.h" +#include "components/cast_streaming/public/mojom/demuxer_connector.mojom.h" #include "media/base/audio_decoder_config.h" #include "media/base/video_decoder_config.h" @@ -38,7 +39,7 @@ media::VideoCodec::kH264, #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) media::VideoCodec::kVP8), - video_only_receiver_ ? std::vector<openscreen::cast::AudioCodec>() + video_only_receiver_ ? cast_streaming::ToAudioCaptureConfigCodecs() : cast_streaming::ToAudioCaptureConfigCodecs( #if BUILDFLAG(USE_PROPRIETARY_CODECS) media::AudioCodec::kAAC,
diff --git a/fuchsia_web/webengine/browser/receiver_session_client.h b/fuchsia_web/webengine/browser/receiver_session_client.h index 1e69cd3..dd1d717 100644 --- a/fuchsia_web/webengine/browser/receiver_session_client.h +++ b/fuchsia_web/webengine/browser/receiver_session_client.h
@@ -7,10 +7,8 @@ #include <fuchsia/web/cpp/fidl.h> -#include "base/callback.h" #include "components/cast_streaming/public/mojom/demuxer_connector.mojom.h" #include "mojo/public/cpp/bindings/associated_remote.h" -#include "third_party/openscreen/src/cast/common/public/message_port.h" namespace cast_streaming { class ReceiverSession;
diff --git a/gpu/command_buffer/client/raster_interface.h b/gpu/command_buffer/client/raster_interface.h index 72fed25..77ba6b63 100644 --- a/gpu/command_buffer/client/raster_interface.h +++ b/gpu/command_buffer/client/raster_interface.h
@@ -48,6 +48,7 @@ RasterInterface() {} virtual ~RasterInterface() {} + // This function will not perform any color conversion during the copy. virtual void CopySubTexture(const gpu::Mailbox& source_mailbox, const gpu::Mailbox& dest_mailbox, GLenum dest_target,
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 40c3b4e..f4870a8 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -2273,7 +2273,17 @@ DCHECK_EQ(unpack_flip_y, source_shared_image->surface_origin() != dest_shared_image->surface_origin()); paint.setBlendMode(SkBlendMode::kSrc); - canvas->drawImageRect(source_image, gfx::RectToSkRect(source_rect), + + // Reinterpret the source image as being in the destination color space, to + // disable color conversion. + auto source_image_reinterpreted = source_image; + if (canvas->imageInfo().colorSpace()) { + source_image_reinterpreted = source_image->reinterpretColorSpace( + canvas->imageInfo().refColorSpace()); + } + + canvas->drawImageRect(source_image_reinterpreted, + gfx::RectToSkRect(source_rect), gfx::RectToSkRect(dest_rect), SkSamplingOptions(), &paint, SkCanvas::kStrict_SrcRectConstraint);
diff --git a/headless/BUILD.gn b/headless/BUILD.gn index 52652ba..a9d6866 100644 --- a/headless/BUILD.gn +++ b/headless/BUILD.gn
@@ -379,6 +379,8 @@ "lib/browser/headless_request_context_manager.h", "lib/browser/headless_select_file_dialog_factory.cc", "lib/browser/headless_select_file_dialog_factory.h", + "lib/browser/headless_web_contents_impl.cc", + "lib/browser/headless_web_contents_impl.h", "lib/browser/headless_window_tree_host.h", "lib/browser/protocol/browser_handler.cc", "lib/browser/protocol/browser_handler.h", @@ -462,6 +464,7 @@ "//components/cookie_config", "//components/embedder_support", "//components/keyed_service/content", + "//components/os_crypt:os_crypt", "//components/policy:generated", "//components/policy/core/browser", "//components/policy/core/common:common_constants", @@ -491,6 +494,7 @@ deps += [ "//components/printing/browser", "//components/printing/browser/headless", + "//components/printing/browser/print_to_pdf:print_to_pdf", "//components/printing/common:mojo_interfaces", "//printing", "//printing/mojom", @@ -501,8 +505,6 @@ sources += [ "lib/browser/headless_content_browser_client.cc", "lib/browser/headless_content_browser_client.h", - "lib/browser/headless_web_contents_impl.cc", - "lib/browser/headless_web_contents_impl.h", "lib/headless_content_main_delegate.cc", "lib/headless_content_main_delegate.h", "lib/renderer/headless_content_renderer_client.cc", @@ -667,6 +669,7 @@ } if (enable_basic_printing) { deps += [ + "//components/printing/browser/headless:headless", "//components/printing/renderer", "//components/services/print_compositor", "//components/services/print_compositor/public/mojom", @@ -901,6 +904,7 @@ deps = [ ":headless_non_renderer", "//build:branding_buildflags", + "//components/crash/core/app:app", "//components/crash/core/app:run_as_crashpad_handler", "//components/embedder_support", "//content:sandbox_helper_win", @@ -914,6 +918,9 @@ if (headless_use_policy) { deps += [ "//components/policy/content" ] } + if (enable_basic_printing) { + deps += [ "//components/printing/browser/headless:headless" ] + } configs += [ ":headless_defines_config" ] } } @@ -968,6 +975,7 @@ if (enable_basic_printing) { deps += [ "//components/printing/browser", + "//components/printing/browser/headless:headless", "//components/printing/renderer", "//components/services/print_compositor", "//components/services/print_compositor/public/mojom",
diff --git a/headless/lib/browser/headless_browser_context_impl.h b/headless/lib/browser/headless_browser_context_impl.h index 9774ec3..a0fcdf3 100644 --- a/headless/lib/browser/headless_browser_context_impl.h +++ b/headless/lib/browser/headless_browser_context_impl.h
@@ -19,7 +19,6 @@ #include "content/public/browser/resource_context.h" #include "headless/lib/browser/headless_browser_context_options.h" #include "headless/lib/browser/headless_request_context_manager.h" -#include "headless/public/headless_browser.h" #include "headless/public/headless_browser_context.h" #include "headless/public/headless_export.h" #include "mojo/public/cpp/bindings/remote.h"
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc index 2052711..4a83931 100644 --- a/headless/lib/browser/headless_content_browser_client.cc +++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -49,8 +49,8 @@ #include "ui/gfx/switches.h" #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -#include "components/crash/core/app/crash_switches.h" -#include "components/crash/core/app/crashpad.h" +#include "components/crash/core/app/crash_switches.h" // nogncheck +#include "components/crash/core/app/crashpad.h" // nogncheck #include "content/public/common/content_descriptors.h" #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/headless/lib/headless_content_main_delegate.h b/headless/lib/headless_content_main_delegate.h index 7bc062d..4ea68e86 100644 --- a/headless/lib/headless_content_main_delegate.h +++ b/headless/lib/headless_content_main_delegate.h
@@ -8,12 +8,10 @@ #include <memory> #include <string> -#include "base/compiler_specific.h" #include "build/build_config.h" #include "content/public/app/content_main_delegate.h" #include "content/public/browser/content_browser_client.h" #include "content/public/renderer/content_renderer_client.h" -#include "headless/lib/browser/headless_platform_event_source.h" #include "headless/lib/headless_content_client.h" #include "headless/public/headless_browser.h" #include "headless/public/headless_export.h" @@ -79,7 +77,6 @@ std::unique_ptr<content::ContentBrowserClient> browser_client_; std::unique_ptr<content::ContentUtilityClient> utility_client_; HeadlessContentClient content_client_; - HeadlessPlatformEventSource platform_event_source_; std::unique_ptr<HeadlessBrowserImpl> browser_; std::unique_ptr<HeadlessBrowser::Options> options_;
diff --git a/headless/public/headless_browser.h b/headless/public/headless_browser.h index b1ae01e..d4fada3 100644 --- a/headless/public/headless_browser.h +++ b/headless/public/headless_browser.h
@@ -14,12 +14,9 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" #include "build/build_config.h" #include "headless/public/headless_browser_context.h" -#include "headless/public/headless_devtools_channel.h" #include "headless/public/headless_export.h" -#include "headless/public/headless_web_contents.h" #include "net/base/host_port_pair.h" #include "ui/gfx/font_render_params.h" #include "ui/gfx/geometry/size.h" @@ -35,6 +32,9 @@ namespace headless { +class HeadlessDevToolsChannel; +class HeadlessWebContents; + // This class represents the global headless browser instance. To get a pointer // to one, call |HeadlessBrowserMain| to initiate the browser main loop. An // instance of |HeadlessBrowser| will be passed to the callback given to that
diff --git a/headless/public/headless_browser_context.h b/headless/public/headless_browser_context.h index f8e9dd2a8..71772519 100644 --- a/headless/public/headless_browser_context.h +++ b/headless/public/headless_browser_context.h
@@ -12,7 +12,6 @@ #include "base/callback.h" #include "base/memory/raw_ptr.h" -#include "content/public/browser/browser_context.h" #include "headless/public/headless_export.h" #include "headless/public/headless_web_contents.h" #include "net/proxy_resolution/proxy_resolution_service.h"
diff --git a/ios/chrome/browser/follow/follow_tab_helper.mm b/ios/chrome/browser/follow/follow_tab_helper.mm index b6966fd..2e101647 100644 --- a/ios/chrome/browser/follow/follow_tab_helper.mm +++ b/ios/chrome/browser/follow/follow_tab_helper.mm
@@ -168,7 +168,14 @@ // Always show IPH for eligible website if experimental setting is enabled. if (experimental_flags::ShouldAlwaysShowFollowIPH()) { + // Set up the recommended url property for storing the IPH displaying event, + // otherwise it will crash when trying to store a nil value into the last + // follow IPH display event. It needs to be restored after removing the IPH + // display event from the experiment. + recommended_url_ = web_page_urls.webPageURL; PresentFollowIPH(); + // Restore the recommended url. + recommended_url_ = nil; return; } @@ -269,8 +276,11 @@ void FollowTabHelper::PresentFollowIPH() { DCHECK(follow_iph_presenter_); [follow_iph_presenter_ presentFollowWhileBrowsingIPH]; - if (!experimental_flags::ShouldAlwaysShowFollowIPH()) { - StoreFollowIPHDisplayEvent(recommended_url_.host); + StoreFollowIPHDisplayEvent(recommended_url_.host); + if (experimental_flags::ShouldAlwaysShowFollowIPH()) { + // Remove the follow IPH display event that just added because it's + // triggered by experimental settings. + RemoveLastFollowIPHDisplayEvent(); } }
diff --git a/ios/chrome/browser/follow/follow_util.h b/ios/chrome/browser/follow/follow_util.h index 85fc8c7d..bcb72c3 100644 --- a/ios/chrome/browser/follow/follow_util.h +++ b/ios/chrome/browser/follow/follow_util.h
@@ -11,8 +11,6 @@ class WebState; } -// Key used to store the last shown time of follow in-product help (IPH). -extern NSString* const kFollowIPHLastShownTime; // Key used to store the last shown event of follow in-product help (IPH). extern NSString* const kFollowIPHPreviousDisplayEvents; // Key used to store the site host when showing the follow in-product help @@ -30,5 +28,10 @@ bool IsFollowIPHShownFrequencyEligible(NSString* host); // Stores the Follow IPH display event with website `host`. void StoreFollowIPHDisplayEvent(NSString* host); +// Removes the last follow IPH event, this is called when follow IPH is +// triggered by experimental settings. +// TODO(crbug.com/1340154): Remove the method when removing follow IPH +// experimental setting. +void RemoveLastFollowIPHDisplayEvent(); #endif // IOS_CHROME_BROWSER_FOLLOW_FOLLOW_UTIL_H_
diff --git a/ios/chrome/browser/follow/follow_util.mm b/ios/chrome/browser/follow/follow_util.mm index 2e786a1..78a5639 100644 --- a/ios/chrome/browser/follow/follow_util.mm +++ b/ios/chrome/browser/follow/follow_util.mm
@@ -26,7 +26,6 @@ 24 * 60 * 60; } // namespace -NSString* const kFollowIPHLastShownTime = @"FollowIPHLastShownTime"; NSString* const kFollowIPHPreviousDisplayEvents = @"FollowIPHPreviousDisplayEvents"; NSString* const kFollowIPHHost = @"host"; @@ -66,15 +65,6 @@ #pragma mark - For Follow IPH bool IsFollowIPHShownFrequencyEligible(NSString* host) { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; - NSDate* lastFollowIPHShownTime = - [defaults objectForKey:kFollowIPHLastShownTime]; - // Return false if its too soon to show another IPH. - if (lastFollowIPHShownTime && - [[NSDate - dateWithTimeIntervalSinceNow:-kFollowIPHAppearanceThresholdInSeconds] - compare:lastFollowIPHShownTime] == NSOrderedAscending) { - return false; - } NSArray<NSDictionary*>* followIPHPreviousDisplayEvents = [defaults objectForKey:kFollowIPHPreviousDisplayEvents]; @@ -86,6 +76,14 @@ } } + // Return false if its too soon to show another IPH. + if (lastIPHDate && + [[NSDate + dateWithTimeIntervalSinceNow:-kFollowIPHAppearanceThresholdInSeconds] + compare:lastIPHDate] == NSOrderedAscending) { + return false; + } + // Return true if it is long enough to show another IPH for this specific // site. if (!lastIPHDate || @@ -129,3 +127,19 @@ forKey:kFollowIPHPreviousDisplayEvents]; [defaults synchronize]; } + +void RemoveLastFollowIPHDisplayEvent() { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSArray<NSDictionary*>* followIPHPreviousDisplayEvents = + [defaults objectForKey:kFollowIPHPreviousDisplayEvents]; + + DCHECK(followIPHPreviousDisplayEvents); + + NSMutableArray<NSDictionary*>* updatedDisplayEvents = + [followIPHPreviousDisplayEvents mutableCopy]; + [updatedDisplayEvents removeLastObject]; + + [defaults setObject:updatedDisplayEvents + forKey:kFollowIPHPreviousDisplayEvents]; + [defaults synchronize]; +}
diff --git a/ios/chrome/browser/follow/follow_util_unittest.mm b/ios/chrome/browser/follow/follow_util_unittest.mm index 3ea02a6..4de89a42 100644 --- a/ios/chrome/browser/follow/follow_util_unittest.mm +++ b/ios/chrome/browser/follow/follow_util_unittest.mm
@@ -50,19 +50,12 @@ // displayed. EXPECT_TRUE(IsFollowIPHShownFrequencyEligible(@"now.com")); - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; - - NSDate* tenMinutes = [NSDate dateWithTimeIntervalSinceNow:-60 * 10]; - [defaults setObject:tenMinutes forKey:kFollowIPHLastShownTime]; + StoreFollowIPHDisplayEvent(@"now.com"); // Test Follow IPH can not be shown within 15 minutes from a previous Follow // IPH. EXPECT_FALSE(IsFollowIPHShownFrequencyEligible(@"now.com")); SetFollowIPHShowTimeArray(); - // Set the IPH last show time, it should be the same as date3/ghi.com in - // practice. - [defaults setObject:[NSDate dateWithTimeIntervalSinceNow:-3600 * 20] - forKey:kFollowIPHLastShownTime]; // Test Follow IPH can be shown for specific host if no Follow IPH has been // shown ever for it. EXPECT_TRUE(IsFollowIPHShownFrequencyEligible(@"now.com")); @@ -93,3 +86,19 @@ EXPECT_TRUE([[updatedArray[1] objectForKey:kFollowIPHHost] isEqualToString:@"now.com"]); } + +// Tests removing the last follow IPH display event. +TEST_F(FollowUtilTest, TestRemoveLastFollowIPHDisplayEvent) { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + SetFollowIPHShowTimeArray(); + ASSERT_EQ( + 3, (int)[[defaults objectForKey:kFollowIPHPreviousDisplayEvents] count]); + RemoveLastFollowIPHDisplayEvent(); + NSArray<NSDictionary*>* updatedArray = + [defaults objectForKey:kFollowIPHPreviousDisplayEvents]; + EXPECT_EQ(2, (int)updatedArray.count); + EXPECT_TRUE([[updatedArray[0] objectForKey:kFollowIPHHost] + isEqualToString:@"abc.com"]); + EXPECT_TRUE([[updatedArray[1] objectForKey:kFollowIPHHost] + isEqualToString:@"def.com"]); +}
diff --git a/ios/chrome/browser/ios_chrome_main_parts.mm b/ios/chrome/browser/ios_chrome_main_parts.mm index b4248cf..5aa9a568 100644 --- a/ios/chrome/browser/ios_chrome_main_parts.mm +++ b/ios/chrome/browser/ios_chrome_main_parts.mm
@@ -61,6 +61,7 @@ #include "ios/chrome/browser/open_from_clipboard/create_clipboard_recent_content.h" #include "ios/chrome/browser/policy/browser_policy_connector_ios.h" #include "ios/chrome/browser/pref_names.h" +#import "ios/chrome/browser/promos_manager/promos_manager.h" #import "ios/chrome/browser/safe_browsing/safe_browsing_metrics_collector_factory.h" #import "ios/chrome/browser/signin/signin_util.h" #include "ios/chrome/browser/translate/chrome_ios_translate_client.h" @@ -398,6 +399,10 @@ // Set monitoring for some experimental flags. MonitorExperimentalSettingsChanges(); + + // Ensure the Fullscren Promos Manager is initialized. + PromosManager* promos_manager = application_context_->GetPromosManager(); + promos_manager->Init(); } void IOSChromeMainParts::PostMainMessageLoopRun() {
diff --git a/ios/chrome/browser/promos_manager/BUILD.gn b/ios/chrome/browser/promos_manager/BUILD.gn index 258c3fc8..f0bac0a 100644 --- a/ios/chrome/browser/promos_manager/BUILD.gn +++ b/ios/chrome/browser/promos_manager/BUILD.gn
@@ -24,3 +24,18 @@ configs += [ "//build/config/compiler:enable_arc" ] deps = [ "//base" ] } + +source_set("unit_tests") { + testonly = true + sources = [ "promos_manager_unittest.mm" ] + deps = [ + ":promos_manager", + "//base", + "//components/prefs", + "//components/prefs:test_support", + "//ios/chrome/browser:pref_names", + "//testing/gmock", + "//testing/gtest", + ] + configs += [ "//build/config/compiler:enable_arc" ] +}
diff --git a/ios/chrome/browser/promos_manager/promos_manager.mm b/ios/chrome/browser/promos_manager/promos_manager.mm index e67ecc6..aaa22660 100644 --- a/ios/chrome/browser/promos_manager/promos_manager.mm +++ b/ios/chrome/browser/promos_manager/promos_manager.mm
@@ -10,6 +10,7 @@ #import "base/values.h" #import "components/prefs/pref_service.h" #import "ios/chrome/browser/pref_names.h" +#import "ios/chrome/browser/promos_manager/features.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -28,6 +29,9 @@ #pragma mark - Public methods void PromosManager::Init() { + if (!IsFullscreenPromosManagerEnabled()) + return; + DCHECK(local_state_); const base::Value::List& stored_active_promos =
diff --git a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm b/ios/chrome/browser/promos_manager/promos_manager_unittest.mm new file mode 100644 index 0000000..0525385 --- /dev/null +++ b/ios/chrome/browser/promos_manager/promos_manager_unittest.mm
@@ -0,0 +1,53 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/promos_manager/promos_manager.h" + +#import "components/prefs/pref_registry_simple.h" +#import "components/prefs/testing_pref_service.h" +#import "ios/chrome/browser/pref_names.h" +#import "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +class PromosManagerTest : public PlatformTest { + public: + PromosManagerTest() {} + + protected: + // Creates PromosManager with empty pref data. + void CreatePromosManager() { + CreatePrefs(); + promos_manager_ = std::make_unique<PromosManager>(local_state_.get()); + } + + // Create pref registry for tests. + void CreatePrefs() { + local_state_ = std::make_unique<TestingPrefServiceSimple>(); + local_state_->registry()->RegisterDictionaryPref( + prefs::kIosPromosManagerImpressionHistory); + local_state_->registry()->RegisterListPref( + prefs::kIosPromosManagerActivePromos); + } + + std::unique_ptr<TestingPrefServiceSimple> local_state_; + std::unique_ptr<PromosManager> promos_manager_; +}; + +// Tests the initializer correctly creates a PromosManager* with the +// specified Pref service. +TEST_F(PromosManagerTest, InitWithPrefService) { + CreatePromosManager(); + + EXPECT_NE( + local_state_->FindPreference(prefs::kIosPromosManagerImpressionHistory), + nullptr); + EXPECT_NE(local_state_->FindPreference(prefs::kIosPromosManagerActivePromos), + nullptr); + EXPECT_FALSE( + local_state_->HasPrefPath(prefs::kIosPromosManagerImpressionHistory)); + EXPECT_FALSE(local_state_->HasPrefPath(prefs::kIosPromosManagerActivePromos)); +}
diff --git a/ios/chrome/browser/ui/bubble/BUILD.gn b/ios/chrome/browser/ui/bubble/BUILD.gn index 8a5fdb076..a3182f75 100644 --- a/ios/chrome/browser/ui/bubble/BUILD.gn +++ b/ios/chrome/browser/ui/bubble/BUILD.gn
@@ -26,7 +26,6 @@ "//ios/chrome/browser:utils", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/feature_engagement", - "//ios/chrome/browser/follow:utils", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/icons:symbols", "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/bubble/bubble_presenter.mm b/ios/chrome/browser/ui/bubble/bubble_presenter.mm index d6afa0b..8bd9b8d4 100644 --- a/ios/chrome/browser/ui/bubble/bubble_presenter.mm +++ b/ios/chrome/browser/ui/bubble/bubble_presenter.mm
@@ -14,7 +14,6 @@ #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/feature_engagement/tracker_factory.h" -#import "ios/chrome/browser/follow/follow_util.h" #import "ios/chrome/browser/system_flags.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter_delegate.h" #import "ios/chrome/browser/ui/bubble/bubble_util.h" @@ -247,12 +246,6 @@ return; self.followWhileBrowsingBubbleTipPresenter = presenter; - - // Store the time when showing the Follow IPH. Set it everytime so the value - // in NSUserDefault is always the last time a Follow IPH was shown. - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; - [defaults setObject:[NSDate date] forKey:kFollowIPHLastShownTime]; - [defaults synchronize]; } - (void)presentDefaultSiteViewTipBubble {
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn index 84c1e7409..fadf3dfa3 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/feed_top_section/BUILD.gn
@@ -27,6 +27,7 @@ "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/coordinators:chrome_coordinators", + "//ios/chrome/browser/ui/ntp", "//ios/chrome/browser/ui/ntp:constants", "//ios/chrome/browser/ui/ntp:feature_flags", "//ios/chrome/common/ui/colors",
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h index d7be4fd..ffb98390 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h
@@ -9,11 +9,16 @@ #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" +@protocol NewTabPageDelegate; + // The top-level owner of the feed top section. @interface FeedTopSectionCoordinator : ChromeCoordinator @property(nonatomic, readonly, strong) UIViewController* viewController; +// Delegate for NTP related actions. +@property(nonatomic, weak) id<NewTabPageDelegate> ntpDelegate; + @end #endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm index a6b33db..4722e18c 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm
@@ -34,6 +34,7 @@ @synthesize viewController = _viewController; - (void)start { + DCHECK(self.ntpDelegate); FeedTopSectionViewController* feedTopSectionViewController = [[FeedTopSectionViewController alloc] init]; _viewController = feedTopSectionViewController; @@ -56,6 +57,7 @@ feedTopSectionMediator.signinPromoMediator = signinPromoViewMediator; feedTopSectionViewController.signinPromoDelegate = signinPromoViewMediator; feedTopSectionViewController.delegate = feedTopSectionMediator; + feedTopSectionViewController.ntpDelegate = self.ntpDelegate; self.feedTopSectionMediator = feedTopSectionMediator; [feedTopSectionMediator setUp]; }
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm index 03438db5..383a351 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_mediator.mm
@@ -75,7 +75,12 @@ if (shouldShowSigninPromo) { [self.signinPromoMediator signinPromoViewIsVisible]; } else { - [self.signinPromoMediator signinPromoViewIsHidden]; + // When the sign-in view is closed, the promo state changes, but + // -[SigninPromoViewMediator signinPromoViewIsHidden] should not be + // called because it's already hidden. + if (!self.signinPromoMediator.invalidClosedOrNeverVisible) { + [self.signinPromoMediator signinPromoViewIsHidden]; + } } // TODO(crbug.com/1331010): Update pref if needed.
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h index 0ac29fc4..5ef3382 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.h
@@ -11,6 +11,8 @@ #import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h" #import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller_delegate.h" +@protocol NewTabPageDelegate; + // View Controller that contains all the elements of the Feed Top section. @interface FeedTopSectionViewController : UIViewController <FeedTopSectionConsumer> @@ -21,6 +23,9 @@ // Delegate to handle interactions of the signin promo. @property(nonatomic, weak) id<SigninPromoViewDelegate> signinPromoDelegate; +// Delegate for NTP related actions. +@property(nonatomic, weak) id<NewTabPageDelegate> ntpDelegate; + @end #endif // IOS_CHROME_BROWSER_UI_NTP_FEED_TOP_SECTION_FEED_TOP_SECTION_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm index fd2c3b5..2d1c482 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_view_controller.mm
@@ -10,7 +10,7 @@ #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h" #import "ios/chrome/browser/ui/ntp/discover_feed_constants.h" -#import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_consumer.h" +#import "ios/chrome/browser/ui/ntp/new_tab_page_delegate.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/grit/ios_chromium_strings.h" @@ -49,40 +49,71 @@ // FeedTopSectionConsumer @synthesize shouldShowSigninPromo = _shouldShowSigninPromo; +- (instancetype)init { + self = [super init]; + if (self) { + // Create `contentStack` early so we can set up the promo before + // `viewDidLoad`. + _contentStack = [[UIStackView alloc] init]; + _contentStack.translatesAutoresizingMaskIntoConstraints = NO; + _contentStack.axis = UILayoutConstraintAxisVertical; + _contentStack.distribution = UIStackViewDistributionFill; + // TODO(crbug.com/1331010): Update background color for the view. + _contentStack.layoutMarginsRelativeArrangement = YES; + } + return self; +} + - (void)viewDidLoad { [super viewDidLoad]; - self.contentStack = [[UIStackView alloc] init]; self.view.translatesAutoresizingMaskIntoConstraints = NO; - self.contentStack.translatesAutoresizingMaskIntoConstraints = NO; - self.contentStack.axis = UILayoutConstraintAxisVertical; - self.contentStack.distribution = UIStackViewDistributionFill; - // TODO(crbug.com/1331010): Update background color for the view. - self.contentStack.layoutMarginsRelativeArrangement = YES; - self.contentStack.directionalLayoutMargins = NSDirectionalEdgeInsetsMake( - kContentStackVerticalPadding, kContentStackHorizontalPadding, - kContentStackVerticalPadding, kContentStackHorizontalPadding); - - self.promoViewContainer = [[UIView alloc] init]; - self.promoViewContainer.translatesAutoresizingMaskIntoConstraints = NO; - self.promoViewContainer.backgroundColor = - [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; - self.promoViewContainer.layer.cornerRadius = kPromoViewContainerBorderRadius; - - self.promoView = [self createPromoView]; - [self.promoViewContainer addSubview:self.promoView]; - - [self.contentStack addArrangedSubview:self.promoViewContainer]; - [self.view addSubview:self.contentStack]; - [self applyConstraints]; + [self applyGeneralConstraints]; } #pragma mark - FeedTopSectionConsumer -- (void)setShouldShowSigninPromo:(BOOL)shouldShow { +- (void)setShouldShowSigninPromo:(BOOL)shouldShowSigninPromo { + if (_shouldShowSigninPromo == shouldShowSigninPromo) { + return; + } // TODO(crbug.com/1331010): Handle targeting of the promo. - _shouldShowSigninPromo = shouldShow; - self.promoView.hidden = _shouldShowSigninPromo; + _shouldShowSigninPromo = shouldShowSigninPromo; + [self updateFeedSigninPromoVisibility]; +} + +- (void)updateFeedSigninPromoVisibility { + if (self.shouldShowSigninPromo) { + DCHECK(!self.promoViewContainer); + DCHECK(!self.promoView); + self.promoViewContainer = [[UIView alloc] init]; + self.promoViewContainer.translatesAutoresizingMaskIntoConstraints = NO; + self.promoViewContainer.backgroundColor = + [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + self.promoViewContainer.layer.cornerRadius = + kPromoViewContainerBorderRadius; + self.contentStack.directionalLayoutMargins = NSDirectionalEdgeInsetsMake( + kContentStackVerticalPadding, kContentStackHorizontalPadding, + kContentStackVerticalPadding, kContentStackHorizontalPadding); + + self.promoView = [self createPromoView]; + [self.promoViewContainer addSubview:self.promoView]; + + [self.contentStack addArrangedSubview:self.promoViewContainer]; + [self applyPromoViewConstraints]; + } else { + DCHECK(self.promoViewContainer); + DCHECK(self.promoView); + [self.contentStack willRemoveSubview:self.promoViewContainer]; + [self.promoViewContainer willRemoveSubview:self.promoView]; + [self.promoView removeFromSuperview]; + [self.promoViewContainer removeFromSuperview]; + self.promoViewContainer = nil; + self.promoView = nil; + self.contentStack.directionalLayoutMargins = + NSDirectionalEdgeInsetsMake(0, 0, 0, 0); + } + [self.ntpDelegate updateFeedLayout]; } - (void)updateSigninPromoWithConfigurator: @@ -102,8 +133,22 @@ #pragma mark - Private +- (void)applyPromoViewConstraints { + [NSLayoutConstraint activateConstraints:@[ + // Anchor promo and its container. + [self.promoViewContainer.heightAnchor + constraintEqualToAnchor:self.promoView.heightAnchor], + [self.promoViewContainer.widthAnchor + constraintEqualToAnchor:self.promoView.widthAnchor], + [self.promoView.centerXAnchor + constraintEqualToAnchor:self.promoViewContainer.centerXAnchor], + [self.promoView.centerYAnchor + constraintEqualToAnchor:self.promoViewContainer.centerYAnchor], + ]]; +} + // Applies constraints. -- (void)applyConstraints { +- (void)applyGeneralConstraints { [NSLayoutConstraint activateConstraints:@[ // Anchor content stack. [self.contentStack.topAnchor constraintEqualToAnchor:self.view.topAnchor], @@ -114,15 +159,6 @@ [self.contentStack.widthAnchor constraintEqualToConstant:MIN(kDiscoverFeedContentWidth, self.view.frame.size.width)], - // Anchor promo and its container. - [self.promoViewContainer.heightAnchor - constraintEqualToAnchor:self.promoView.heightAnchor], - [self.promoViewContainer.widthAnchor - constraintEqualToAnchor:self.promoView.widthAnchor], - [self.promoView.centerXAnchor - constraintEqualToAnchor:self.promoViewContainer.centerXAnchor], - [self.promoView.centerYAnchor - constraintEqualToAnchor:self.promoViewContainer.centerYAnchor], ]]; }
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm index 2d2b22b8..dc4eacc9 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -1183,6 +1183,7 @@ [[FeedTopSectionCoordinator alloc] initWithBaseViewController:self.ntpViewController browser:self.browser]; + feedTopSectionCoordinator.ntpDelegate = self; [feedTopSectionCoordinator start]; return feedTopSectionCoordinator; }
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 29b66f8..38d6e55 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -233,6 +233,7 @@ "//ios/chrome/browser/passwords:unit_tests", "//ios/chrome/browser/policy:unit_tests", "//ios/chrome/browser/prerender:unit_tests", + "//ios/chrome/browser/promos_manager:unit_tests", "//ios/chrome/browser/reading_list:unit_tests", "//ios/chrome/browser/safe_browsing:unit_tests", "//ios/chrome/browser/safe_mode:unit_tests",
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 723953a..cb89e861f 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -0129de886191f386b4e15080a26f31e6a44ae7f7 \ No newline at end of file +11e27569dcdd47a638adc482156cfea459b5350e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index 8c4f92b..12a00e2 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -71ffb35271ef0cb0594773a099fe41a07e37a89e \ No newline at end of file +9fb3ee8a0ff54ed1966af52a18d10cd94ef47aa2 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index c662c80..5db96ade 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -70f93a1e37626e7c3629dbe70be236ddc7ea64a3 \ No newline at end of file +89f1bbd8f05dc34e6e7f37329cc9ba9a9969fead \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index b8e2739..0454fef 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -0418f6b1472d8f1d9e949f4a2bcf281bbf02cdd5 \ No newline at end of file +485ecbc9b4a8e6e6e945d69a0a7a6be928a4fc6b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index e7d02e2..9b0abd91 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -6a70dbb66938c447754b780b39ab3e42a574d479 \ No newline at end of file +28f6a172f69c7f8a1f51c5148060cb94cd1f13f6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 97ab3c4..a43401e 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -a89397d79b66bda45c8fa76c759df0081ea41963 \ No newline at end of file +b5d5b9f8635082efa46a368179625b0a942a7d05 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index dcb60bd..cf8d914 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -cc32e88d55cd461acc2dc8c44c1f804e66878e24 \ No newline at end of file +07af390100486ad2651790d84224b7d578143cdf \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 60357ed..5f929f3 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -43a9b69189aaf5daf0dfdd9d6d238d6f7b0b42bb \ No newline at end of file +8b502dea65a7d7730f5f511643e80a8ffddd6b71 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 9d84e7c..618aa7f 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -e44b17cf5ede9a705e982700d92688bc7ebe1d4c \ No newline at end of file +60a4177de631eb40d097bd8eba77d978466860ce \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index ab96b439..c5bc3813 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -b9dcd14243fa1114d2220b710498ec524b87b4dc \ No newline at end of file +cf7eb7fba0669926bd9983aca7f9cba145d4deb7 \ No newline at end of file
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.h b/ios/web_view/internal/passwords/web_view_password_feature_manager.h index 2c85d0a1..9a57cab 100644 --- a/ios/web_view/internal/passwords/web_view_password_feature_manager.h +++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
@@ -28,7 +28,7 @@ ~WebViewPasswordFeatureManager() override = default; bool IsGenerationEnabled() const override; - + bool AreRequirementsForAutomatedPasswordChangeFulfilled() const override; bool IsOptedInForAccountStorage() const override; bool ShouldShowAccountStorageOptIn() const override; bool ShouldShowAccountStorageReSignin(
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm index 1bb8b808..c9860b1 100644 --- a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm +++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
@@ -23,6 +23,12 @@ return true; } +bool WebViewPasswordFeatureManager:: + AreRequirementsForAutomatedPasswordChangeFulfilled() const { + // This is only a stub while APC is not implemented on iOS. + return false; +}; + bool WebViewPasswordFeatureManager::IsOptedInForAccountStorage() const { // Although ios/web_view will only write to the account store, this should // still be controlled on a per user basis to ensure that the logged out user
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn index 90e7a439..f1a7988 100644 --- a/media/capture/BUILD.gn +++ b/media/capture/BUILD.gn
@@ -479,7 +479,7 @@ ] use_cfv1 = false additional_manifest_fragments = - [ "//media/fuchsia/camera/test_support.shard.test-cml" ] + [ "//media/fuchsia/test_support.shard.test-cml" ] } if (is_mac) {
diff --git a/media/fuchsia/camera/BUILD.gn b/media/fuchsia/camera/BUILD.gn index 1140551e..9593d941 100644 --- a/media/fuchsia/camera/BUILD.gn +++ b/media/fuchsia/camera/BUILD.gn
@@ -2,9 +2,9 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# Tests may include the accompanying test_support.shard.test-cml in this -# directory in their additional_manifest_fragments to satisfy capability -# requirements for this target. +# Tests may include //media/fuchsia/test_support.shard.test-cml in their +# additional_manifest_fragments to satisfy capability requirements for this +# target. source_set("test_support") { testonly = true public_deps = [
diff --git a/media/fuchsia/test_support.shard.test-cml b/media/fuchsia/test_support.shard.test-cml new file mode 100644 index 0000000..ce94cecb4 --- /dev/null +++ b/media/fuchsia/test_support.shard.test-cml
@@ -0,0 +1,14 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This shard routes the protocols needed by tests that use parts of //media +// such as //media/fuchsia/camera:test_support, //media/capture:test_support, +// //media/fuchsia/cdm, //media/fuchsia/video, etc. +{ + use: [ + { + protocol: "fuchsia.sysmem.Allocator", + }, + ], +}
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index 38d683a..d35582e 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -1500,6 +1500,43 @@ } // static +std::string CanonicalCookie::BuildCookieAttributesLine( + const CanonicalCookie& cookie) { + std::string cookie_line; + // In Mozilla, if you set a cookie like "AAA", it will have an empty token + // and a value of "AAA". When it sends the cookie back, it will send "AAA", + // so we need to avoid sending "=AAA" for a blank token value. + if (!cookie.Name().empty()) + cookie_line += cookie.Name() + "="; + cookie_line += cookie.Value(); + if (!cookie.Domain().empty()) + cookie_line += "; domain=" + cookie.Domain(); + if (!cookie.Path().empty()) + cookie_line += "; path=" + cookie.Path(); + if (cookie.ExpiryDate() != base::Time()) + cookie_line += "; expires=" + TimeFormatHTTP(cookie.ExpiryDate()); + if (cookie.IsSecure()) + cookie_line += "; secure"; + if (cookie.IsHttpOnly()) + cookie_line += "; httponly"; + switch (cookie.SameSite()) { + case CookieSameSite::NO_RESTRICTION: + cookie_line += "; samesite=none"; + break; + case CookieSameSite::LAX_MODE: + cookie_line += "; samesite=lax"; + break; + case CookieSameSite::STRICT_MODE: + cookie_line += "; samesite=strict"; + break; + case CookieSameSite::UNSPECIFIED: + // Don't append any text if the samesite attribute wasn't explicitly set. + break; + } + return cookie_line; +} + +// static CanonicalCookie::CookiePrefix CanonicalCookie::GetCookiePrefix( const std::string& name) { const char kSecurePrefix[] = "__Secure-";
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h index d9610a9..718c377b 100644 --- a/net/cookies/canonical_cookie.h +++ b/net/cookies/canonical_cookie.h
@@ -429,6 +429,11 @@ // (ignores the access result). static std::string BuildCookieLine(const CookieAccessResultList& cookies); + // Takes a single CanonicalCookie and returns a cookie line containing the + // attributes of |cookie| formatted like a http set cookie header. + // (e.g. "cookie1=value1; domain=abc.com; path=/; secure"). + static std::string BuildCookieAttributesLine(const CanonicalCookie& cookie); + private: FRIEND_TEST_ALL_PREFIXES(CanonicalCookieTest, TestPrefixHistograms); FRIEND_TEST_ALL_PREFIXES(CanonicalCookieTest, TestHasHiddenPrefixName);
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc index 8fa5599..1bc2b7a9 100644 --- a/net/cookies/canonical_cookie_unittest.cc +++ b/net/cookies/canonical_cookie_unittest.cc
@@ -3135,6 +3135,36 @@ MatchCookieLineToVector("A=B; C; D=E; F=G; D=E; H=I", cookies); } +TEST(CanonicalCookieTest, BuildCookieAttributesLine) { + std::unique_ptr<CanonicalCookie> cookie; + GURL url("https://example.com/"); + base::Time now = base::Time::Now(); + absl::optional<base::Time> server_time = absl::nullopt; + + cookie = CanonicalCookie::Create(url, "A=B", now, server_time, + absl::nullopt /* cookie_partition_key */); + EXPECT_EQ("A=B; domain=example.com; path=/", + CanonicalCookie::BuildCookieAttributesLine(*cookie)); + // Nameless cookies are sent back without a prefixed '='. + cookie = CanonicalCookie::Create(url, "C", now, server_time, + absl::nullopt /* cookie_partition_key */); + EXPECT_EQ("C; domain=example.com; path=/", + CanonicalCookie::BuildCookieAttributesLine(*cookie)); + // BuildCookieAttributesLine should match the spec in the case of an empty + // name with a value containing an equal sign (even if it currently produces + // "invalid" cookie lines). + cookie = CanonicalCookie::Create(url, "=H=I", now, server_time, + absl::nullopt /* cookie_partition_key */); + EXPECT_EQ("H=I; domain=example.com; path=/", + CanonicalCookie::BuildCookieAttributesLine(*cookie)); + // BuildCookieAttributesLine should include all attributes. + cookie = CanonicalCookie::Create( + url, "A=B; domain=.example.com; path=/; secure; httponly; samesite=lax", + now, server_time, absl::nullopt /* cookie_partition_key */); + EXPECT_EQ("A=B; domain=.example.com; path=/; secure; httponly; samesite=lax", + CanonicalCookie::BuildCookieAttributesLine(*cookie)); +} + // Confirm that input arguments are reflected in the output cookie. TEST(CanonicalCookieTest, CreateSanitizedCookie_Inputs) { base::Time two_hours_ago = base::Time::Now() - base::Hours(2);
diff --git a/net/dns/context_host_resolver_unittest.cc b/net/dns/context_host_resolver_unittest.cc index da4ff12..4369636f 100644 --- a/net/dns/context_host_resolver_unittest.cc +++ b/net/dns/context_host_resolver_unittest.cc
@@ -619,13 +619,14 @@ // cache. base::SimpleTestTickClock clock; clock.Advance(base::Days(62)); // Arbitrary non-zero time. - AddressList expected(kEndpoint); + std::vector<IPEndPoint> expected({kEndpoint}); host_cache->Set( HostCache::Key("example.com", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */, HostResolverSource::ANY, NetworkIsolationKey()), - HostCache::Entry(OK, expected, HostCache::Entry::SOURCE_DNS, - base::Days(1)), + HostCache::Entry(OK, expected, + /*aliases=*/std::set<std::string>({"example.com"}), + HostCache::Entry::SOURCE_DNS, base::Days(1)), clock.NowTicks(), base::Days(1)); resolver->SetTickClockForTesting(&clock);
diff --git a/net/dns/host_cache.cc b/net/dns/host_cache.cc index 35247d6..042d9ff 100644 --- a/net/dns/host_cache.cc +++ b/net/dns/host_cache.cc
@@ -138,21 +138,17 @@ std::move(metadata).value()); } -bool AddressListFromListValue(const base::Value::List* value, - absl::optional<AddressList>* out_list) { - if (!value) { - out_list->reset(); - return true; - } - - out_list->emplace(); - for (const auto& it : *value) { +bool IPEndPointsFromLegacyAddressListValue( + const base::Value::List& value, + absl::optional<std::vector<IPEndPoint>>* ip_endpoints) { + ip_endpoints->emplace(); + for (const auto& it : value) { IPAddress address; const std::string* addr_string = it.GetIfString(); if (!addr_string || !address.AssignFromIPLiteral(*addr_string)) { return false; } - out_list->value().push_back(IPEndPoint(address, 0)); + ip_endpoints->value().emplace_back(address, 0); } return true; } @@ -350,19 +346,12 @@ MergeLists(&front.ip_endpoints_, back.ip_endpoints_); MergeContainers(front.endpoint_metadatas_, back.endpoint_metadatas_); MergeContainers(front.aliases_, back.aliases_); - front.MergeAddressesFrom(back); MergeLists(&front.text_records_, back.text_records()); MergeLists(&front.hostnames_, back.hostnames()); MergeLists(&front.https_record_compatibility_, back.https_record_compatibility_); MergeContainers(front.canonical_names_, back.canonical_names_); - // The DNS aliases include the canonical name(s), if any, each as the - // first entry in the field, which is an optional vector. If |front| has - // a canonical name, it will be used. Otherwise, if |back| has a - // canonical name, it will be in the first slot in the merged alias field. - front.MergeDnsAliasesFrom(back); - // Only expected to merge entries from same source. DCHECK_EQ(front.source(), back.source()); @@ -392,13 +381,6 @@ } } - if (copy.legacy_addresses_) { - for (IPEndPoint& endpoint : copy.legacy_addresses_.value().endpoints()) { - if (endpoint.port() == 0) - endpoint = IPEndPoint(endpoint.address(), port); - } - } - if (copy.hostnames_) { for (HostPortPair& hostname : copy.hostnames_.value()) { if (hostname.port() == 0) @@ -434,7 +416,6 @@ ip_endpoints_(entry.ip_endpoints_), endpoint_metadatas_(entry.endpoint_metadatas_), aliases_(base::OptionalFromPtr(entry.aliases())), - legacy_addresses_(entry.legacy_addresses()), text_records_(entry.text_records()), hostnames_(entry.hostnames()), https_record_compatibility_(entry.https_record_compatibility_), @@ -452,7 +433,6 @@ std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>> endpoint_metadatas, absl::optional<std::set<std::string>> aliases, - const absl::optional<AddressList>& legacy_addresses, absl::optional<std::vector<std::string>>&& text_records, absl::optional<std::vector<HostPortPair>>&& hostnames, absl::optional<std::vector<bool>>&& https_record_compatibility, @@ -463,7 +443,6 @@ ip_endpoints_(std::move(ip_endpoints)), endpoint_metadatas_(std::move(endpoint_metadatas)), aliases_(std::move(aliases)), - legacy_addresses_(legacy_addresses), text_records_(std::move(text_records)), hostnames_(std::move(hostnames)), https_record_compatibility_(std::move(https_record_compatibility)), @@ -502,66 +481,6 @@ return base::Value(GetAsValue(false /* include_staleness */)); } -void HostCache::Entry::MergeAddressesFrom(const HostCache::Entry& source) { - MergeLists(&legacy_addresses_, source.legacy_addresses()); - if (!legacy_addresses_ || legacy_addresses_->size() <= 1) - return; // Nothing to do. - - legacy_addresses_->Deduplicate(); - - std::stable_sort(legacy_addresses_->begin(), legacy_addresses_->end(), - [](const IPEndPoint& lhs, const IPEndPoint& rhs) { - // Return true iff |lhs < rhs|. - return lhs.GetFamily() == ADDRESS_FAMILY_IPV6 && - rhs.GetFamily() == ADDRESS_FAMILY_IPV4; - }); -} - -void HostCache::Entry::MergeDnsAliasesFrom(const HostCache::Entry& source) { - // No aliases to merge if source has no AddressList. - if (!source.legacy_addresses()) - return; - - // We expect this to be true because the address merging should have already - // created the AddressList if the source had one but the target didn't. - DCHECK(legacy_addresses()); - - // Nothing to merge. - if (source.legacy_addresses()->dns_aliases().empty()) - return; - - // No aliases pre-existing in target, so simply set target's aliases to - // source's. This takes care of the case where target does not have a usable - // canonical name, but source does. - if (legacy_addresses()->dns_aliases().empty()) { - legacy_addresses_->SetDnsAliases(source.legacy_addresses()->dns_aliases()); - return; - } - - DCHECK(legacy_addresses()->dns_aliases() != std::vector<std::string>({""})); - DCHECK(source.legacy_addresses()->dns_aliases() != - std::vector<std::string>({""})); - - // We need to check for possible blanks and duplicates in the source's - // aliases. - std::unordered_set<std::string> aliases_seen; - std::vector<std::string> deduplicated_source_aliases; - - aliases_seen.insert(legacy_addresses()->dns_aliases().begin(), - legacy_addresses()->dns_aliases().end()); - - for (const auto& alias : source.legacy_addresses()->dns_aliases()) { - if (alias != "" && aliases_seen.find(alias) == aliases_seen.end()) { - aliases_seen.insert(alias); - deduplicated_source_aliases.push_back(alias); - } - } - - // The first entry of target's aliases must remain in place, - // as it's the canonical name, so we append source's aliases to the back. - legacy_addresses_->AppendDnsAliases(std::move(deduplicated_source_aliases)); -} - base::Value::Dict HostCache::Entry::GetAsValue(bool include_staleness) const { base::Value::Dict entry_dict; @@ -613,15 +532,6 @@ entry_dict.Set(kAliasesKey, std::move(alias_list)); } - if (legacy_addresses()) { - // Append all of the resolved addresses. - base::Value::List addresses_value; - for (const IPEndPoint& address : legacy_addresses().value()) { - addresses_value.Append(address.ToStringWithoutPort()); - } - entry_dict.Set(kAddressesKey, std::move(addresses_value)); - } - if (text_records()) { // Append all resolved text records. base::Value::List text_list_value; @@ -1067,10 +977,15 @@ } } - absl::optional<AddressList> legacy_address_value; - if (!AddressListFromListValue(legacy_addresses_list, - &legacy_address_value)) { - return false; + // `addresses` field was supported until M105. We keep reading this field + // for backward compatibility for several milestones. + if (legacy_addresses_list) { + if (ip_endpoints) + return false; + if (!IPEndPointsFromLegacyAddressListValue(*legacy_addresses_list, + &ip_endpoints)) { + return false; + } } absl::optional<std::vector<std::string>> text_records; @@ -1118,12 +1033,16 @@ // We do not intend to serialize experimental results with the host cache. absl::optional<std::vector<bool>> experimental_results; - // Assume an empty address list if we have an address type and no results. - if (IsAddressType(dns_query_type) && !ip_endpoints && - !legacy_address_value && !text_records && !hostname_records) { - legacy_address_value.emplace(); + // Assume an empty endpoints list and an empty aliases if we have an address + // type and no results. + if (IsAddressType(dns_query_type) && !text_records && !hostname_records) { + if (!ip_endpoints) { + ip_endpoints.emplace(); + } + if (!aliases) { + aliases.emplace(); + } } - Key key(std::move(host), dns_query_type, flags, static_cast<HostResolverSource>(host_resolver_source), network_isolation_key); @@ -1133,11 +1052,11 @@ // replace the entry. auto found = entries_.find(key); if (found == entries_.end()) { - Entry new_entry( - error, std::move(ip_endpoints), std::move(endpoint_metadatas), - std::move(aliases), legacy_address_value, std::move(text_records), - std::move(hostname_records), std::move(experimental_results), - Entry::SOURCE_UNKNOWN, expiration_time, network_changes_ - 1); + Entry new_entry(error, std::move(ip_endpoints), + std::move(endpoint_metadatas), std::move(aliases), + std::move(text_records), std::move(hostname_records), + std::move(experimental_results), Entry::SOURCE_UNKNOWN, + expiration_time, network_changes_ - 1); new_entry.set_pinning(maybe_pinned.value_or(false)); new_entry.set_canonical_names(std::move(canonical_names)); AddEntry(key, std::move(new_entry));
diff --git a/net/dns/host_cache.h b/net/dns/host_cache.h index 60ae8ae..eb91546 100644 --- a/net/dns/host_cache.h +++ b/net/dns/host_cache.h
@@ -26,7 +26,6 @@ #include "base/time/time.h" #include "base/values.h" #include "net/base/address_family.h" -#include "net/base/address_list.h" #include "net/base/connection_endpoint_metadata.h" #include "net/base/expiring_cache.h" #include "net/base/host_port_pair.h" @@ -172,13 +171,12 @@ bool ContentsEqual(const Entry& other) const { return std::tie(error_, ip_endpoints_, endpoint_metadatas_, aliases_, - legacy_addresses_, text_records_, hostnames_, - https_record_compatibility_, canonical_names_) == - std::tie(other.error_, other.ip_endpoints_, - other.endpoint_metadatas_, other.aliases_, - other.legacy_addresses_, other.text_records_, - other.hostnames_, other.https_record_compatibility_, - other.canonical_names_); + text_records_, hostnames_, https_record_compatibility_, + canonical_names_) == + std::tie( + other.error_, other.ip_endpoints_, other.endpoint_metadatas_, + other.aliases_, other.text_records_, other.hostnames_, + other.https_record_compatibility_, other.canonical_names_); } int error() const { return error_; } @@ -205,12 +203,6 @@ void set_aliases(std::set<std::string> aliases) { aliases_ = std::move(aliases); } - const absl::optional<AddressList>& legacy_addresses() const { - return legacy_addresses_; - } - void set_legacy_addresses(absl::optional<AddressList> addresses) { - legacy_addresses_ = std::move(addresses); - } const absl::optional<std::vector<std::string>>& text_records() const { return text_records_; } @@ -286,7 +278,6 @@ std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>> endpoint_metadatas, absl::optional<std::set<std::string>> aliases, - const absl::optional<AddressList>& legacy_addresses, absl::optional<std::vector<std::string>>&& text_results, absl::optional<std::vector<HostPortPair>>&& hostnames, absl::optional<std::vector<bool>>&& https_record_compatibility, @@ -301,9 +292,6 @@ endpoint_metadatas) { endpoint_metadatas_ = std::move(endpoint_metadatas); } - void SetResult(AddressList addresses) { - legacy_addresses_ = std::move(addresses); - } void SetResult(std::vector<std::string> text_records) { text_records_ = std::move(text_records); } @@ -323,23 +311,6 @@ int network_changes, EntryStaleness* out) const; - // Merges legacy addresses from |source| into the stored list of addresses - // and deduplicates. The address list can be accessed with |addresses()|. - // This method performs a stable sort to ensure IPv6 addresses precede IPv4 - // addresses. IP versions being equal, addresses from |*this| will precede - // those from |source|. - // - // Only non-failure entries (`error_` is OK or ERR_NAME_NOT_RESOLVED) can be - // merged. Because an ERR_NAME_NOT_RESOLVED represents success without any - // results, merging an OK entry with an ERR_NAME_NOT_RESOLVED entry - // represents merging a non-empty entry with an empty entry, resulting in - // non-empty and therefore OK. - void MergeAddressesFrom(const HostCache::Entry& source); - - // Merges the legacy DNS aliases list from `source` into the stored list of - // DNS aliases and deduplicates. - void MergeDnsAliasesFrom(const HostCache::Entry& source); - base::Value::Dict GetAsValue(bool include_staleness) const; // The resolve results for this entry. @@ -349,7 +320,6 @@ std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata>> endpoint_metadatas_; absl::optional<std::set<std::string>> aliases_; - absl::optional<AddressList> legacy_addresses_; absl::optional<std::vector<std::string>> text_records_; absl::optional<std::vector<HostPortPair>> hostnames_;
diff --git a/net/dns/host_cache_unittest.cc b/net/dns/host_cache_unittest.cc index 2b36b8b7..863eec2 100644 --- a/net/dns/host_cache_unittest.cc +++ b/net/dns/host_cache_unittest.cc
@@ -13,6 +13,7 @@ #include "base/callback.h" #include "base/callback_helpers.h" #include "base/format_macros.h" +#include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" @@ -22,6 +23,7 @@ #include "base/time/time.h" #include "base/values.h" #include "net/base/connection_endpoint_metadata.h" +#include "net/base/ip_endpoint.h" #include "net/base/network_isolation_key.h" #include "net/base/schemeful_site.h" #include "net/dns/host_resolver_results.h" @@ -77,6 +79,19 @@ return arg.ContentsEqual(entry); } +IPAddress MakeIP(base::StringPiece literal) { + IPAddress ret; + CHECK(ret.AssignFromIPLiteral(literal)); + return ret; +} + +std::vector<IPEndPoint> MakeEndpoints(std::vector<std::string> my_addresses) { + std::vector<IPEndPoint> out(my_addresses.size()); + std::transform(my_addresses.begin(), my_addresses.end(), out.begin(), + [](auto& s) { return IPEndPoint(MakeIP(s), 0); }); + return out; +} + } // namespace TEST(HostCacheTest, Basic) { @@ -90,7 +105,8 @@ HostCache::Key key1 = Key("foobar.com"); HostCache::Key key2 = Key("foobar2.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{"foobar.com"}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -217,7 +233,8 @@ NetworkIsolationKey()); ASSERT_NE(key, key_with_scheme); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); ASSERT_EQ(0U, cache.size()); ASSERT_FALSE(cache.Lookup(key, now)); @@ -269,9 +286,11 @@ HostCache::Key key2(kHost, DnsQueryType::UNSPECIFIED, 0, HostResolverSource::ANY, kNetworkIsolationKey2); HostCache::Entry entry1 = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); - HostCache::Entry entry2 = HostCache::Entry(ERR_FAILED, AddressList(), - HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry2 = + HostCache::Entry(ERR_FAILED, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); HostCache cache(kMaxCacheEntries); @@ -327,7 +346,8 @@ HostCache::Key key1 = Key("foobar.com"); HostCache::Key key2 = Key("foobar2.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_FALSE(cache.Lookup(key1, now)); cache.Set(key1, entry, now, kFailureEntryTTL); @@ -356,7 +376,8 @@ HostCache::Key key1 = Key("foobar.com"); HostCache::Key key2 = Key("foobar2.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -422,7 +443,8 @@ DnsQueryType::A, 0, HostResolverSource::ANY, NetworkIsolationKey()); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -461,7 +483,8 @@ HostCache::Key key3(kHost, DnsQueryType::A, HOST_RESOLVER_LOOPBACK_ONLY, HostResolverSource::ANY, NetworkIsolationKey()); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -506,7 +529,8 @@ HostCache::Key key2(kHost, DnsQueryType::UNSPECIFIED, 0, HostResolverSource::DNS, NetworkIsolationKey()); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -546,7 +570,8 @@ NetworkIsolationKey()); key2.secure = false; HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -591,7 +616,8 @@ NetworkIsolationKey()); secure_key.secure = true; HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -648,7 +674,8 @@ base::TimeTicks now; HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); // Lookup and Set should have no effect. EXPECT_FALSE(cache.Lookup(Key("foobar.com"), now)); @@ -667,7 +694,8 @@ base::TimeTicks now; HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0u, cache.size()); @@ -692,7 +720,8 @@ base::TimeTicks now; HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0u, cache.size()); @@ -729,7 +758,8 @@ HostCache::Key key2 = Key("foobar2.com"); HostCache::Key key3 = Key("foobar3.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0u, cache.size()); EXPECT_FALSE(cache.Lookup(key1, now)); @@ -765,7 +795,8 @@ HostCache::Key key = Key("foobar.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0U, cache.size()); @@ -829,7 +860,8 @@ HostCache::Key key2 = Key("foobar2.com"); HostCache::Key key3 = Key("foobar3.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0u, cache.size()); EXPECT_FALSE(cache.Lookup(key1, now)); @@ -894,7 +926,8 @@ HostCache::Key key2 = Key("foobar2.com"); HostCache::Key key3 = Key("foobar3.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); entry.set_pinning(true); cache.Set(key1, entry, now, base::Seconds(5)); @@ -921,7 +954,8 @@ HostCache::Key key3 = Key("foobar3.com"); HostCache::Key key4 = Key("foobar4.com"); HostCache::Entry entry = - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); entry.set_pinning(true); // |key2| should be preserved, since it expires later. @@ -1381,7 +1415,7 @@ Pointee(Pair(other_key, EntryContentsEqual(other_entry)))); } -TEST(HostCacheTest, SerializeAndDeserializeLegacyAddresses) { +TEST(HostCacheTest, SerializeAndDeserializeAddresses) { const base::TimeDelta kTTL = base::Seconds(10); HostCache cache(kMaxCacheEntries); @@ -1400,16 +1434,15 @@ IPEndPoint endpoint_ipv4(address_ipv4, 0); IPEndPoint endpoint_ipv6(address_ipv6, 0); - HostCache::Entry entry1 = HostCache::Entry(OK, AddressList(endpoint_ipv4), - HostCache::Entry::SOURCE_UNKNOWN); - AddressList addresses2 = AddressList(endpoint_ipv6); - addresses2.push_back(endpoint_ipv4); + HostCache::Entry entry1 = HostCache::Entry( + OK, {endpoint_ipv4}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); HostCache::Entry entry2 = - HostCache::Entry(OK, addresses2, HostCache::Entry::SOURCE_UNKNOWN); - HostCache::Entry entry3 = HostCache::Entry(OK, AddressList(endpoint_ipv6), - HostCache::Entry::SOURCE_UNKNOWN); - HostCache::Entry entry4 = HostCache::Entry(OK, AddressList(endpoint_ipv4), - HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry(OK, {endpoint_ipv6, endpoint_ipv4}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry3 = HostCache::Entry( + OK, {endpoint_ipv6}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry4 = HostCache::Entry( + OK, {endpoint_ipv4}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0u, cache.size()); @@ -1470,12 +1503,11 @@ restored_cache.LookupStale(key1, now, &stale); EXPECT_TRUE(result1); EXPECT_TRUE(result1->first.secure); - ASSERT_TRUE(result1->second.legacy_addresses()); + ASSERT_TRUE(result1->second.ip_endpoints()); EXPECT_FALSE(result1->second.text_records()); EXPECT_FALSE(result1->second.hostnames()); - EXPECT_EQ(1u, result1->second.legacy_addresses().value().size()); - EXPECT_EQ(address_ipv4, - result1->second.legacy_addresses().value().front().address()); + EXPECT_EQ(1u, result1->second.ip_endpoints()->size()); + EXPECT_EQ(endpoint_ipv4, result1->second.ip_endpoints()->front()); EXPECT_EQ(1, stale.network_changes); // Time to TimeTicks conversion is fuzzy, so just check that expected and // actual expiration times are close. @@ -1488,12 +1520,10 @@ restored_cache.LookupStale(key2, now, &stale); EXPECT_TRUE(result2); EXPECT_FALSE(result2->first.secure); - ASSERT_TRUE(result2->second.legacy_addresses()); - EXPECT_EQ(2u, result2->second.legacy_addresses().value().size()); - EXPECT_EQ(address_ipv6, - result2->second.legacy_addresses().value().front().address()); - EXPECT_EQ(address_ipv4, - result2->second.legacy_addresses().value().back().address()); + ASSERT_TRUE(result2->second.ip_endpoints()); + EXPECT_EQ(2u, result2->second.ip_endpoints()->size()); + EXPECT_EQ(endpoint_ipv6, result2->second.ip_endpoints()->front()); + EXPECT_EQ(endpoint_ipv4, result2->second.ip_endpoints()->back()); EXPECT_EQ(1, stale.network_changes); EXPECT_GT(base::Milliseconds(100), (base::Seconds(-3) - stale.expired_by).magnitude()); @@ -1502,19 +1532,17 @@ const std::pair<const HostCache::Key, HostCache::Entry>* result3 = restored_cache.Lookup(key3, now); EXPECT_TRUE(result3); - ASSERT_TRUE(result3->second.legacy_addresses()); - EXPECT_EQ(1u, result3->second.legacy_addresses().value().size()); - EXPECT_EQ(address_ipv4, - result3->second.legacy_addresses().value().front().address()); + ASSERT_TRUE(result3->second.ip_endpoints()); + EXPECT_EQ(1u, result3->second.ip_endpoints()->size()); + EXPECT_EQ(endpoint_ipv4, result3->second.ip_endpoints()->front()); // The "foobar4.com" entry is still present and usable. const std::pair<const HostCache::Key, HostCache::Entry>* result4 = restored_cache.Lookup(key4, now); EXPECT_TRUE(result4); - ASSERT_TRUE(result4->second.legacy_addresses()); - EXPECT_EQ(1u, result4->second.legacy_addresses().value().size()); - EXPECT_EQ(address_ipv4, - result4->second.legacy_addresses().value().front().address()); + ASSERT_TRUE(result4->second.ip_endpoints()); + EXPECT_EQ(1u, result4->second.ip_endpoints()->size()); + EXPECT_EQ(endpoint_ipv4, result4->second.ip_endpoints()->front()); EXPECT_EQ(2u, restored_cache.last_restore_size()); } @@ -1783,6 +1811,90 @@ EXPECT_THAT(result->second.aliases(), Pointee(aliases)); } +TEST(HostCacheTest, DeserializeNoEndpointNoAliase) { + base::TimeDelta ttl = base::Seconds(99); + std::string expiration_time_str = base::NumberToString( + (base::Time::Now() + ttl).since_origin().InMicroseconds()); + + auto dict = base::JSONReader::Read(base::StringPrintf( + R"( + [ { + "dns_query_type": 1, + "expiration": "%s", + "flags": 0, + "host_resolver_source": 2, + "hostname": "example.com", + "network_isolation_key": [ ], + "port": 443, + "scheme": "https", + "secure": false +} ] +)", + expiration_time_str.c_str())); + ASSERT_TRUE(dict); + + HostCache restored_cache(kMaxCacheEntries); + ASSERT_TRUE(dict->is_list()); + restored_cache.RestoreFromListValue(dict->GetList()); + + ASSERT_EQ(1u, restored_cache.size()); + + HostCache::Key key(url::SchemeHostPort(url::kHttpsScheme, "example.com", 443), + DnsQueryType::A, 0, HostResolverSource::DNS, + NetworkIsolationKey()); + + HostCache::EntryStaleness stale; + const std::pair<const HostCache::Key, HostCache::Entry>* result = + restored_cache.LookupStale(key, base::TimeTicks::Now(), &stale); + + ASSERT_TRUE(result); + EXPECT_THAT(result->second.aliases(), Pointee(ElementsAre())); + EXPECT_THAT(result->second.ip_endpoints(), Pointee(ElementsAre())); +} + +TEST(HostCacheTest, DeserializeLegacyAddresses) { + base::TimeDelta ttl = base::Seconds(99); + std::string expiration_time_str = base::NumberToString( + (base::Time::Now() + ttl).since_origin().InMicroseconds()); + + auto dict = base::JSONReader::Read(base::StringPrintf( + R"( + [ { + "addresses": [ "2000::", "1.2.3.4" ], + "dns_query_type": 1, + "expiration": "%s", + "flags": 0, + "host_resolver_source": 2, + "hostname": "example.com", + "network_isolation_key": [ ], + "port": 443, + "scheme": "https", + "secure": false +} ] +)", + expiration_time_str.c_str())); + ASSERT_TRUE(dict); + + HostCache restored_cache(kMaxCacheEntries); + ASSERT_TRUE(dict->is_list()); + restored_cache.RestoreFromListValue(dict->GetList()); + + ASSERT_EQ(1u, restored_cache.size()); + + HostCache::Key key(url::SchemeHostPort(url::kHttpsScheme, "example.com", 443), + DnsQueryType::A, 0, HostResolverSource::DNS, + NetworkIsolationKey()); + + HostCache::EntryStaleness stale; + const std::pair<const HostCache::Key, HostCache::Entry>* result = + restored_cache.LookupStale(key, base::TimeTicks::Now(), &stale); + + ASSERT_TRUE(result); + EXPECT_THAT(result->second.ip_endpoints(), + Pointee(ElementsAreArray(MakeEndpoints({"2000::", "1.2.3.4"})))); + EXPECT_THAT(result->second.aliases(), Pointee(ElementsAre())); +} + TEST(HostCacheTest, PersistenceDelegate) { const base::TimeDelta kTTL = base::Seconds(10); HostCache cache(kMaxCacheEntries); @@ -1799,8 +1911,9 @@ IPEndPoint(IPAddress(1, 1, 1, 1), 300)}; HostCache::Entry other_entry(OK, std::move(other_endpoints), /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); - HostCache::Entry error_entry = HostCache::Entry( - ERR_NAME_NOT_RESOLVED, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry error_entry = + HostCache::Entry(ERR_NAME_NOT_RESOLVED, /*ip_endpoints=*/{}, + /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); // Start at t=0. base::TimeTicks now; @@ -1853,12 +1966,10 @@ EXPECT_EQ(4, delegate.num_changes()); } -TEST(HostCacheTest, MergeLegacyAddressEntries) { +TEST(HostCacheTest, MergeEndpointsWithAliases) { const IPAddress kAddressFront(1, 2, 3, 4); const IPEndPoint kEndpointFront(kAddressFront, 0); - std::vector<std::string> aliases_front({"alias1", "alias2", "alias3"}); - HostCache::Entry front(OK, - AddressList(kEndpointFront, std::move(aliases_front)), + HostCache::Entry front(OK, {kEndpointFront}, {"alias1", "alias2", "alias3"}, HostCache::Entry::SOURCE_DNS); front.set_text_records(std::vector<std::string>{"text1"}); const HostPortPair kHostnameFront("host", 1); @@ -1867,8 +1978,7 @@ const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const IPEndPoint kEndpointBack(kAddressBack, 0); - std::vector<std::string> aliases_back({"alias2", "alias4", "alias5"}); - HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)), + HostCache::Entry back(OK, {kEndpointBack}, {"alias2", "alias4", "alias5"}, HostCache::Entry::SOURCE_DNS); back.set_text_records(std::vector<std::string>{"text2"}); const HostPortPair kHostnameBack("host", 2); @@ -1880,125 +1990,41 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - // Expect the IPv6 address to precede the IPv4 address. - EXPECT_THAT(result.legacy_addresses(), - Optional(Property(&AddressList::endpoints, - ElementsAre(kEndpointBack, kEndpointFront)))); + ASSERT_TRUE(result.ip_endpoints()); + EXPECT_THAT(*result.ip_endpoints(), + ElementsAre(kEndpointFront, kEndpointBack)); EXPECT_THAT(result.text_records(), Optional(ElementsAre("text1", "text2"))); EXPECT_THAT(result.hostnames(), Optional(ElementsAre(kHostnameFront, kHostnameBack))); - ASSERT_TRUE(result.legacy_addresses()); + ASSERT_TRUE(result.aliases()); EXPECT_THAT( - result.legacy_addresses().value().dns_aliases(), + *result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3", "alias4", "alias5")); } -IPAddress MakeIP(base::StringPiece literal) { - IPAddress ret; - CHECK(ret.AssignFromIPLiteral(literal)); - return ret; -} +TEST(HostCacheTest, MergeEndpointsKeepEndpointsOrder) { + std::vector<IPEndPoint> front_addresses = + MakeEndpoints({"::1", "0.0.0.2", "0.0.0.4"}); + std::vector<IPEndPoint> back_addresses = + MakeEndpoints({"0.0.0.2", "0.0.0.2", "::3", "::3", "0.0.0.4"}); -IPAddressList MakeIPList(std::vector<std::string> my_addresses) { - IPAddressList out(my_addresses.size()); - std::transform(my_addresses.begin(), my_addresses.end(), out.begin(), - &MakeIP); - return out; -} - -std::vector<IPEndPoint> MakeEndpoints(std::vector<std::string> my_addresses) { - std::vector<IPEndPoint> out(my_addresses.size()); - std::transform(my_addresses.begin(), my_addresses.end(), out.begin(), - [](auto& s) { return IPEndPoint(MakeIP(s), 0); }); - return out; -} - -TEST(HostCacheTest, SortsAndDeduplicatesLegacyAddresses) { - IPAddressList front_addresses = MakeIPList({"0.0.0.1", "0.0.0.1", "0.0.0.2"}); - IPAddressList back_addresses = - MakeIPList({"0.0.0.2", "0.0.0.2", "::3", "::3"}); - - std::vector<std::string> front_aliases({"front"}); - HostCache::Entry front(OK, - AddressList::CreateFromIPAddressList( - front_addresses, std::move(front_aliases)), + HostCache::Entry front(OK, front_addresses, /*aliases=*/{"front"}, HostCache::Entry::SOURCE_DNS); - std::vector<std::string> back_aliases({"back"}); - HostCache::Entry back(OK, - AddressList::CreateFromIPAddressList( - back_addresses, std::move(back_aliases)), + HostCache::Entry back(OK, back_addresses, /*aliases=*/{"back"}, HostCache::Entry::SOURCE_DNS); HostCache::Entry result = HostCache::Entry::MergeEntries(std::move(front), std::move(back)); - EXPECT_EQ(OK, result.error()); - EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - + ASSERT_TRUE(result.ip_endpoints()); EXPECT_THAT( - result.legacy_addresses(), - Optional(Property( - &AddressList::endpoints, - ElementsAreArray(MakeEndpoints({"::3", "0.0.0.1", "0.0.0.2"}))))); - - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), - UnorderedElementsAre("front", "back")); -} - -TEST(HostCacheTest, PrefersLegacyAddressesWithIpv6) { - IPAddressList front_addresses = MakeIPList({"::1", "0.0.0.2", "0.0.0.4"}); - IPAddressList back_addresses = - MakeIPList({"0.0.0.2", "0.0.0.2", "::3", "::3", "0.0.0.4"}); - - std::vector<std::string> front_aliases({"front"}); - HostCache::Entry front(OK, - AddressList::CreateFromIPAddressList( - front_addresses, std::move(front_aliases)), - HostCache::Entry::SOURCE_DNS); - std::vector<std::string> back_aliases({"back"}); - HostCache::Entry back(OK, - AddressList::CreateFromIPAddressList( - back_addresses, std::move(back_aliases)), - HostCache::Entry::SOURCE_DNS); - - HostCache::Entry result = - HostCache::Entry::MergeEntries(std::move(front), std::move(back)); - - EXPECT_THAT(result.legacy_addresses(), - Optional(Property(&AddressList::endpoints, - ElementsAreArray(MakeEndpoints( - {"::1", "::3", "0.0.0.2", "0.0.0.4"}))))); - - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), - UnorderedElementsAre("front", "back")); -} - -TEST(HostCacheTest, MergeEndpoints) { - std::vector<IPEndPoint> front_endpoints = { - IPEndPoint(IPAddress(1, 1, 1, 1), 800), - IPEndPoint(IPAddress(2, 2, 2, 2), 900)}; - HostCache::Entry front(OK, front_endpoints, /*aliases=*/{}, - HostCache::Entry::SOURCE_DNS); - - std::vector<IPEndPoint> back_endpoints = {IPEndPoint( - IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), 100)}; - HostCache::Entry back(OK, back_endpoints, /*aliases=*/{}, - HostCache::Entry::SOURCE_DNS); - - std::vector<IPEndPoint> expected_endpoints = { - IPEndPoint(IPAddress(1, 1, 1, 1), 800), - IPEndPoint(IPAddress(2, 2, 2, 2), 900), - IPEndPoint(IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), - 100)}; - HostCache::Entry expected(OK, expected_endpoints, /*aliases=*/{}, - HostCache::Entry::SOURCE_DNS); - - HostCache::Entry result = HostCache::Entry::MergeEntries(front, back); - EXPECT_EQ(result, expected); + *result.ip_endpoints(), + ElementsAreArray(MakeEndpoints({"::1", "0.0.0.2", "0.0.0.4", "0.0.0.2", + "0.0.0.2", "::3", "::3", "0.0.0.4"}))); + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("front", "back")); } TEST(HostCacheTest, MergeMetadatas) { @@ -2170,14 +2196,13 @@ EXPECT_EQ(result, expected); } -TEST(HostCacheTest, MergeLegacyAddressEntries_frontEmpty) { +TEST(HostCacheTest, MergeEntries_frontEmpty) { HostCache::Entry front(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS); const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const IPEndPoint kEndpointBack(kAddressBack, 0); - std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"}); - HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)), + HostCache::Entry back(OK, {kEndpointBack}, {"alias1", "alias2", "alias3"}, HostCache::Entry::SOURCE_DNS, base::Hours(4)); back.set_text_records(std::vector<std::string>{"text2"}); const HostPortPair kHostnameBack("host", 2); @@ -2189,25 +2214,22 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().endpoints(), - ElementsAre(kEndpointBack)); + ASSERT_TRUE(result.ip_endpoints()); + EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointBack)); EXPECT_THAT(result.text_records(), Optional(ElementsAre("text2"))); EXPECT_THAT(result.hostnames(), Optional(ElementsAre(kHostnameBack))); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } -TEST(HostCacheTest, MergeLegacyAddressEntries_backEmpty) { +TEST(HostCacheTest, MergeEntries_backEmpty) { const IPAddress kAddressFront(1, 2, 3, 4); const IPEndPoint kEndpointFront(kAddressFront, 0); - std::vector<std::string> aliases_front({"alias1", "alias2", "alias3"}); - HostCache::Entry front(OK, - AddressList(kEndpointFront, std::move(aliases_front)), + HostCache::Entry front(OK, {kEndpointFront}, {"alias1", "alias2", "alias3"}, HostCache::Entry::SOURCE_DNS, base::Minutes(5)); front.set_text_records(std::vector<std::string>{"text1"}); const HostPortPair kHostnameFront("host", 1); @@ -2221,20 +2243,19 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().endpoints(), - ElementsAre(kEndpointFront)); + ASSERT_TRUE(result.ip_endpoints()); + EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointFront)); EXPECT_THAT(result.text_records(), Optional(ElementsAre("text1"))); EXPECT_THAT(result.hostnames(), Optional(ElementsAre(kHostnameFront))); EXPECT_EQ(base::Minutes(5), result.ttl()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } -TEST(HostCacheTest, MergeLegacyAddressEntries_bothEmpty) { +TEST(HostCacheTest, MergeEntries_bothEmpty) { HostCache::Entry front(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS); HostCache::Entry back(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS); @@ -2244,25 +2265,21 @@ EXPECT_EQ(ERR_NAME_NOT_RESOLVED, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - EXPECT_FALSE(result.legacy_addresses()); + EXPECT_FALSE(result.ip_endpoints()); EXPECT_FALSE(result.text_records()); EXPECT_FALSE(result.hostnames()); EXPECT_FALSE(result.has_ttl()); } -TEST(HostCacheTest, - MergeLegacyAddressEntries_frontWithAliasesNoAddressesBackWithBoth) { +TEST(HostCacheTest, MergeEntries_frontWithAliasesNoAddressesBackWithBoth) { HostCache::Entry front(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS); - AddressList front_addresses; - std::vector<std::string> aliases_front({"alias0", "alias1", "alias2"}); - front_addresses.SetDnsAliases(std::move(aliases_front)); - front.set_legacy_addresses(front_addresses); + std::set<std::string> aliases_front({"alias0", "alias1", "alias2"}); + front.set_aliases(aliases_front); const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const IPEndPoint kEndpointBack(kAddressBack, 0); - std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"}); - HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)), + HostCache::Entry back(OK, {kEndpointBack}, {"alias1", "alias2", "alias3"}, HostCache::Entry::SOURCE_DNS, base::Hours(4)); HostCache::Entry result = @@ -2271,32 +2288,25 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().endpoints(), - ElementsAre(kEndpointBack)); + ASSERT_TRUE(result.ip_endpoints()); + EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointBack)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("alias0", "alias1", "alias2", "alias3")); } -TEST(HostCacheTest, - MergeLegacyAddressEntries_backWithAliasesNoAddressesFrontWithBoth) { +TEST(HostCacheTest, MergeEntries_backWithAliasesNoAddressesFrontWithBoth) { HostCache::Entry back(ERR_NAME_NOT_RESOLVED, HostCache::Entry::SOURCE_DNS); - AddressList back_addresses; - std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"}); - - back_addresses.SetDnsAliases(std::move(aliases_back)); - back.set_legacy_addresses(back_addresses); + std::set<std::string> aliases_back({"alias1", "alias2", "alias3"}); + back.set_aliases(aliases_back); const IPAddress kAddressFront(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const IPEndPoint kEndpointFront(kAddressFront, 0); - std::vector<std::string> aliases_front({"alias0", "alias1", "alias2"}); - HostCache::Entry front(OK, - AddressList(kEndpointFront, std::move(aliases_front)), + HostCache::Entry front(OK, {kEndpointFront}, {"alias0", "alias1", "alias2"}, HostCache::Entry::SOURCE_DNS, base::Hours(4)); HostCache::Entry result = @@ -2305,61 +2315,53 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().endpoints(), - ElementsAre(kEndpointFront)); + ASSERT_TRUE(result.ip_endpoints()); + EXPECT_THAT(*result.ip_endpoints(), ElementsAre(kEndpointFront)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("alias0", "alias1", "alias2", "alias3")); } -TEST(HostCacheTest, - MergeLegacyAddressEntries_frontWithAddressesNoAliasesBackWithBoth) { +TEST(HostCacheTest, MergeEntries_frontWithAddressesNoAliasesBackWithBoth) { const IPAddress kAddressFront(1, 2, 3, 4); const IPEndPoint kEndpointFront(kAddressFront, 0); - HostCache::Entry front(OK, AddressList(kEndpointFront), + HostCache::Entry front(OK, {kEndpointFront}, /*aliases=*/{}, HostCache::Entry::SOURCE_DNS, base::Hours(4)); const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const IPEndPoint kEndpointBack(kAddressBack, 0); - std::vector<std::string> aliases_back({"alias1", "alias2", "alias3"}); - HostCache::Entry back(OK, AddressList(kEndpointBack, std::move(aliases_back)), + HostCache::Entry back(OK, {kEndpointBack}, {"alias1", "alias2", "alias3"}, HostCache::Entry::SOURCE_DNS, base::Hours(4)); - HostCache::Entry result = HostCache::Entry::MergeEntries(std::move(front), std::move(back)); EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().endpoints(), - ElementsAre(kEndpointBack, kEndpointFront)); + ASSERT_TRUE(result.ip_endpoints()); + EXPECT_THAT(*result.ip_endpoints(), + ElementsAre(kEndpointFront, kEndpointBack)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } -TEST(HostCacheTest, - MergeLegacyAddressEntries_backWithAddressesNoAliasesFrontWithBoth) { +TEST(HostCacheTest, MergeEntries_backWithAddressesNoAliasesFrontWithBoth) { const IPAddress kAddressFront(1, 2, 3, 4); const IPEndPoint kEndpointFront(kAddressFront, 0); - std::vector<std::string> aliases_front({"alias1", "alias2", "alias3"}); - HostCache::Entry front(OK, - AddressList(kEndpointFront, std::move(aliases_front)), + HostCache::Entry front(OK, {kEndpointFront}, {"alias1", "alias2", "alias3"}, HostCache::Entry::SOURCE_DNS, base::Hours(4)); - const IPAddress kAddressBack(0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const IPEndPoint kEndpointBack(kAddressBack, 0); - HostCache::Entry back(OK, AddressList(kEndpointBack), + HostCache::Entry back(OK, {kEndpointBack}, /*aliases=*/{}, HostCache::Entry::SOURCE_DNS, base::Hours(4)); HostCache::Entry result = @@ -2368,14 +2370,14 @@ EXPECT_EQ(OK, result.error()); EXPECT_EQ(HostCache::Entry::SOURCE_DNS, result.source()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().endpoints(), - ElementsAre(kEndpointBack, kEndpointFront)); + ASSERT_TRUE(result.ip_endpoints()); + EXPECT_THAT(*result.ip_endpoints(), + ElementsAre(kEndpointFront, kEndpointBack)); EXPECT_EQ(base::Hours(4), result.ttl()); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("alias1", "alias2", "alias3")); } @@ -2391,47 +2393,33 @@ EXPECT_EQ(base::Seconds(42), result.ttl()); } -TEST(HostCacheTest, MergeLegacyAddressEntries_FrontCannonnamePreserved) { - AddressList addresses_front; - const std::string kCanonicalNameFront = "name1"; - std::vector<std::string> front_aliases({kCanonicalNameFront}); - addresses_front.SetDnsAliases(std::move(front_aliases)); - HostCache::Entry front(OK, addresses_front, HostCache::Entry::SOURCE_DNS); +TEST(HostCacheTest, MergeEntries_FrontCannonnamePreserved) { + HostCache::Entry front(OK, /*ip_endpoints=*/{}, /*aliases=*/{"name1"}, + HostCache::Entry::SOURCE_DNS); - AddressList addresses_back; - const std::string kCanonicalNameBack = "name2"; - std::vector<std::string> back_aliases({kCanonicalNameBack}); - addresses_back.SetDnsAliases(std::move(back_aliases)); - HostCache::Entry back(OK, addresses_back, HostCache::Entry::SOURCE_DNS); + HostCache::Entry back(OK, /*ip_endpoints=*/{}, /*aliases=*/{"name2"}, + HostCache::Entry::SOURCE_DNS); HostCache::Entry result = HostCache::Entry::MergeEntries(std::move(front), std::move(back)); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), - UnorderedElementsAre("name1", "name2")); + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("name1", "name2")); } // Test that the back canonname can be used if there is no front cannonname. -TEST(HostCacheTest, MergeLegacyAddressEntries_BackCannonnameUsable) { - AddressList addresses_front; - const std::string kCanonicalNameFront = ""; - std::vector<std::string> front_aliases({kCanonicalNameFront}); - addresses_front.SetDnsAliases(std::move(front_aliases)); - HostCache::Entry front(OK, addresses_front, HostCache::Entry::SOURCE_DNS); +TEST(HostCacheTest, MergeEntries_BackCannonnameUsable) { + HostCache::Entry front(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_DNS); - AddressList addresses_back; - const std::string kCanonicalNameBack = "name2"; - std::vector<std::string> back_aliases({kCanonicalNameBack}); - addresses_back.SetDnsAliases(std::move(back_aliases)); - HostCache::Entry back(OK, addresses_back, HostCache::Entry::SOURCE_DNS); + HostCache::Entry back(OK, /*ip_endpoints=*/{}, /*aliases=*/{"name2"}, + HostCache::Entry::SOURCE_DNS); HostCache::Entry result = HostCache::Entry::MergeEntries(std::move(front), std::move(back)); - ASSERT_TRUE(result.legacy_addresses()); - EXPECT_THAT(result.legacy_addresses().value().dns_aliases(), - UnorderedElementsAre(kCanonicalNameBack)); + ASSERT_TRUE(result.aliases()); + EXPECT_THAT(*result.aliases(), UnorderedElementsAre("name2")); } } // namespace net
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc index cb31b7d..095269c 100644 --- a/net/dns/host_resolver_manager.cc +++ b/net/dns/host_resolver_manager.cc
@@ -577,12 +577,6 @@ //----------------------------------------------------------------------------- -bool ResolveLocalHostname(base::StringPiece host, AddressList* address_list) { - address_list->clear(); - - return ResolveLocalHostname(host, &address_list->endpoints()); -} - bool ResolveLocalHostname(base::StringPiece host, std::vector<IPEndPoint>* address_list) { address_list->clear(); @@ -811,42 +805,21 @@ DCHECK(!endpoint_results_.has_value()); DCHECK(!fixed_up_dns_alias_results_.has_value()); - if (results_.value().legacy_addresses().has_value()) { - DCHECK(!results_.value().ip_endpoints()); - legacy_address_results_ = results_.value().legacy_addresses(); - endpoint_results_ = HostResolver::AddressListToEndpointResults( - legacy_address_results_.value()); - - fixed_up_dns_alias_results_ = std::set<std::string>( - legacy_address_results_.value().dns_aliases().begin(), - legacy_address_results_.value().dns_aliases().end()); - - // Skip fixups for `include_canonical_name` requests. Just use the - // canonical name exactly as it was received from the system resolver. + endpoint_results_ = results_.value().GetEndpoints(); + if (endpoint_results_.has_value()) { + DCHECK(results_.value().aliases()); + fixed_up_dns_alias_results_ = *results_.value().aliases(); if (parameters().include_canonical_name) { - DCHECK_LE(legacy_address_results_.value().dns_aliases().size(), 1u); + DCHECK_LE(fixed_up_dns_alias_results_.value().size(), 1u); } else { - fixed_up_dns_alias_results_ = dns_alias_utility::FixUpDnsAliases( - fixed_up_dns_alias_results_.value()); + // Expect `aliases()` results to already be fixed up. + DCHECK(dns_alias_utility::FixUpDnsAliases( + fixed_up_dns_alias_results_.value()) == + fixed_up_dns_alias_results_.value()); } - } else { - endpoint_results_ = results_.value().GetEndpoints(); - if (endpoint_results_.has_value()) { - DCHECK(results_.value().aliases()); - fixed_up_dns_alias_results_ = *results_.value().aliases(); - if (parameters().include_canonical_name) { - DCHECK_LE(fixed_up_dns_alias_results_.value().size(), 1u); - } else { - // Expect `aliases()` results to already be fixed up. - DCHECK(dns_alias_utility::FixUpDnsAliases( - fixed_up_dns_alias_results_.value()) == - fixed_up_dns_alias_results_.value()); - } - - legacy_address_results_ = HostResolver::EndpointResultToAddressList( - endpoint_results_.value(), fixed_up_dns_alias_results_.value()); - } + legacy_address_results_ = HostResolver::EndpointResultToAddressList( + endpoint_results_.value(), fixed_up_dns_alias_results_.value()); } } @@ -1795,11 +1768,7 @@ timeout_timer_.Stop(); absl::optional<std::vector<IPEndPoint>> ip_endpoints; - if (results.legacy_addresses().has_value()) { - ip_endpoints = results.legacy_addresses().value().endpoints(); - } else { - ip_endpoints = base::OptionalFromPtr(results.ip_endpoints()); - } + ip_endpoints = base::OptionalFromPtr(results.ip_endpoints()); if (ip_endpoints.has_value()) { // If there are multiple addresses, and at least one is IPv6, need to @@ -1826,16 +1795,8 @@ bool secure, bool success, std::vector<IPEndPoint> sorted) { - if (results.legacy_addresses().has_value()) { - AddressList sorted_list; - sorted_list.endpoints() = std::move(sorted); - sorted_list.SetDnsAliases(results.legacy_addresses()->dns_aliases()); - - results.set_legacy_addresses(std::move(sorted_list)); - } else { - DCHECK(results.ip_endpoints()); - results.set_ip_endpoints(std::move(sorted)); - } + DCHECK(results.ip_endpoints()); + results.set_ip_endpoints(std::move(sorted)); if (!success) { OnFailure(ERR_DNS_SORT_ERROR, /*allow_fallback=*/true, @@ -1844,8 +1805,7 @@ } // AddressSorter prunes unusable destinations. - if (results.legacy_addresses().value_or(AddressList()).empty() && - (!results.ip_endpoints() || results.ip_endpoints()->empty()) && + if ((!results.ip_endpoints() || results.ip_endpoints()->empty()) && results.text_records().value_or(std::vector<std::string>()).empty() && results.hostnames().value_or(std::vector<HostPortPair>()).empty()) { LOG(WARNING) << "Address list empty after RFC3484 sort"; @@ -2769,8 +2729,6 @@ // transaction, e.g. a supplemental HTTPS transaction, finds results. DCHECK(!key_.query_types.Has(DnsQueryType::UNSPECIFIED)); if (HasAddressType(key_.query_types) && results.error() == OK && - (!results.legacy_addresses() || - results.legacy_addresses().value().empty()) && (!results.ip_endpoints() || results.ip_endpoints()->empty())) { results.set_error(ERR_NAME_NOT_RESOLVED); } @@ -2795,10 +2753,7 @@ base::TimeDelta bounded_ttl = std::max(results.ttl(), base::Seconds(kMinimumTTLSeconds)); - if ((results.legacy_addresses() && - ContainsIcannNameCollisionIp( - results.legacy_addresses().value().endpoints())) || - (results.ip_endpoints() && + if ((results.ip_endpoints() && ContainsIcannNameCollisionIp(*results.ip_endpoints()))) { CompleteRequestsWithError(ERR_ICANN_NAME_COLLISION); return; @@ -2870,15 +2825,15 @@ // TODO(crbug.com/846423): Consider adding MDNS-specific logging. HostCache::Entry results = mdns_task_->GetResults(); - if (results.legacy_addresses() && - ContainsIcannNameCollisionIp( - results.legacy_addresses().value().endpoints())) { + + if ((results.ip_endpoints() && + ContainsIcannNameCollisionIp(*results.ip_endpoints()))) { CompleteRequestsWithError(ERR_ICANN_NAME_COLLISION); - } else { - // MDNS uses a separate cache, so skip saving result to cache. - // TODO(crbug.com/926300): Consider merging caches. - CompleteRequestsWithoutCache(results, absl::nullopt /* stale_info */); + return; } + // MDNS uses a separate cache, so skip saving result to cache. + // TODO(crbug.com/926300): Consider merging caches. + CompleteRequestsWithoutCache(results, absl::nullopt /* stale_info */); } void OnMdnsImmediateFailure(int rv) {
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h index 30be8ce..922e5a6 100644 --- a/net/dns/host_resolver_manager.h +++ b/net/dns/host_resolver_manager.h
@@ -53,7 +53,6 @@ namespace net { -class AddressList; class DnsClient; class DnsProbeRunner; class IPAddress; @@ -566,8 +565,6 @@ // This function is only exposed so it can be unit-tested. // TODO(tfarina): It would be better to change the tests so this function // gets exercised indirectly through HostResolverManager. -NET_EXPORT_PRIVATE bool ResolveLocalHostname(base::StringPiece host, - AddressList* address_list); NET_EXPORT_PRIVATE bool ResolveLocalHostname( base::StringPiece host, std::vector<IPEndPoint>* address_list);
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc index dd390a8..0c2b888 100644 --- a/net/dns/host_resolver_manager_unittest.cc +++ b/net/dns/host_resolver_manager_unittest.cc
@@ -488,7 +488,8 @@ } }; -bool HasAddress(const IPAddress& search_address, const AddressList& addresses) { +bool HasAddress(const IPAddress& search_address, + const std::vector<IPEndPoint>& addresses) { for (const auto& address : addresses) { if (search_address == address.address()) return true; @@ -497,7 +498,7 @@ } void TestBothLoopbackIPs(const std::string& host) { - AddressList addresses; + std::vector<IPEndPoint> addresses; EXPECT_TRUE(ResolveLocalHostname(host, &addresses)); EXPECT_EQ(2u, addresses.size()); EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses)); @@ -623,7 +624,7 @@ void PopulateCache(const HostCache::Key& key, IPEndPoint endpoint) { resolver_->CacheResult(resolve_context_->host_cache(), key, - HostCache::Entry(OK, AddressList(endpoint), + HostCache::Entry(OK, {endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN), base::Seconds(1)); } @@ -4007,9 +4008,8 @@ cache_entry.network_isolation_key); IPAddress address; ASSERT_TRUE(address.AssignFromIPLiteral(cache_entry.cached_ip_address)); - HostCache::Entry entry = - HostCache::Entry(OK, AddressList::CreateFromIPAddress(address, 80), - HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry = HostCache::Entry( + OK, {{address, 80}}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); resolve_context_->host_cache()->Set(key, entry, base::TimeTicks::Now(), base::Days(1)); } @@ -7858,7 +7858,7 @@ } TEST_F(HostResolverManagerTest, ResolveLocalHostname) { - AddressList addresses; + std::vector<IPEndPoint> addresses; TestBothLoopbackIPs("localhost"); TestBothLoopbackIPs("localhoST"); @@ -15074,17 +15074,16 @@ const NetworkIsolationKey kIsolationKey; const url::SchemeHostPort kEndpoint = url::SchemeHostPort(url::kHttpsScheme, "bootstrap", 443); - const AddressList kCacheAddrs = AddressList::CreateFromIPAddressList( - {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, - {192, 0, 2, 1}}, - {}); + const std::vector<IPEndPoint> kCacheAddrs = { + {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 0}, + {{192, 0, 2, 1}, 0}}; const std::vector<IPEndPoint> kBootstrapAddrs = { {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, 0}, {{192, 0, 2, 2}, 0}}; // The mock DNS client always returns localhost. - const AddressList kRemoteAddrs = AddressList::CreateFromIPAddressList( - {IPAddress::IPv6Localhost(), IPAddress::IPv4Localhost()}, - {}); + const std::vector<IPEndPoint> kRemoteAddrs = { + {IPAddress::IPv6Localhost(), 0}, + {IPAddress::IPv4Localhost(), 0}}; static HostResolver::ResolveHostParameters bootstrap_params() { HostResolver::ResolveHostParameters params; @@ -15115,7 +15114,8 @@ void PopulateCache(bool secure) { constexpr base::TimeDelta kTtl = base::Seconds(3600); - HostCache::Entry entry(OK, kCacheAddrs, HostCache::Entry::SOURCE_DNS, kTtl); + HostCache::Entry entry(OK, kCacheAddrs, /*aliases=*/{}, + HostCache::Entry::SOURCE_DNS, kTtl); resolve_context_->host_cache()->Set(MakeCacheKey(secure), std::move(entry), GetMockTickClock()->NowTicks(), kTtl); }
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc index 6bf961a7..9e959f4 100644 --- a/net/dns/mock_host_resolver.cc +++ b/net/dns/mock_host_resolver.cc
@@ -972,7 +972,7 @@ // Immediately resolve any "localhost" or recognized similar names. if (IsAddressType(dns_query_type) && - ResolveLocalHostname(GetHostname(endpoint), addresses)) { + ResolveLocalHostname(GetHostname(endpoint), &addresses->endpoints())) { return OK; } int rv = ERR_DNS_CACHE_MISS; @@ -1001,7 +1001,13 @@ rv = cache_result->second.error(); if (rv == OK) { *addresses = AddressList::CopyWithPort( - cache_result->second.legacy_addresses().value(), GetPort(endpoint)); + AddressList(*cache_result->second.ip_endpoints()), + GetPort(endpoint)); + if (cache_result->second.aliases()) { + const auto& aliasess = *cache_result->second.aliases(); + addresses->SetDnsAliases( + std::vector<std::string>(aliasess.begin(), aliasess.end())); + } *out_stale_info = std::move(stale_info); } @@ -1036,11 +1042,17 @@ request.SetAddressResults(address_results, /*staleness=*/absl::nullopt); error = request.resolve_error_info().error; - cache_entry = - request.address_results() - ? HostCache::Entry(error, *request.address_results(), - HostCache::Entry::SOURCE_UNKNOWN) - : HostCache::Entry(error, HostCache::Entry::SOURCE_UNKNOWN); + if (request.address_results()) { + const auto& dns_aliases = request.address_results()->dns_aliases(); + cache_entry = HostCache::Entry( + error, request.address_results()->endpoints(), + dns_aliases.empty() + ? std::set<std::string>() + : std::set<std::string>(dns_aliases.begin(), dns_aliases.end()), + HostCache::Entry::SOURCE_UNKNOWN); + } else { + cache_entry = HostCache::Entry(error, HostCache::Entry::SOURCE_UNKNOWN); + } } else if (absl::holds_alternative<std::vector<HostResolverEndpointResult>>( result)) { const auto& endpoint_results =
diff --git a/net/dns/mock_host_resolver.h b/net/dns/mock_host_resolver.h index 5c69e1d..9bc0c45 100644 --- a/net/dns/mock_host_resolver.h +++ b/net/dns/mock_host_resolver.h
@@ -22,6 +22,7 @@ #include "base/synchronization/waitable_event.h" #include "base/threading/thread_checker.h" #include "net/base/address_family.h" +#include "net/base/address_list.h" #include "net/base/completion_once_callback.h" #include "net/base/host_port_pair.h" #include "net/base/net_errors.h"
diff --git a/net/dns/resolve_context_unittest.cc b/net/dns/resolve_context_unittest.cc index 4543399..4414b024 100644 --- a/net/dns/resolve_context_unittest.cc +++ b/net/dns/resolve_context_unittest.cc
@@ -332,7 +332,8 @@ HostResolverSource::ANY, NetworkIsolationKey()); context.host_cache()->Set( key, - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN), + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN), now, base::Seconds(10)); ASSERT_TRUE(context.host_cache()->Lookup(key, now)); @@ -347,7 +348,8 @@ // Re-add to the host cache and now add some DoH server status. context.host_cache()->Set( key, - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN), + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN), now, base::Seconds(10)); context.RecordServerSuccess(0u /* server_index */, true /* is_doh_server */, session.get()); @@ -383,7 +385,8 @@ HostResolverSource::ANY, NetworkIsolationKey()); context.host_cache()->Set( key, - HostCache::Entry(OK, AddressList(), HostCache::Entry::SOURCE_UNKNOWN), + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{"example.com"}, + HostCache::Entry::SOURCE_UNKNOWN), now, base::Seconds(10)); context.RecordServerSuccess(0u /* server_index */, true /* is_doh_server */, session.get());
diff --git a/net/nqe/network_quality_estimator_util.cc b/net/nqe/network_quality_estimator_util.cc index 5fd71c6..6dddd842 100644 --- a/net/nqe/network_quality_estimator_util.cc +++ b/net/nqe/network_quality_estimator_util.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/check_op.h" #include "base/notreached.h" +#include "net/base/address_list.h" #include "net/base/host_port_pair.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h"
diff --git a/net/quic/dedicated_web_transport_http3_client.cc b/net/quic/dedicated_web_transport_http3_client.cc index f72f5e8b..9d3116e 100644 --- a/net/quic/dedicated_web_transport_http3_client.cc +++ b/net/quic/dedicated_web_transport_http3_client.cc
@@ -10,6 +10,7 @@ #include "base/metrics/histogram_functions.h" #include "base/strings/abseil_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" +#include "net/base/address_list.h" #include "net/base/port_util.h" #include "net/base/url_util.h" #include "net/http/http_network_session.h"
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc index 4c4c0ec9..4dae8030 100644 --- a/net/quic/quic_stream_factory.cc +++ b/net/quic/quic_stream_factory.cc
@@ -32,6 +32,7 @@ #include "base/trace_event/trace_event.h" #include "base/values.h" #include "crypto/openssl_util.h" +#include "net/base/address_list.h" #include "net/base/features.h" #include "net/base/ip_address.h" #include "net/base/net_errors.h"
diff --git a/net/socket/socks_client_socket.cc b/net/socket/socks_client_socket.cc index a6887260..1355a5d 100644 --- a/net/socket/socks_client_socket.cc +++ b/net/socket/socks_client_socket.cc
@@ -10,6 +10,7 @@ #include "base/callback_helpers.h" #include "base/compiler_specific.h" #include "base/sys_byteorder.h" +#include "net/base/address_list.h" #include "net/base/io_buffer.h" #include "net/dns/public/dns_query_type.h" #include "net/dns/public/secure_dns_policy.h"
diff --git a/remoting/host/desktop_resizer_x11.cc b/remoting/host/desktop_resizer_x11.cc index 6e83afe..6c196310 100644 --- a/remoting/host/desktop_resizer_x11.cc +++ b/remoting/host/desktop_resizer_x11.cc
@@ -10,6 +10,8 @@ #include "base/command_line.h" #include "base/cxx17_backports.h" #include "base/memory/ptr_util.h" +#include "base/stl_util.h" +#include "base/strings/string_number_conversions.h" #include "remoting/base/logging.h" #include "remoting/host/linux/x11_util.h" #include "ui/gfx/x/future.h" @@ -36,10 +38,6 @@ // 2. Delete the CRD mode, if it exists. // 3. Create the CRD mode at the new resolution. // 4. Set the Output to the CRD mode (which re-enables it). -// -// Name consistency will allow a future CL to disable resize-to-client if the -// user has changed the mode to something other than "Chrome Remote Desktop -// client resolution". It doesn't make the code significantly more complex. namespace { @@ -165,8 +163,8 @@ // Ignore X errors encountered while resizing the display. We might hit an // error, for example if xrandr has been used to add a mode with the same - // name as our temporary mode, or to remove the "client resolution" mode. We - // don't want to terminate the process if this happens. + // name as our mode, or to remove it. We don't want to terminate the process + // if this happens. x11::ScopedIgnoreErrors ignore_errors(connection_); // Grab the X server while we're changing the display resolution. This ensures @@ -176,13 +174,47 @@ if (!resources_.Refresh(randr_, root_)) return; - // TODO(crbug.com/1326339): Instead of hard-coding the first output, find the - // one attached to the RANDR monitor |screen_id|. - x11::RandR::Output output = resources_.get()->outputs[0]; - if (exact_resize_) - SetResolutionNewMode(output, resolution); - else - SetResolutionExistingMode(resolution); + // RANDR does not allow fetching information on a particular monitor. So + // fetch all of them and try to find the requested monitor. + auto reply = randr_->GetMonitors({root_}).Sync(); + if (!reply) { + return; + } + + for (const auto& monitor : reply->monitors) { + if (static_cast<webrtc::ScreenId>(monitor.name) != screen_id) { + continue; + } + + if (monitor.outputs.size() != 1) { + // This implementation only supports resizing a Monitor attached to a + // single output. The case where size() > 1 should never occur with + // Xorg+video-dummy. + // TODO(crbug.com/1326339): Maybe support resizing a Monitor not + // attached to any Output? + LOG(ERROR) << "Monitor " << screen_id + << " has unexpected #outputs: " << monitor.outputs.size(); + return; + } + + if (!monitor.automatic) { + // This implementation only supports resizing synthesized Monitors which + // automatically track their Outputs. + // TODO(crbug.com/1326339): Maybe support resizing manually-created + // Monitors? + LOG(ERROR) << "Not resizing Monitor " << screen_id + << " that was created manually."; + return; + } + + auto output = monitor.outputs[0]; + if (exact_resize_) + SetResolutionNewMode(output, resolution); + else + SetResolutionExistingMode(resolution); + return; + } + LOG(ERROR) << "Monitor " << screen_id << " not found."; } void DesktopResizerX11::RestoreResolution(const ScreenResolution& original, @@ -193,8 +225,10 @@ void DesktopResizerX11::SetResolutionNewMode( x11::RandR::Output output, const ScreenResolution& resolution) { - // The name of the mode representing the current client view resolution. - const char* kModeName = "Chrome Remote Desktop client resolution"; + // The name of the mode representing the current client view resolution. This + // must be unique per Output, so that Outputs can be resized independently. + std::string mode_name = + "CRD_" + base::NumberToString(base::to_underlying(output)); // Actually do the resize operation, preserving the current mode name. Note // that we have to detach the output from the mode in order to delete the @@ -208,15 +242,15 @@ PixelsToMillimeters(resolution.dimensions().width(), kDefaultDPI); uint32_t height_mm = PixelsToMillimeters(resolution.dimensions().height(), kDefaultDPI); - SwitchToMode(output, nullptr); + SwitchToMode(output, std::string()); randr_->SetScreenSize( {root_, static_cast<uint16_t>(resolution.dimensions().width()), static_cast<uint16_t>(resolution.dimensions().height()), width_mm, height_mm}); - DeleteMode(output, kModeName); - CreateMode(output, kModeName, resolution.dimensions().width(), + DeleteMode(output, mode_name); + CreateMode(output, mode_name, resolution.dimensions().width(), resolution.dimensions().height()); - SwitchToMode(output, kModeName); + SwitchToMode(output, mode_name); } void DesktopResizerX11::SetResolutionExistingMode( @@ -242,14 +276,14 @@ } void DesktopResizerX11::CreateMode(x11::RandR::Output output, - const char* name, + const std::string& name, int width, int height) { x11::RandR::ModeInfo mode; mode.width = width; mode.height = height; - mode.name_len = strlen(name); - randr_->CreateMode({root_, mode, name}); + mode.name_len = name.size(); + randr_->CreateMode({root_, mode, name.c_str()}); if (!resources_.Refresh(randr_, root_)) return; @@ -265,7 +299,7 @@ } void DesktopResizerX11::DeleteMode(x11::RandR::Output output, - const char* name) { + const std::string& name) { x11::RandR::Mode mode_id = resources_.GetIdForMode(name); if (mode_id != kInvalidMode) { randr_->DeleteOutputMode({output, mode_id}); @@ -275,10 +309,10 @@ } void DesktopResizerX11::SwitchToMode(x11::RandR::Output output, - const char* name) { + const std::string& name) { auto mode_id = kInvalidMode; std::vector<x11::RandR::Output> outputs; - if (name) { + if (!name.empty()) { mode_id = resources_.GetIdForMode(name); if (mode_id == kInvalidMode) { LOG(ERROR) << "No ID found for mode: " << name; @@ -298,9 +332,9 @@ x11::RandR::Crtc crtc = output_info->crtc; if (crtc == kDisabledCrtc) { - // The output is disabled. If |name| is nullptr, the caller requested the + // The output is disabled. If |name| is empty, the caller requested the // output be disabled, so there is nothing further to do. - if (!name) + if (name.empty()) return; // |crtcs| is the set of CRTCs that this output is allowed to attach to.
diff --git a/remoting/host/desktop_resizer_x11.h b/remoting/host/desktop_resizer_x11.h index 54f35fc..a57f0b7 100644 --- a/remoting/host/desktop_resizer_x11.h +++ b/remoting/host/desktop_resizer_x11.h
@@ -62,17 +62,17 @@ // Create a mode, and attach it to the output. If the mode already exists, it // is left unchanged. void CreateMode(x11::RandR::Output output, - const char* name, + const std::string& name, int width, int height); // Remove the specified mode from the output, and delete it. If the mode is in // use, it is not deleted. - void DeleteMode(x11::RandR::Output output, const char* name); + void DeleteMode(x11::RandR::Output output, const std::string& name); - // Switch the output to the specified mode. If name is nullptr, the output is + // Switch the output to the specified mode. If name is empty, the output is // disabled instead, which is required before changing its resolution. - void SwitchToMode(x11::RandR::Output output, const char* name); + void SwitchToMode(x11::RandR::Output output, const std::string& name); raw_ptr<x11::Connection> connection_; const raw_ptr<x11::RandR> randr_ = nullptr;
diff --git a/remoting/host/native_messaging/log_message_handler.cc b/remoting/host/native_messaging/log_message_handler.cc index 95d1187..9b1ae563b5 100644 --- a/remoting/host/native_messaging/log_message_handler.cc +++ b/remoting/host/native_messaging/log_message_handler.cc
@@ -82,16 +82,24 @@ int line, size_t message_start, const std::string& str) { - // Don't process this message if we're already logging and on the caller - // thread. This guards against an infinite loop if any code called by this - // class logs something. - if (suppress_logging_ && caller_task_runner_->BelongsToCurrentThread()) { - return; + if (caller_task_runner_->BelongsToCurrentThread()) { + // Don't process this message if we're already logging and on the caller + // thread. This guards against an infinite loop if any code called by this + // class logs something. + if (suppress_logging_) { + return; + } + + if (log_synchronously_if_possible_) { + SendLogMessageToClient(severity, file, line, message_start, str); + return; + } } // This method is always called under the global lock, so post a task to - // handle the log message, even if we're already on the correct thread. - // This allows the lock to be released quickly. + // handle the log message, even if we're already on the correct thread, unless + // it is explicitly configured not to do so. This allows the lock to be + // released quickly. // // Note that this means that LOG(FATAL) messages will be lost because the // process will exit before the message is sent to the client.
diff --git a/remoting/host/native_messaging/log_message_handler.h b/remoting/host/native_messaging/log_message_handler.h index cbfdbf4..394eaef9 100644 --- a/remoting/host/native_messaging/log_message_handler.h +++ b/remoting/host/native_messaging/log_message_handler.h
@@ -11,7 +11,6 @@ #include "base/callback.h" #include "base/logging.h" -#include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/values.h" @@ -38,9 +37,20 @@ explicit LogMessageHandler(const DelegateDeprecated& delegate); ~LogMessageHandler(); + // When set to true, if a message is logged on the caller thread, the message + // will be synchronously sent to the delegate; otherwise a task will always + // be posted to the caller thread to handle the message. Defaults to false to + // prevent blocking LOG calls. Set this to false if you want to make sure a + // log gets handled when the caller sequence is about to be terminated. + void set_log_synchronously_if_possible(bool log_synchronously_if_possible) { + log_synchronously_if_possible_ = log_synchronously_if_possible; + } + static const char* kDebugMessageTypeName; private: + // TODO(yuweih): Reimplement this class using using a message queue which is + // protected by |g_log_message_handler_lock|. static bool OnLogMessage( int severity, const char* file, int line, size_t message_start, const std::string& str); @@ -53,6 +63,9 @@ Delegate delegate_; bool suppress_logging_; + bool log_synchronously_if_possible_ = false; + // TODO(yuweih): Replace all "thread" references in this class with + // "sequence". scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; logging::LogMessageHandlerFunction previous_log_message_handler_; base::WeakPtrFactory<LogMessageHandler> weak_ptr_factory_{this};
diff --git a/remoting/host/webauthn/remote_webauthn_main.cc b/remoting/host/webauthn/remote_webauthn_main.cc index a0357ac..734d98e 100644 --- a/remoting/host/webauthn/remote_webauthn_main.cc +++ b/remoting/host/webauthn/remote_webauthn_main.cc
@@ -35,6 +35,7 @@ int RemoteWebAuthnMain(int argc, char** argv) { base::AtExitManager exit_manager; base::SingleThreadTaskExecutor task_executor(base::MessagePumpType::IO); + base::ThreadPoolInstance::Create("RemoteWebAuthn"); auto task_runner = base::ThreadTaskRunnerHandle::Get(); base::CommandLine::Init(argc, argv);
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc index 76e45ca..0228fd38 100644 --- a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc +++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
@@ -14,14 +14,12 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "mojo/public/cpp/bindings/pending_remote.h" -#include "mojo/public/cpp/platform/named_platform_channel.h" -#include "mojo/public/cpp/system/isolated_connection.h" +#include "remoting/base/logging.h" #include "remoting/host/chromoting_host_services_client.h" #include "remoting/host/mojom/webauthn_proxy.mojom.h" #include "remoting/host/native_messaging/native_messaging_constants.h" #include "remoting/host/native_messaging/native_messaging_helpers.h" #include "remoting/host/webauthn/remote_webauthn_constants.h" -#include "remoting/host/webauthn/remote_webauthn_message_handler.h" namespace remoting { @@ -62,10 +60,17 @@ RemoteWebAuthnNativeMessagingHost::~RemoteWebAuthnNativeMessagingHost() { DCHECK(task_runner_->BelongsToCurrentThread()); +#if !BUILDFLAG(IS_CHROMEOS_ASH) + // This makes sure the log messages below get sent to the extension before the + // caller sequence gets terminated. + log_message_handler_->set_log_synchronously_if_possible(true); +#endif // !BUILDFLAG(IS_CHROMEOS_ASH) + if (!id_to_request_canceller_.empty()) { LOG(WARNING) << id_to_request_canceller_.size() << "Requests are still pending at destruction."; } + HOST_LOG << "Remote WebAuthn native messaging host is being terminated"; } void RemoteWebAuthnNativeMessagingHost::OnMessage(const std::string& message) { @@ -109,6 +114,7 @@ &RemoteWebAuthnNativeMessagingHost::SendMessageToClient, base::Unretained(this))); #endif // !BUILDFLAG(IS_CHROMEOS_ASH) + HOST_LOG << "Remote WebAuthn native messaging host has started"; } scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host.h b/remoting/host/webauthn/remote_webauthn_native_messaging_host.h index a65c49a4d..9efecf0 100644 --- a/remoting/host/webauthn/remote_webauthn_native_messaging_host.h +++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/callback.h" #include "base/callback_forward.h" #include "base/containers/flat_map.h" #include "base/containers/queue.h"
diff --git a/remoting/resources/remoting_strings.grd b/remoting/resources/remoting_strings.grd index b6324e4..805de5a4 100644 --- a/remoting/resources/remoting_strings.grd +++ b/remoting/resources/remoting_strings.grd
@@ -7,7 +7,7 @@ <emit emit_type="prepend"/> </output> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/af.pak" lang="af" type="data_package"/> </if> <output filename="remoting/resources/am.pak" lang="am" type="data_package"/> @@ -16,14 +16,14 @@ <output filename="remoting/resources/bn.pak" lang="bn" type="data_package"/> <output filename="remoting/resources/ca.pak" lang="ca" type="data_package"/> <output filename="remoting/resources/cs.pak" lang="cs" type="data_package"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/cy.pak" lang="cy" type="data_package"/> </if> <output filename="remoting/resources/da.pak" lang="da" type="data_package"/> <output filename="remoting/resources/de.pak" lang="de" type="data_package"/> <output filename="remoting/resources/el.pak" lang="el" type="data_package"/> <output filename="remoting/resources/en-GB.pak" lang="en-GB" type="data_package"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/en-US.pak" lang="en" type="data_package"/> </if> <output filename="remoting/resources/en.pak" lang="en" type="data_package"/> @@ -36,14 +36,14 @@ </if> <output filename="remoting/resources/es.pak" lang="es" type="data_package"/> <output filename="remoting/resources/et.pak" lang="et" type="data_package"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/eu.pak" lang="eu" type="data_package"/> </if> <output filename="remoting/resources/fa.pak" lang="fa" type="data_package"/> <output filename="remoting/resources/fi.pak" lang="fi" type="data_package"/> <output filename="remoting/resources/fil.pak" lang="fil" type="data_package"/> <output filename="remoting/resources/fr.pak" lang="fr" type="data_package"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/gl.pak" lang="gl" type="data_package"/> </if> <output filename="remoting/resources/gu.pak" lang="gu" type="data_package"/> @@ -52,7 +52,7 @@ <output filename="remoting/resources/hr.pak" lang="hr" type="data_package"/> <output filename="remoting/resources/hu.pak" lang="hu" type="data_package"/> <output filename="remoting/resources/id.pak" lang="id" type="data_package"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/is.pak" lang="is" type="data_package"/> </if> <output filename="remoting/resources/it.pak" lang="it" type="data_package"/> @@ -91,7 +91,7 @@ <output filename="remoting/resources/vi.pak" lang="vi" type="data_package"/> <output filename="remoting/resources/zh-CN.pak" lang="zh-CN" type="data_package"/> <output filename="remoting/resources/zh-TW.pak" lang="zh-TW" type="data_package"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/zu.pak" lang="zu" type="data_package"/> </if> @@ -99,7 +99,7 @@ <output filename="remoting/resources/ar-XB.pak" lang="ar-XB" type="data_package"/> <output filename="remoting/resources/en-XA.pak" lang="en-XA" type="data_package"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/_locales/af/messages.json" lang="af" type="chrome_messages_json"/> </if> <output filename="remoting/resources/_locales/am/messages.json" lang="am" type="chrome_messages_json"/> @@ -108,7 +108,7 @@ <output filename="remoting/resources/_locales/bn/messages.json" lang="bn" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/ca/messages.json" lang="ca" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/cs/messages.json" lang="cs" type="chrome_messages_json"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/_locales/cy/messages.json" lang="cy" type="chrome_messages_json"/> </if> <output filename="remoting/resources/_locales/da/messages.json" lang="da" type="chrome_messages_json"/> @@ -116,7 +116,7 @@ <output filename="remoting/resources/_locales/fa/messages.json" lang="fa" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/el/messages.json" lang="el" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/en/messages.json" lang="en" type="chrome_messages_json"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <!-- lang="en-US" will create an empty json file. --> <output filename="remoting/resources/_locales/en_US/messages.json" lang="en" type="chrome_messages_json"/> </if> @@ -130,13 +130,13 @@ <output filename="remoting/resources/_locales/es_419/messages.json" lang="es-419" type="chrome_messages_json"/> </if> <output filename="remoting/resources/_locales/et/messages.json" lang="et" type="chrome_messages_json"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/_locales/eu/messages.json" lang="eu" type="chrome_messages_json"/> </if> <output filename="remoting/resources/_locales/fi/messages.json" lang="fi" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/fil/messages.json" lang="fil" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/fr/messages.json" lang="fr" type="chrome_messages_json"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/_locales/gl/messages.json" lang="gl" type="chrome_messages_json"/> </if> <output filename="remoting/resources/_locales/gu/messages.json" lang="gu" type="chrome_messages_json"/> @@ -145,7 +145,7 @@ <output filename="remoting/resources/_locales/hr/messages.json" lang="hr" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/hu/messages.json" lang="hu" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/id/messages.json" lang="id" type="chrome_messages_json"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/_locales/is/messages.json" lang="is" type="chrome_messages_json"/> </if> <output filename="remoting/resources/_locales/it/messages.json" lang="it" type="chrome_messages_json"/> @@ -184,7 +184,7 @@ <output filename="remoting/resources/_locales/vi/messages.json" lang="vi" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/zh_CN/messages.json" lang="zh-CN" type="chrome_messages_json"/> <output filename="remoting/resources/_locales/zh_TW/messages.json" lang="zh-TW" type="chrome_messages_json"/> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <output filename="remoting/resources/_locales/zu/messages.json" lang="zu" type="chrome_messages_json"/> </if>
diff --git a/services/network/mojo_host_resolver_impl.cc b/services/network/mojo_host_resolver_impl.cc index 2a9a760f..86fdc14 100644 --- a/services/network/mojo_host_resolver_impl.cc +++ b/services/network/mojo_host_resolver_impl.cc
@@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/memory/raw_ptr.h" #include "mojo/public/cpp/bindings/remote.h" +#include "net/base/address_list.h" #include "net/base/host_port_pair.h" #include "net/base/ip_address.h" #include "net/base/net_errors.h"
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc index e8d9d89..024f8f5 100644 --- a/services/network/network_context_unittest.cc +++ b/services/network/network_context_unittest.cc
@@ -1903,7 +1903,7 @@ net::HostCache::Key(domain, net::DnsQueryType::UNSPECIFIED, 0, net::HostResolverSource::ANY, net::NetworkIsolationKey()), - net::HostCache::Entry(net::OK, net::AddressList(), + net::HostCache::Entry(net::OK, /*ip_endpoints=*/{}, /*aliases=*/{}, net::HostCache::Entry::SOURCE_UNKNOWN), base::TimeTicks::Now(), base::Days(1)); host_cache->Set( @@ -1911,7 +1911,7 @@ url::SchemeHostPort(url::kHttpsScheme, domain, 443), net::DnsQueryType::UNSPECIFIED, 0, net::HostResolverSource::ANY, net::NetworkIsolationKey()), - net::HostCache::Entry(net::OK, net::AddressList(), + net::HostCache::Entry(net::OK, /*ip_endpoints=*/{}, /*aliases=*/{}, net::HostCache::Entry::SOURCE_UNKNOWN), base::TimeTicks::Now(), base::Days(1)); }
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 da1dff4..d414e7fd 100644 --- a/services/network/public/cpp/optional_trust_token_params_unittest.cc +++ b/services/network/public/cpp/optional_trust_token_params_unittest.cc
@@ -26,7 +26,7 @@ OptionalTrustTokenParams NonemptyTrustTokenParams() { return mojom::TrustTokenParams( mojom::TrustTokenOperationType::kRedemption, - mojom::TrustTokenRefreshPolicy::kRefresh, + mojom::TrustTokenRefreshPolicy::kRefresh, "custom_key_commitment", mojom::TrustTokenSignRequestData::kInclude, /*include_timestamp_header=*/true, std::vector<url::Origin>{url::Origin::Create(GURL("https://issuer.com"))},
diff --git a/services/network/public/mojom/trust_tokens.mojom b/services/network/public/mojom/trust_tokens.mojom index 29fbfc32..716db86 100644 --- a/services/network/public/mojom/trust_tokens.mojom +++ b/services/network/public/mojom/trust_tokens.mojom
@@ -123,6 +123,10 @@ // redeem a new token, evicting the RR currently stored. TrustTokenRefreshPolicy refresh_policy = kUseCached; + // "custom_key_commitment" stores a custom key commitment that should be + // used for this operation if set. + string? custom_key_commitment; + // The remaining members are used only when "type" is "kSigning": these // parameters specify the manner in which the outgoing request should be // signed, including optionally specifying additional data to add in
diff --git a/services/network/trust_tokens/trust_token_request_helper_factory.cc b/services/network/trust_tokens/trust_token_request_helper_factory.cc index 85a2df2d..b9b08b4 100644 --- a/services/network/trust_tokens/trust_token_request_helper_factory.cc +++ b/services/network/trust_tokens/trust_token_request_helper_factory.cc
@@ -150,6 +150,7 @@ Outcome::kSuccessfullyCreatedAnIssuanceHelper); auto helper = std::make_unique<TrustTokenRequestIssuanceHelper>( std::move(top_frame_origin), store, key_commitment_getter_, + params->custom_key_commitment, std::make_unique<BoringsslTrustTokenIssuanceCryptographer>(), std::make_unique<LocalTrustTokenOperationDelegateImpl>( context_client_provider_), @@ -166,7 +167,8 @@ Outcome::kSuccessfullyCreatedARedemptionHelper); auto helper = std::make_unique<TrustTokenRequestRedemptionHelper>( std::move(top_frame_origin), params->refresh_policy, store, - key_commitment_getter_, std::make_unique<EcdsaP256KeyPairGenerator>(), + key_commitment_getter_, params->custom_key_commitment, + std::make_unique<EcdsaP256KeyPairGenerator>(), std::make_unique<BoringsslTrustTokenRedemptionCryptographer>(), std::move(net_log)); std::move(done).Run(TrustTokenStatusOrRequestHelper(
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper.cc b/services/network/trust_tokens/trust_token_request_issuance_helper.cc index 1d778c89..997a820 100644 --- a/services/network/trust_tokens/trust_token_request_issuance_helper.cc +++ b/services/network/trust_tokens/trust_token_request_issuance_helper.cc
@@ -23,6 +23,7 @@ #include "services/network/public/mojom/url_response_head.mojom.h" #include "services/network/trust_tokens/proto/public.pb.h" #include "services/network/trust_tokens/suitable_trust_token_origin.h" +#include "services/network/trust_tokens/trust_token_key_commitment_parser.h" #include "services/network/trust_tokens/trust_token_key_filtering.h" #include "services/network/trust_tokens/trust_token_parameterization.h" #include "services/network/trust_tokens/trust_token_store.h" @@ -92,6 +93,7 @@ SuitableTrustTokenOrigin top_level_origin, TrustTokenStore* token_store, const TrustTokenKeyCommitmentGetter* key_commitment_getter, + absl::optional<std::string> custom_key_commitment, std::unique_ptr<Cryptographer> cryptographer, std::unique_ptr<LocalTrustTokenOperationDelegate> local_operation_delegate, base::RepeatingCallback<bool(mojom::TrustTokenKeyCommitmentResult::Os)> @@ -101,6 +103,7 @@ : top_level_origin_(std::move(top_level_origin)), token_store_(token_store), key_commitment_getter_(std::move(key_commitment_getter)), + custom_key_commitment_(custom_key_commitment), cryptographer_(std::move(cryptographer)), local_operation_delegate_(std::move(local_operation_delegate)), is_current_os_callback_(std::move(is_current_os_callback)), @@ -133,6 +136,18 @@ return; } + if (custom_key_commitment_) { + mojom::TrustTokenKeyCommitmentResultPtr keys = + TrustTokenKeyCommitmentParser().Parse(*custom_key_commitment_); + if (!keys) { + LogOutcome(net_log_, kBegin, "Failed to parse custom keys"); + std::move(done).Run(mojom::TrustTokenOperationStatus::kInvalidArgument); + return; + } + OnGotKeyCommitment(request, std::move(done), std::move(keys)); + return; + } + if (!token_store_->SetAssociation(*issuer_, top_level_origin_)) { LogOutcome(net_log_, kBegin, "Couldn't set issuer-toplevel association"); std::move(done).Run(mojom::TrustTokenOperationStatus::kResourceExhausted);
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper.h b/services/network/trust_tokens/trust_token_request_issuance_helper.h index f6f04172..8a43500 100644 --- a/services/network/trust_tokens/trust_token_request_issuance_helper.h +++ b/services/network/trust_tokens/trust_token_request_issuance_helper.h
@@ -146,6 +146,7 @@ SuitableTrustTokenOrigin top_level_origin, TrustTokenStore* token_store, const TrustTokenKeyCommitmentGetter* key_commitment_getter, + absl::optional<std::string> custom_key_commitment, std::unique_ptr<Cryptographer> cryptographer, std::unique_ptr<LocalTrustTokenOperationDelegate> local_operation_delegate, @@ -270,6 +271,7 @@ const SuitableTrustTokenOrigin top_level_origin_; const raw_ptr<TrustTokenStore> token_store_; const raw_ptr<const TrustTokenKeyCommitmentGetter> key_commitment_getter_; + absl::optional<std::string> custom_key_commitment_; mojom::TrustTokenProtocolVersion protocol_version_;
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper_unittest.cc b/services/network/trust_tokens/trust_token_request_issuance_helper_unittest.cc index 75a2f1a..d4f23492 100644 --- a/services/network/trust_tokens/trust_token_request_issuance_helper_unittest.cc +++ b/services/network/trust_tokens/trust_token_request_issuance_helper_unittest.cc
@@ -162,7 +162,7 @@ } TrustTokenRequestIssuanceHelper helper( - toplevel, store.get(), g_fixed_key_commitment_getter.get(), + toplevel, store.get(), g_fixed_key_commitment_getter.get(), absl::nullopt, std::make_unique<MockCryptographer>(), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); @@ -188,7 +188,7 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), g_fixed_key_commitment_getter.get(), + store.get(), g_fixed_key_commitment_getter.get(), absl::nullopt, std::make_unique<MockCryptographer>(), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); @@ -211,7 +211,8 @@ auto getter = std::make_unique<FixedKeyCommitmentGetter>(issuer, nullptr); TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), getter.get(), std::make_unique<MockCryptographer>(), + store.get(), getter.get(), absl::nullopt, + std::make_unique<MockCryptographer>(), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); @@ -236,8 +237,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -260,8 +261,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -288,8 +289,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -321,8 +322,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -361,8 +362,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -390,8 +391,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -424,8 +425,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -469,8 +470,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -513,8 +514,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -555,8 +556,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -598,8 +599,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -664,8 +665,8 @@ // ReasonableKeyCommitmentGetter is for issuer1 TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); // request is from issuer1 @@ -733,8 +734,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -800,8 +801,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -858,8 +859,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -890,7 +891,7 @@ auto store = TrustTokenStore::CreateForTesting(); TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), g_fixed_key_commitment_getter.get(), + store.get(), g_fixed_key_commitment_getter.get(), absl::nullopt, std::make_unique<MockCryptographer>(), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); @@ -906,7 +907,7 @@ auto store = TrustTokenStore::CreateForTesting(); TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), g_fixed_key_commitment_getter.get(), + store.get(), g_fixed_key_commitment_getter.get(), absl::nullopt, std::make_unique<MockCryptographer>(), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); @@ -935,8 +936,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), ReasonableKeyCommitmentGetter(), std::move(cryptographer), - std::make_unique<MockLocalOperationDelegate>(), + store.get(), ReasonableKeyCommitmentGetter(), absl::nullopt, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); auto request = MakeURLRequest("https://issuer.com/"); @@ -946,6 +947,90 @@ mojom::TrustTokenOperationStatus::kOk); } +// Check that attempting to issue with custom key commitments fails if custom +// key commitments are invalid. +TEST_F(TrustTokenRequestIssuanceHelperTest, BadCustomKeys) { + auto store = TrustTokenStore::CreateForTesting(); + TrustTokenRequestIssuanceHelper helper( + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/")), + store.get(), g_fixed_key_commitment_getter.get(), "junk keys", + std::make_unique<MockCryptographer>(), + std::make_unique<MockLocalOperationDelegate>(), + base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); + + auto request = MakeURLRequest("https://issuer.com/"); + + EXPECT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()), + mojom::TrustTokenOperationStatus::kInvalidArgument); +} + +// Check that a successful end-to-end Begin/Finalize flow with custom key +// commitments stores the obtained trust tokens in the trust token store. +TEST_F(TrustTokenRequestIssuanceHelperTest, CustomKeysStoresObtainedTokens) { + std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateForTesting(); + + SuitableTrustTokenOrigin issuer = + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/")); + + // Have the Trust Tokens issuance conclude by the underlying cryptographic + // library returning one signed, unblinded token associated with the same + // returned from the key commitment. + auto unblinded_tokens = std::make_unique<UnblindedTokens>(); + unblinded_tokens->body_of_verifying_key = + ReasonableKeyCommitmentResult()->keys.front()->body; + unblinded_tokens->tokens.push_back("a signed, unblinded token"); + + auto cryptographer = std::make_unique<MockCryptographer>(); + EXPECT_CALL(*cryptographer, Initialize(_, _)).WillOnce(Return(true)); + EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true)); + EXPECT_CALL(*cryptographer, BeginIssuance(_)) + .WillOnce( + Return(std::string("this string contains some blinded tokens"))); + EXPECT_CALL(*cryptographer, ConfirmIssuance(_)) + .WillOnce(Return(ByMove(std::move((unblinded_tokens))))); + + base::Time one_minute_from_now = base::Time::Now() + base::Minutes(1); + int64_t one_minute_from_now_in_micros = + (one_minute_from_now - base::Time::UnixEpoch()).InMicroseconds(); + + const std::string basic_key = base::StringPrintf( + R"({ "TrustTokenV3PMB": { + "protocol_version": "TrustTokenV3PMB", "id": 1, "batchsize": 5, + "keys": {"1": { "Y": "akey", "expiry": "%s" }} + }})", + base::NumberToString(one_minute_from_now_in_micros).c_str()); + + TrustTokenRequestIssuanceHelper helper( + *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), + store.get(), ReasonableKeyCommitmentGetter(), basic_key, + std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), + base::BindRepeating(&IsCurrentOperatingSystem), g_metrics_delegate.get()); + + auto request = MakeURLRequest("https://issuer.com/"); + request->set_initiator(issuer); + + ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()), + mojom::TrustTokenOperationStatus::kOk); + + auto response_head = mojom::URLResponseHead::New(); + response_head->headers = + net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n"); + response_head->headers->SetHeader( + kTrustTokensSecTrustTokenHeader, + "response from issuer (this value will be ignored, since " + "Cryptographer::ConfirmResponse is mocked out)"); + EXPECT_EQ(ExecuteFinalizeAndWaitForResult(&helper, response_head.get()), + mojom::TrustTokenOperationStatus::kOk); + + // After the operation has successfully finished, the trust tokens parsed from + // the server response should be in the store. + auto match_all_keys = + base::BindRepeating([](const std::string&) { return true; }); + EXPECT_THAT( + store->RetrieveMatchingTokens(issuer, std::move(match_all_keys)), + ElementsAre(Property(&TrustToken::body, "a signed, unblinded token"))); +} + class TrustTokenRequestIssuanceHelperTestWithPlatformIssuance : public TrustTokenRequestIssuanceHelperTest { public: @@ -1018,7 +1103,7 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), getter.get(), std::move(cryptographer), + store.get(), getter.get(), absl::nullopt, std::move(cryptographer), std::move(local_operation_delegate), base::BindRepeating([](mojom::TrustTokenKeyCommitmentResult::Os os) { return os == mojom::TrustTokenKeyCommitmentResult::Os::kAndroid; @@ -1088,7 +1173,7 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), getter.get(), std::move(cryptographer), + store.get(), getter.get(), absl::nullopt, std::move(cryptographer), std::move(local_operation_delegate), base::BindRepeating([](mojom::TrustTokenKeyCommitmentResult::Os os) { return os == mojom::TrustTokenKeyCommitmentResult::Os::kAndroid; @@ -1124,7 +1209,8 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), getter.get(), std::make_unique<MockCryptographer>(), + store.get(), getter.get(), absl::nullopt, + std::make_unique<MockCryptographer>(), std::make_unique<MockLocalOperationDelegate>(), // Fail to match to the current OS... base::BindLambdaForTesting( @@ -1168,7 +1254,7 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), getter.get(), std::move(cryptographer), + store.get(), getter.get(), absl::nullopt, std::move(cryptographer), std::make_unique<MockLocalOperationDelegate>(), // Fail to match to the current OS... base::BindLambdaForTesting( @@ -1235,7 +1321,7 @@ TrustTokenRequestIssuanceHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), - store.get(), getter.get(), std::move(cryptographer), + store.get(), getter.get(), absl::nullopt, std::move(cryptographer), std::move(local_operation_delegate), base::BindRepeating(&IsCurrentOperatingSystem), metrics_delegate.get());
diff --git a/services/network/trust_tokens/trust_token_request_redemption_helper.cc b/services/network/trust_tokens/trust_token_request_redemption_helper.cc index 9e9b3bc..25de850 100644 --- a/services/network/trust_tokens/trust_token_request_redemption_helper.cc +++ b/services/network/trust_tokens/trust_token_request_redemption_helper.cc
@@ -17,6 +17,7 @@ #include "services/network/public/mojom/url_response_head.mojom.h" #include "services/network/trust_tokens/proto/public.pb.h" #include "services/network/trust_tokens/trust_token_database_owner.h" +#include "services/network/trust_tokens/trust_token_key_commitment_parser.h" #include "services/network/trust_tokens/trust_token_parameterization.h" #include "services/network/trust_tokens/trust_token_store.h" #include "url/url_constants.h" @@ -50,6 +51,7 @@ mojom::TrustTokenRefreshPolicy refresh_policy, TrustTokenStore* token_store, const TrustTokenKeyCommitmentGetter* key_commitment_getter, + absl::optional<std::string> custom_key_commitment, std::unique_ptr<KeyPairGenerator> key_pair_generator, std::unique_ptr<Cryptographer> cryptographer, net::NetLogWithSource net_log) @@ -57,6 +59,7 @@ refresh_policy_(refresh_policy), token_store_(token_store), key_commitment_getter_(std::move(key_commitment_getter)), + custom_key_commitment_(custom_key_commitment), key_pair_generator_(std::move(key_pair_generator)), cryptographer_(std::move(cryptographer)), net_log_(std::move(net_log)) { @@ -84,6 +87,18 @@ return; } + if (custom_key_commitment_) { + mojom::TrustTokenKeyCommitmentResultPtr keys = + TrustTokenKeyCommitmentParser().Parse(*custom_key_commitment_); + if (!keys) { + LogOutcome(net_log_, kBegin, "Failed to parse custom keys"); + std::move(done).Run(mojom::TrustTokenOperationStatus::kInvalidArgument); + return; + } + OnGotKeyCommitment(request, std::move(done), std::move(keys)); + return; + } + if (!token_store_->SetAssociation(*issuer_, top_level_origin_)) { LogOutcome(net_log_, kBegin, "Couldn't set issuer-toplevel association"); std::move(done).Run(mojom::TrustTokenOperationStatus::kResourceExhausted);
diff --git a/services/network/trust_tokens/trust_token_request_redemption_helper.h b/services/network/trust_tokens/trust_token_request_redemption_helper.h index 96da41c..bf9da7c 100644 --- a/services/network/trust_tokens/trust_token_request_redemption_helper.h +++ b/services/network/trust_tokens/trust_token_request_redemption_helper.h
@@ -129,6 +129,7 @@ mojom::TrustTokenRefreshPolicy refresh_policy, TrustTokenStore* token_store, const TrustTokenKeyCommitmentGetter* key_commitment_getter, + absl::optional<std::string> custom_key_commitment, std::unique_ptr<KeyPairGenerator> key_pair_generator, std::unique_ptr<Cryptographer> cryptographer, net::NetLogWithSource net_log = net::NetLogWithSource()); @@ -214,6 +215,7 @@ const raw_ptr<TrustTokenStore> token_store_; const raw_ptr<const TrustTokenKeyCommitmentGetter> key_commitment_getter_; + absl::optional<std::string> custom_key_commitment_; const std::unique_ptr<KeyPairGenerator> key_pair_generator_; const std::unique_ptr<Cryptographer> cryptographer_; net::NetLogWithSource net_log_;
diff --git a/services/network/trust_tokens/trust_token_request_redemption_helper_unittest.cc b/services/network/trust_tokens/trust_token_request_redemption_helper_unittest.cc index ec19742..af22594d 100644 --- a/services/network/trust_tokens/trust_token_request_redemption_helper_unittest.cc +++ b/services/network/trust_tokens/trust_token_request_redemption_helper_unittest.cc
@@ -134,7 +134,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), - &*g_fixed_key_commitment_getter, std::make_unique<FakeKeyPairGenerator>(), + &*g_fixed_key_commitment_getter, absl::nullopt, + std::make_unique<FakeKeyPairGenerator>(), std::make_unique<MockCryptographer>()); auto request = MakeURLRequest("https://issuer.com/"); @@ -158,7 +159,7 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &getter, - std::make_unique<FakeKeyPairGenerator>(), + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), std::make_unique<MockCryptographer>()); auto request = MakeURLRequest("https://issuer.com/"); @@ -186,7 +187,7 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), std::make_unique<MockCryptographer>()); auto request = MakeURLRequest("https://issuer.com/"); @@ -236,7 +237,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); auto request = MakeURLRequest("https://issuer.com/"); request->set_initiator( @@ -286,7 +288,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); auto request = MakeURLRequest("https://issuer.com/"); request->set_initiator( @@ -331,7 +334,7 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FailingKeyPairGenerator>(), + absl::nullopt, std::make_unique<FailingKeyPairGenerator>(), std::make_unique<MockCryptographer>()); auto request = MakeURLRequest("https://issuer.com/"); @@ -389,7 +392,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); request_ = MakeURLRequest("https://issuer.com/"); request_->set_initiator( @@ -471,7 +475,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); auto request = MakeURLRequest("https://issuer.com/"); request->set_initiator( @@ -522,7 +527,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); auto request = MakeURLRequest("https://issuer.com/"); request->set_initiator( @@ -587,7 +593,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); auto request = MakeURLRequest("https://issuer.com/"); request->set_initiator( @@ -655,7 +662,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); auto request = MakeURLRequest("https://issuer.com/"); request->set_initiator( @@ -722,7 +730,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, - std::make_unique<FakeKeyPairGenerator>(), std::move(cryptographer)); + absl::nullopt, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); auto request = MakeURLRequest("https://issuer.com/"); request->set_initiator( @@ -780,6 +789,7 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, + absl::nullopt, std::make_unique<MockKeyPairGenerator>("signing key", "verification key"), std::move(cryptographer)); @@ -850,6 +860,7 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, + absl::nullopt, std::make_unique<MockKeyPairGenerator>("signing key", "verification key"), std::move(cryptographer)); @@ -921,6 +932,7 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, + absl::nullopt, std::make_unique<MockKeyPairGenerator>("signing key", "verification key"), std::move(cryptographer)); @@ -974,7 +986,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), - &*g_fixed_key_commitment_getter, std::make_unique<FakeKeyPairGenerator>(), + &*g_fixed_key_commitment_getter, absl::nullopt, + std::make_unique<FakeKeyPairGenerator>(), std::make_unique<MockCryptographer>()); auto request = MakeURLRequest("https://issuer.com/"); @@ -1033,6 +1046,7 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kRefresh, store.get(), &*getter, + absl::nullopt, std::make_unique<MockKeyPairGenerator>("signing key", "verification key"), std::move(cryptographer)); @@ -1076,7 +1090,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), - &*g_fixed_key_commitment_getter, std::make_unique<FakeKeyPairGenerator>(), + &*g_fixed_key_commitment_getter, absl::nullopt, + std::make_unique<FakeKeyPairGenerator>(), std::make_unique<MockCryptographer>()); auto request = MakeURLRequest("http://insecure-issuer.com/"); @@ -1091,7 +1106,8 @@ TrustTokenRequestRedemptionHelper helper( *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), - &*g_fixed_key_commitment_getter, std::make_unique<FakeKeyPairGenerator>(), + &*g_fixed_key_commitment_getter, absl::nullopt, + std::make_unique<FakeKeyPairGenerator>(), std::make_unique<MockCryptographer>()); auto request = MakeURLRequest("file:///non-https-issuer.txt"); @@ -1100,4 +1116,101 @@ mojom::TrustTokenOperationStatus::kInvalidArgument); } +TEST_F(TrustTokenRequestRedemptionHelperTest, BadCustomKeys) { + auto store = TrustTokenStore::CreateForTesting(); + TrustTokenRequestRedemptionHelper helper( + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/")), + mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), + &*g_fixed_key_commitment_getter, "junk keys", + std::make_unique<FakeKeyPairGenerator>(), + std::make_unique<MockCryptographer>()); + + auto request = MakeURLRequest("https://issuer.com/"); + + EXPECT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()), + mojom::TrustTokenOperationStatus::kInvalidArgument); +} + +// Check that, when preconditions are met and the underlying cryptographic steps +// successfully complete, the begin/finalize methods with custom key commitments +// succeed. +TEST_F(TrustTokenRequestRedemptionHelperTest, CustomKeysSuccess) { + // Establish the following state: + // * One key commitment returned from the key commitment registry, with one + // key, with body "". + // * One token stored corresponding to the key "" (this will be the token + // that the redemption request redeems; its key needs to match the key + // commitment's key so that it does not get evicted from storage after the key + // commitment is updated to reflect the key commitment result). + std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateForTesting(); + store->AddTokens( + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/")), + std::vector<std::string>{"a token"}, + /*issuing_key=*/""); + + auto key_commitment_result = mojom::TrustTokenKeyCommitmentResult::New(); + key_commitment_result->keys.push_back( + mojom::TrustTokenVerificationKey::New()); + key_commitment_result->protocol_version = + mojom::TrustTokenProtocolVersion::kTrustTokenV3Pmb; + key_commitment_result->id = 1; + key_commitment_result->batch_size = + static_cast<int>(kMaximumTrustTokenIssuanceBatchSize); + auto getter = std::make_unique<FixedKeyCommitmentGetter>( + *SuitableTrustTokenOrigin::Create(GURL("https://badissuer.com")), + std::move(key_commitment_result)); + + // Configure the cryptographer to succeed on both the outbound and inbound + // halves of the operation. + auto cryptographer = std::make_unique<MockCryptographer>(); + EXPECT_CALL(*cryptographer, Initialize(_, _)).WillOnce(Return(true)); + EXPECT_CALL(*cryptographer, BeginRedemption(_, _, _)) + .WillOnce(Return("well-formed redemption request")); + EXPECT_CALL(*cryptographer, ConfirmRedemption(_)) + .WillOnce(Return("a successfully-extracted RR")); + + base::Time one_minute_from_now = base::Time::Now() + base::Minutes(1); + int64_t one_minute_from_now_in_micros = + (one_minute_from_now - base::Time::UnixEpoch()).InMicroseconds(); + + const std::string basic_key = base::StringPrintf( + R"({ "TrustTokenV3PMB": { + "protocol_version": "TrustTokenV3PMB", "id": 1, "batchsize": 5, + "keys": {"1": { "Y": "", "expiry": "%s" }} + }})", + base::NumberToString(one_minute_from_now_in_micros).c_str()); + + TrustTokenRequestRedemptionHelper helper( + *SuitableTrustTokenOrigin::Create(GURL("https://toplevel.com/")), + mojom::TrustTokenRefreshPolicy::kUseCached, store.get(), &*getter, + basic_key, std::make_unique<FakeKeyPairGenerator>(), + std::move(cryptographer)); + + auto request = MakeURLRequest("https://issuer.com/"); + request->set_initiator( + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.com/"))); + + mojom::TrustTokenOperationStatus result = + ExecuteBeginOperationAndWaitForResult(&helper, request.get()); + + // Since this test is testing the behavior on handling the response after + // successfully constructing a redemption request, sanity check that the setup + // has correctly caused constructing the request so succeed. + ASSERT_EQ(result, mojom::TrustTokenOperationStatus::kOk); + + auto response_head = mojom::URLResponseHead::New(); + response_head->headers = + net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n"); + response_head->headers->SetHeader(kTrustTokensSecTrustTokenHeader, ""); + + // After a successfully constructed request, when the response is well-formed + // and the delegate accepts the response, Finalize should succeed. + EXPECT_EQ(ExecuteFinalizeAndWaitForResult(&helper, response_head.get()), + mojom::TrustTokenOperationStatus::kOk); + + // Processing the response should have stripped the header. + EXPECT_FALSE( + response_head->headers->HasHeader(kTrustTokensSecTrustTokenHeader)); +} + } // namespace network
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 09a2c60..01cbd04 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -1459,6 +1459,41 @@ "lacros-arm-generic-rel": { "additional_compile_targets": [ "chrome" + ], + "gtest_tests": [ + { + "args": [ + "--board=jacuzzi", + "--flash" + ], + "experiment_percentage": 5, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "lacros_all_tast_tests jacuzzi", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_type": "jacuzzi", + "os": "ChromeOS" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "lacros_all_tast_tests", + "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", + "trigger_script": { + "script": "//testing/trigger_scripts/chromeos_device_trigger.py" + }, + "variant_id": "jacuzzi" + } ] }, "lacros-arm64-generic-rel": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 3d16687..54295fe 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -36589,7 +36589,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -36601,7 +36601,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests iPhone 6s 15.2", + "name": "absl_hardening_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -36627,14 +36627,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -36745,7 +36745,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -36757,7 +36757,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Air 2 15.2", + "name": "base_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -36783,21 +36783,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -36809,7 +36809,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 6s 15.2", + "name": "base_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -36835,21 +36835,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -36861,7 +36861,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 6s Plus 15.2", + "name": "base_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -36887,14 +36887,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -37005,7 +37005,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37017,7 +37017,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone SE (1st generation) 15.2", + "name": "base_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37043,14 +37043,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -37109,7 +37109,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37121,7 +37121,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests iPhone 6s 15.2", + "name": "boringssl_crypto_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37147,14 +37147,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -37213,7 +37213,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37225,7 +37225,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests iPhone 6s 15.2", + "name": "boringssl_ssl_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37251,14 +37251,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -37369,7 +37369,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37381,7 +37381,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Air 2 15.2", + "name": "components_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37407,21 +37407,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37433,7 +37433,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 6s 15.2", + "name": "components_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37459,21 +37459,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37485,7 +37485,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 6s Plus 15.2", + "name": "components_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37511,14 +37511,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -37629,7 +37629,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37641,7 +37641,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone SE (1st generation) 15.2", + "name": "components_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37667,14 +37667,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -37733,7 +37733,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37745,7 +37745,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crashpad_tests iPhone 6s 15.2", + "name": "crashpad_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37771,14 +37771,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -37837,7 +37837,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -37849,7 +37849,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests iPhone 6s 15.2", + "name": "crypto_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -37875,14 +37875,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -37993,7 +37993,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38005,7 +38005,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Air 2 15.2", + "name": "gfx_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38031,21 +38031,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38057,7 +38057,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 6s 15.2", + "name": "gfx_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38083,21 +38083,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38109,7 +38109,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 6s Plus 15.2", + "name": "gfx_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38135,14 +38135,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -38253,7 +38253,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38265,7 +38265,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone SE (1st generation) 15.2", + "name": "gfx_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38291,14 +38291,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -38357,7 +38357,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38369,7 +38369,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests iPhone 6s 15.2", + "name": "google_apis_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38395,14 +38395,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -38514,7 +38514,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38527,7 +38527,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38553,21 +38553,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38580,7 +38580,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38606,14 +38606,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -38673,7 +38673,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38686,7 +38686,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38712,14 +38712,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -38833,7 +38833,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38846,7 +38846,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38872,22 +38872,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38900,7 +38900,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.2", + "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38926,22 +38926,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -38954,7 +38954,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -38980,15 +38980,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -39157,7 +39157,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39170,7 +39170,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39196,22 +39196,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39224,7 +39224,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39250,15 +39250,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -39319,7 +39319,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39332,7 +39332,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_settings_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39358,15 +39358,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -39481,7 +39481,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39494,7 +39494,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39520,22 +39520,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39548,7 +39548,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.2", + "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39574,22 +39574,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39602,7 +39602,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39628,15 +39628,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -39804,7 +39804,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39817,7 +39817,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39843,21 +39843,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39870,7 +39870,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -39896,14 +39896,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -39963,7 +39963,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -39976,7 +39976,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40002,14 +40002,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -40123,7 +40123,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40136,7 +40136,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40162,22 +40162,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40190,7 +40190,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.2", + "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40216,22 +40216,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40244,7 +40244,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40270,15 +40270,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -40445,7 +40445,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40457,7 +40457,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Air 2 15.2", + "name": "ios_chrome_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40483,21 +40483,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40509,7 +40509,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 6s 15.2", + "name": "ios_chrome_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40535,21 +40535,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40561,7 +40561,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 6s Plus 15.2", + "name": "ios_chrome_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40587,14 +40587,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -40705,7 +40705,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40717,7 +40717,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone SE (1st generation) 15.2", + "name": "ios_chrome_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40743,14 +40743,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -40862,7 +40862,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40875,7 +40875,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40901,21 +40901,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -40928,7 +40928,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_web_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -40954,14 +40954,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -41021,7 +41021,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41034,7 +41034,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_web_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41060,14 +41060,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -41127,7 +41127,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41139,7 +41139,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests iPhone 6s 15.2", + "name": "ios_components_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41165,14 +41165,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -41231,7 +41231,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41243,7 +41243,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests iPhone 6s 15.2", + "name": "ios_net_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41269,15 +41269,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -41337,7 +41337,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41349,7 +41349,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_remoting_unittests iPhone 6s 15.2", + "name": "ios_remoting_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41375,14 +41375,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -41494,7 +41494,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41507,7 +41507,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPad Air 2 15.2", + "name": "ios_showcase_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41533,21 +41533,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41560,7 +41560,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPhone 7 15.2", + "name": "ios_showcase_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41586,14 +41586,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -41653,7 +41653,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41666,7 +41666,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPhone X 15.2", + "name": "ios_showcase_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41692,14 +41692,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -41759,7 +41759,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41771,7 +41771,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests iPhone 6s 15.2", + "name": "ios_testing_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41797,14 +41797,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -41915,7 +41915,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41927,7 +41927,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Air 2 15.2", + "name": "ios_web_inttests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -41953,21 +41953,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -41979,7 +41979,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 6s 15.2", + "name": "ios_web_inttests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42005,21 +42005,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42031,7 +42031,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 6s Plus 15.2", + "name": "ios_web_inttests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42057,14 +42057,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -42175,7 +42175,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42187,7 +42187,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone SE (1st generation) 15.2", + "name": "ios_web_inttests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42213,14 +42213,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -42332,7 +42332,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42345,7 +42345,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2", + "name": "ios_web_shell_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42371,21 +42371,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42398,7 +42398,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 6s 15.2", + "name": "ios_web_shell_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42424,21 +42424,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42451,7 +42451,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 7 15.2", + "name": "ios_web_shell_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42477,14 +42477,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -42649,7 +42649,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42661,7 +42661,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Air 2 15.2", + "name": "ios_web_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42687,21 +42687,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42713,7 +42713,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 6s 15.2", + "name": "ios_web_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42739,21 +42739,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42765,7 +42765,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 6s Plus 15.2", + "name": "ios_web_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42791,14 +42791,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -42909,7 +42909,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -42921,7 +42921,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone SE (1st generation) 15.2", + "name": "ios_web_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -42947,14 +42947,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -43065,7 +43065,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43077,7 +43077,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Air 2 15.2", + "name": "ios_web_view_inttests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43103,21 +43103,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43129,7 +43129,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 6s 15.2", + "name": "ios_web_view_inttests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43155,21 +43155,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43181,7 +43181,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 6s Plus 15.2", + "name": "ios_web_view_inttests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43207,14 +43207,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -43325,7 +43325,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43337,7 +43337,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone SE (1st generation) 15.2", + "name": "ios_web_view_inttests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43363,14 +43363,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -43481,7 +43481,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43493,7 +43493,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Air 2 15.2", + "name": "ios_web_view_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43519,21 +43519,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43545,7 +43545,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 6s 15.2", + "name": "ios_web_view_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43571,21 +43571,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43597,7 +43597,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 6s Plus 15.2", + "name": "ios_web_view_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43623,14 +43623,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -43741,7 +43741,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43753,7 +43753,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone SE (1st generation) 15.2", + "name": "ios_web_view_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43779,14 +43779,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -43845,7 +43845,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43857,7 +43857,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests iPhone 6s 15.2", + "name": "net_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43883,14 +43883,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -43949,7 +43949,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -43961,7 +43961,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests iPhone 6s 15.2", + "name": "services_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -43987,14 +43987,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -44105,7 +44105,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44117,7 +44117,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Air 2 15.2", + "name": "skia_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44143,21 +44143,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44169,7 +44169,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 6s 15.2", + "name": "skia_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44195,21 +44195,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44221,7 +44221,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 6s Plus 15.2", + "name": "skia_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44247,14 +44247,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -44365,7 +44365,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44377,7 +44377,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone SE (1st generation) 15.2", + "name": "skia_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44403,14 +44403,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -44469,7 +44469,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44481,7 +44481,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests iPhone 6s 15.2", + "name": "sql_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44507,14 +44507,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -44625,7 +44625,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44637,7 +44637,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Air 2 15.2", + "name": "ui_base_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44663,21 +44663,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44689,7 +44689,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 6s 15.2", + "name": "ui_base_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44715,21 +44715,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44741,7 +44741,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 6s Plus 15.2", + "name": "ui_base_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44767,14 +44767,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -44885,7 +44885,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -44897,7 +44897,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone SE (1st generation) 15.2", + "name": "ui_base_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -44923,14 +44923,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -44989,7 +44989,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -45001,7 +45001,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests iPhone 6s 15.2", + "name": "url_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45027,14 +45027,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -45097,7 +45097,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45112,7 +45112,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests iPhone 6s 15.2", + "name": "absl_hardening_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45138,14 +45138,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -45262,7 +45262,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45277,7 +45277,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Air 2 15.2", + "name": "base_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45303,21 +45303,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45332,7 +45332,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 6s 15.2", + "name": "base_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45358,21 +45358,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45387,7 +45387,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 6s Plus 15.2", + "name": "base_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45413,14 +45413,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -45537,7 +45537,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45552,7 +45552,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone SE (1st generation) 15.2", + "name": "base_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45578,14 +45578,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -45647,7 +45647,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45662,7 +45662,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests iPhone 6s 15.2", + "name": "boringssl_crypto_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45688,14 +45688,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -45757,7 +45757,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45772,7 +45772,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests iPhone 6s 15.2", + "name": "boringssl_ssl_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45798,14 +45798,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -45922,7 +45922,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45937,7 +45937,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Air 2 15.2", + "name": "components_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -45963,21 +45963,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -45992,7 +45992,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 6s 15.2", + "name": "components_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46018,21 +46018,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46047,7 +46047,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 6s Plus 15.2", + "name": "components_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46073,14 +46073,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -46197,7 +46197,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46212,7 +46212,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone SE (1st generation) 15.2", + "name": "components_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46238,14 +46238,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -46307,7 +46307,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46322,7 +46322,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crashpad_tests iPhone 6s 15.2", + "name": "crashpad_tests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46348,14 +46348,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -46417,7 +46417,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46432,7 +46432,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests iPhone 6s 15.2", + "name": "crypto_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46458,14 +46458,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -46582,7 +46582,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46597,7 +46597,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Air 2 15.2", + "name": "gfx_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46623,21 +46623,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46652,7 +46652,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 6s 15.2", + "name": "gfx_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46678,21 +46678,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46707,7 +46707,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 6s Plus 15.2", + "name": "gfx_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46733,14 +46733,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -46857,7 +46857,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46872,7 +46872,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone SE (1st generation) 15.2", + "name": "gfx_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -46898,14 +46898,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -46967,7 +46967,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -46982,7 +46982,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests iPhone 6s 15.2", + "name": "google_apis_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47008,14 +47008,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -47133,7 +47133,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47149,7 +47149,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47175,21 +47175,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47205,7 +47205,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47231,14 +47231,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -47301,7 +47301,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47317,7 +47317,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47343,14 +47343,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -47470,7 +47470,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47486,7 +47486,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47512,22 +47512,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47543,7 +47543,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.2", + "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47569,22 +47569,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47600,7 +47600,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47626,15 +47626,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -47812,7 +47812,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47828,7 +47828,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47854,22 +47854,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47885,7 +47885,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47911,15 +47911,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -47983,7 +47983,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -47999,7 +47999,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_settings_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48025,15 +48025,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -48154,7 +48154,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48170,7 +48170,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48196,22 +48196,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48227,7 +48227,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.2", + "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48253,22 +48253,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48284,7 +48284,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48310,15 +48310,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -48495,7 +48495,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48511,7 +48511,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48537,21 +48537,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48567,7 +48567,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48593,14 +48593,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -48663,7 +48663,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48679,7 +48679,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48705,14 +48705,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -48832,7 +48832,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48848,7 +48848,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48874,22 +48874,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48905,7 +48905,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.2", + "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48931,22 +48931,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -48962,7 +48962,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -48988,15 +48988,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -49172,7 +49172,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49187,7 +49187,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Air 2 15.2", + "name": "ios_chrome_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49213,21 +49213,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49242,7 +49242,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 6s 15.2", + "name": "ios_chrome_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49268,21 +49268,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49297,7 +49297,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 6s Plus 15.2", + "name": "ios_chrome_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49323,14 +49323,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -49447,7 +49447,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49462,7 +49462,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone SE (1st generation) 15.2", + "name": "ios_chrome_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49488,14 +49488,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -49613,7 +49613,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49629,7 +49629,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49655,21 +49655,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49685,7 +49685,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_web_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49711,14 +49711,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -49781,7 +49781,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49797,7 +49797,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_web_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49823,14 +49823,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -49893,7 +49893,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -49908,7 +49908,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests iPhone 6s 15.2", + "name": "ios_components_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -49934,14 +49934,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -50003,7 +50003,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50018,7 +50018,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests iPhone 6s 15.2", + "name": "ios_net_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50044,15 +50044,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -50115,7 +50115,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50130,7 +50130,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_remoting_unittests iPhone 6s 15.2", + "name": "ios_remoting_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50156,14 +50156,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -50281,7 +50281,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50297,7 +50297,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPad Air 2 15.2", + "name": "ios_showcase_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50323,21 +50323,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50353,7 +50353,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPhone 7 15.2", + "name": "ios_showcase_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50379,14 +50379,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -50449,7 +50449,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50465,7 +50465,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPhone X 15.2", + "name": "ios_showcase_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50491,14 +50491,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -50561,7 +50561,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50576,7 +50576,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests iPhone 6s 15.2", + "name": "ios_testing_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50602,14 +50602,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -50726,7 +50726,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50741,7 +50741,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Air 2 15.2", + "name": "ios_web_inttests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50767,21 +50767,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50796,7 +50796,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 6s 15.2", + "name": "ios_web_inttests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50822,21 +50822,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -50851,7 +50851,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 6s Plus 15.2", + "name": "ios_web_inttests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -50877,14 +50877,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -51001,7 +51001,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51016,7 +51016,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone SE (1st generation) 15.2", + "name": "ios_web_inttests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51042,14 +51042,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -51167,7 +51167,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51183,7 +51183,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2", + "name": "ios_web_shell_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51209,21 +51209,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51239,7 +51239,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 6s 15.2", + "name": "ios_web_shell_eg2tests_module iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51265,21 +51265,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51295,7 +51295,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 7 15.2", + "name": "ios_web_shell_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51321,14 +51321,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -51502,7 +51502,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51517,7 +51517,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Air 2 15.2", + "name": "ios_web_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51543,21 +51543,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51572,7 +51572,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 6s 15.2", + "name": "ios_web_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51598,21 +51598,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51627,7 +51627,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 6s Plus 15.2", + "name": "ios_web_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51653,14 +51653,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -51777,7 +51777,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51792,7 +51792,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone SE (1st generation) 15.2", + "name": "ios_web_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51818,14 +51818,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -51942,7 +51942,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -51957,7 +51957,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Air 2 15.2", + "name": "ios_web_view_inttests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -51983,21 +51983,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52012,7 +52012,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 6s 15.2", + "name": "ios_web_view_inttests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52038,21 +52038,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52067,7 +52067,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 6s Plus 15.2", + "name": "ios_web_view_inttests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52093,14 +52093,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -52217,7 +52217,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52232,7 +52232,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone SE (1st generation) 15.2", + "name": "ios_web_view_inttests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52258,14 +52258,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -52382,7 +52382,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52397,7 +52397,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Air 2 15.2", + "name": "ios_web_view_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52423,21 +52423,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52452,7 +52452,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 6s 15.2", + "name": "ios_web_view_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52478,21 +52478,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52507,7 +52507,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 6s Plus 15.2", + "name": "ios_web_view_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52533,14 +52533,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -52657,7 +52657,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52672,7 +52672,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone SE (1st generation) 15.2", + "name": "ios_web_view_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52698,14 +52698,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -52767,7 +52767,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52782,7 +52782,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests iPhone 6s 15.2", + "name": "net_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52808,14 +52808,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -52877,7 +52877,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -52892,7 +52892,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests iPhone 6s 15.2", + "name": "services_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -52918,14 +52918,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -53042,7 +53042,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53057,7 +53057,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Air 2 15.2", + "name": "skia_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53083,21 +53083,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53112,7 +53112,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 6s 15.2", + "name": "skia_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53138,21 +53138,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53167,7 +53167,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 6s Plus 15.2", + "name": "skia_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53193,14 +53193,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -53317,7 +53317,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53332,7 +53332,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone SE (1st generation) 15.2", + "name": "skia_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53358,14 +53358,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -53427,7 +53427,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53442,7 +53442,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests iPhone 6s 15.2", + "name": "sql_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53468,14 +53468,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ @@ -53592,7 +53592,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53607,7 +53607,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Air 2 15.2", + "name": "ui_base_unittests iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53633,21 +53633,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53662,7 +53662,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 6s 15.2", + "name": "ui_base_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53688,21 +53688,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 6s Plus", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53717,7 +53717,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 6s Plus 15.2", + "name": "ui_base_unittests iPhone 6s Plus 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53743,14 +53743,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s Plus 15.2" + "variant_id": "iPhone 6s Plus 15.5" }, { "args": [ @@ -53867,7 +53867,7 @@ "--platform", "iPhone SE (1st generation)", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53882,7 +53882,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone SE (1st generation) 15.2", + "name": "ui_base_unittests iPhone SE (1st generation) 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -53908,14 +53908,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" + "variant_id": "iPhone SE (1st generation) 15.5" }, { "args": [ @@ -53977,7 +53977,7 @@ "--platform", "iPhone 6s", "--version", - "15.2", + "15.5", "--args-json", "{\"test_args\": [\"--write-compiled-tests-json-to-writable-path\"]}", "--out-dir", @@ -53992,7 +53992,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests iPhone 6s 15.2", + "name": "url_unittests iPhone 6s 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -54018,14 +54018,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 6s 15.2" + "variant_id": "iPhone 6s 15.5" }, { "args": [
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index 9777ddf..3e15c8d 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -10973,59 +10973,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "absl_hardening_tests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "absl_hardening_tests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -11058,6 +11005,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11111,6 +11059,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11132,165 +11081,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -11323,6 +11113,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11344,59 +11135,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "base_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -11429,6 +11167,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11482,6 +11221,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11503,59 +11243,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "boringssl_crypto_tests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "boringssl_crypto_tests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -11588,6 +11275,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11609,59 +11297,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "boringssl_ssl_tests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "boringssl_ssl_tests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -11694,6 +11329,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11747,6 +11383,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11768,165 +11405,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "components_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "components_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "components_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -11959,6 +11437,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -11980,59 +11459,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "components_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "components_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -12065,6 +11491,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12118,6 +11545,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12139,59 +11567,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "crashpad_tests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "crashpad_tests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -12224,6 +11599,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12245,59 +11621,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "crypto_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "crypto_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -12330,6 +11653,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12383,6 +11707,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12404,165 +11729,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -12595,6 +11761,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12616,59 +11783,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "gfx_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gfx_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -12701,6 +11815,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12754,6 +11869,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12775,59 +11891,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "google_apis_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "google_apis_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -12860,6 +11923,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12881,61 +11945,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_integration_eg2tests_module", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -12969,6 +11978,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -12991,61 +12001,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_signin_eg2tests_module", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 10 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -13079,6 +12034,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13101,61 +12057,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_chrome_ui_eg2tests_module", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -13189,6 +12090,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13243,6 +12145,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13264,165 +12167,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -13455,6 +12199,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13476,59 +12221,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_chrome_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_chrome_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -13561,6 +12253,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13614,6 +12307,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13635,59 +12329,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_components_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_components_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -13720,6 +12361,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13741,60 +12383,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_net_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_net_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -13827,6 +12415,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13849,59 +12438,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_remoting_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_remoting_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -13934,6 +12470,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -13955,59 +12492,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_testing_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_testing_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -14040,6 +12524,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14093,6 +12578,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14114,165 +12600,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -14305,6 +12632,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14326,59 +12654,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_inttests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -14411,6 +12686,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14464,6 +12740,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14485,60 +12762,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest", - "--xcode-parallelization" - ], - "isolate_name": "ios_web_shell_eg2tests_module", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_shell_eg2tests_module iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -14572,6 +12795,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14625,6 +12849,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14646,165 +12871,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -14837,6 +12903,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14858,59 +12925,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -14943,6 +12957,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -14996,6 +13011,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15049,6 +13065,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15070,165 +13087,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -15261,6 +13119,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15282,59 +13141,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_inttests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_inttests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -15367,6 +13173,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15420,6 +13227,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15473,6 +13281,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15494,165 +13303,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -15685,6 +13335,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15706,59 +13357,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ios_web_view_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ios_web_view_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -15791,6 +13389,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15844,6 +13443,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15865,59 +13465,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "net_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "net_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -15950,6 +13497,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -15971,59 +13519,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "services_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "services_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -16056,6 +13551,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16109,6 +13605,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16130,165 +13627,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "skia_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "skia_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "skia_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -16321,6 +13659,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16342,59 +13681,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "skia_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "skia_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -16427,6 +13713,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16480,6 +13767,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16501,59 +13789,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "sql_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "sql_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -16586,6 +13821,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16639,6 +13875,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16660,165 +13897,6 @@ { "args": [ "--platform", - "iPad Air 2", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPad Air 2 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Air 2 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", - "iPhone 6s Plus", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone 6s Plus 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 6s Plus 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -16851,6 +13929,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -16872,59 +13951,6 @@ { "args": [ "--platform", - "iPhone SE (1st generation)", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "ui_base_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "ui_base_unittests iPhone SE (1st generation) 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone SE (1st generation) 15.2" - }, - { - "args": [ - "--platform", "iPhone SE (3rd generation)", "--version", "16.0", @@ -16957,6 +13983,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -17010,6 +14037,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -17031,59 +14059,6 @@ { "args": [ "--platform", - "iPhone 6s", - "--version", - "15.2", - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14a5284g", - "--xctest" - ], - "isolate_name": "url_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "url_unittests iPhone 6s 15.2", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14a5284g", - "path": "Xcode.app" - }, - { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 6s 15.2" - }, - { - "args": [ - "--platform", "iPhone 8", "--version", "16.0", @@ -17116,6 +14091,7 @@ "dimension_sets": [ { "cpu": "x86-64", + "mac_model": "Macmini8,1", "os": "Mac-12" } ], @@ -17144,6 +14120,960 @@ { "args": [ "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "absl_hardening_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "absl_hardening_tests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "boringssl_crypto_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "boringssl_crypto_tests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "boringssl_ssl_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "boringssl_ssl_tests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "crashpad_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "crashpad_tests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "crypto_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "crypto_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "google_apis_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "google_apis_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", "iPad Air (3rd generation)", "--version", "16.0", @@ -17200,7 +15130,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17214,7 +15144,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17240,21 +15170,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17268,7 +15198,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17294,14 +15224,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -17362,7 +15292,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17376,7 +15306,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17402,14 +15332,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -17525,7 +15455,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17539,7 +15469,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17565,22 +15495,77 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_integration_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17594,7 +15579,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17620,15 +15605,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -17745,7 +15730,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17759,7 +15744,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17785,22 +15770,22 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17814,7 +15799,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17840,15 +15825,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -17910,7 +15895,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -17924,7 +15909,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_settings_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -17950,15 +15935,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -18075,7 +16060,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18089,7 +16074,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18115,22 +16100,77 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_signin_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 10 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18144,7 +16184,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18170,15 +16210,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 10 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -18294,7 +16334,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18308,7 +16348,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18334,21 +16374,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18362,7 +16402,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18388,14 +16428,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -18456,7 +16496,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18470,7 +16510,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18496,14 +16536,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -18619,7 +16659,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18633,7 +16673,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18659,22 +16699,77 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_ui_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18688,7 +16783,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18714,15 +16809,15 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -18782,6 +16877,218 @@ { "args": [ "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", "iPad Air (3rd generation)", "--version", "16.0", @@ -18838,7 +17145,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18852,7 +17159,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2", + "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18878,21 +17185,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -18906,7 +17213,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone 7 15.2", + "name": "ios_chrome_web_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -18932,14 +17239,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -19000,7 +17307,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -19014,7 +17321,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone X 15.2", + "name": "ios_chrome_web_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -19040,14 +17347,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -19106,6 +17413,166 @@ { "args": [ "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_components_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_net_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_net_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_remoting_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_remoting_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", "iPad Air (3rd generation)", "--version", "16.0", @@ -19162,7 +17629,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -19176,7 +17643,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPad Air 2 15.2", + "name": "ios_showcase_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -19202,21 +17669,21 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -19230,7 +17697,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPhone 7 15.2", + "name": "ios_showcase_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -19256,14 +17723,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -19324,7 +17791,7 @@ "--platform", "iPhone X", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -19338,7 +17805,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module iPhone X 15.2", + "name": "ios_showcase_eg2tests_module iPhone X 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -19364,14 +17831,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", - "variant_id": "iPhone X 15.2" + "variant_id": "iPhone X 15.5" }, { "args": [ @@ -19430,6 +17897,271 @@ { "args": [ "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_testing_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_testing_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", "iPad Air (3rd generation)", "--version", "16.0", @@ -19486,7 +18218,7 @@ "--platform", "iPad Air 2", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -19500,7 +18232,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2", + "name": "ios_web_shell_eg2tests_module iPad Air 2 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -19526,21 +18258,75 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air 2 15.2" + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_web_shell_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_shell_eg2tests_module iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 15.5" }, { "args": [ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -19554,7 +18340,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 7 15.2", + "name": "ios_web_shell_eg2tests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -19580,14 +18366,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [ @@ -19642,6 +18428,1278 @@ }, "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "net_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "net_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "services_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "services_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "sql_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "sql_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPad Air 2", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPad Air 2 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s Plus", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPhone 6s Plus 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 15.5" + }, + { + "args": [ + "--platform", + "iPhone SE (1st generation)", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPhone SE (1st generation) 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.5" + }, + { + "args": [ + "--platform", + "iPhone 6s", + "--version", + "15.5", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "url_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "url_unittests iPhone 6s 15.5", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 15.5" } ] }, @@ -22566,7 +22624,7 @@ "--platform", "iPhone 7", "--version", - "15.2", + "15.5", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", @@ -22579,7 +22637,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_crash_xcuitests_module iPhone 7 15.2", + "name": "ios_crash_xcuitests_module iPhone 7 15.5", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -22605,14 +22663,14 @@ "path": "Xcode.app" }, { - "name": "runtime_ios_15_2", - "path": "Runtime-ios-15.2" + "name": "runtime_ios_15_5", + "path": "Runtime-ios-15.5" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module/", - "variant_id": "iPhone 7 15.2" + "variant_id": "iPhone 7 15.5" }, { "args": [
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter index 7b2a2bb..f330dff 100644 --- a/testing/buildbot/filters/fuchsia.browser_tests.filter +++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -508,38 +508,6 @@ -RestoreOnStartupPolicyTestInstance/RestoreOnStartupPolicyTest.RunTest/3 -RestoreOnStartupPolicyTestInstance/RestoreOnStartupPolicyTest.RunTest/4 -# TODO(crbug.com/1311066): SysInfo::GetHardwareInfo not supported by Fuchsia --ProfileMenuClickTest_SyncError.ProfileMenuClickTest_SyncError/2 --ProfileMenuClickTest_SyncError.ProfileMenuClickTest_SyncError/4 --ProfileMenuClickTest_SyncError.ProfileMenuClickTest_SyncError/5 --ProfileMenuClickTest_SyncError.ProfileMenuClickTest_SyncError/7 --ProfileMenuClickTest_SyncError.ProfileMenuClickTest_SyncError/8 --ProfileMenuClickTest_SyncError.ProfileMenuClickTest_SyncError/9 --SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Local_TransportMode_InfoTextIconDoesNotExist --SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Upload_TransportMode_ClickingSaveClosesBubble --SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Upload_TransportMode_InfoTextIconExists --SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Upload_TransportMode_RequestedCardholderNameTextfieldIsPrefilledWithFocusName --SyncAwareCounterTest.AutofillCounter --SyncAwareCounterTest.HistoryCounter --SyncAwareCounterTest.PasswordCounter --UkmBrowserTest.ConsentAddedButNoSyncCheck --UkmBrowserTest.HistoryDeleteCheck --UkmBrowserTest.IncognitoPlusRegularCheck --UkmBrowserTest.LogProtoData --UkmBrowserTest.MetricsConsentCheck --UkmBrowserTest.MetricsReportingCheck --UkmBrowserTest.MultiDisableExtensionsSyncCheck --UkmBrowserTest.MultiSyncSignoutCheck --UkmBrowserTest.NetworkProviderPopulatesSystemProfile --UkmBrowserTest.OpenNonSyncCheck --UkmBrowserTest.RegularPlusGuestCheck --UkmBrowserTest.RegularPlusIncognitoCheck --UkmBrowserTest.ServiceListenerInitFailedCheck --UkmBrowserTest.SingleDisableExtensionsSyncCheck --UkmBrowserTestWithSyncTransport.NotEnabledForSecondaryAccountSync --UkmConsentParamBrowserTests/UkmConsentParamBrowserTest.GroupPolicyConsentCheck/0 --UkmConsentParamBrowserTests/UkmConsentParamBrowserTest.GroupPolicyConsentCheck/1 - # TODO(crbug.com/1295538): Not implemented reached in static IconLoader::IconGroup # IconLoader::GroupForFilepath(const base::FilePath &) -ChromeMimeHandlerViewTest.ActivatePostMessageSupportOnce
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index bca36683..d99d8265 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -812,6 +812,16 @@ }, }, }, + # TODO (crbug/1351123): Adding ONLY for iOS to specify T2 only due to xcode14 + 'mac_12_t2_x64': { + 'swarming': { + 'dimensions': { + 'cpu': 'x86-64', + 'mac_model': 'Macmini8,1', + 'os': 'Mac-12', + }, + }, + }, 'mac_12_x64': { 'swarming': { 'dimensions': {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 56e6270..42b7f24 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2490,6 +2490,13 @@ 'lacros-amd64-generic-rel', ] }, + 'lacros_all_tast_tests jacuzzi': { + 'modifications': { + 'lacros-arm-generic-rel': { + 'experiment_percentage': 5, + }, + }, + }, 'maps_pixel_passthrough_test': { 'modifications': { 'Android FYI Release (Pixel 4)': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 09c00e74..7bb973b 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -6515,16 +6515,16 @@ 'ios_code_coverage_tests': { 'ios_common_tests': { 'variants': [ - 'SIM_IPHONE_6S_15_2', + 'SIM_IPHONE_6S_15_5', 'SIM_IPHONE_8_16_0', ], }, 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_6S_15_2', - 'SIM_IPHONE_7_15_2', - 'SIM_IPAD_AIR_2_15_2', + 'SIM_IPHONE_6S_15_5', + 'SIM_IPHONE_7_15_5', + 'SIM_IPAD_AIR_2_15_5', 'SIM_IPHONE_8_16_0', 'SIM_IPHONE_X_16_0', 'SIM_IPAD_AIR_3RD_GEN_16_0', @@ -6533,9 +6533,9 @@ 'ios_eg2_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_7_15_2', - 'SIM_IPAD_AIR_2_15_2', - 'SIM_IPHONE_X_15_2', + 'SIM_IPHONE_7_15_5', + 'SIM_IPAD_AIR_2_15_5', + 'SIM_IPHONE_X_15_5', 'SIM_IPHONE_8_16_0', 'SIM_IPAD_AIR_3RD_GEN_16_0', 'SIM_IPHONE_X_16_0', @@ -6543,10 +6543,10 @@ }, 'ios_screen_size_dependent_tests': { 'variants': [ - 'SIM_IPHONE_6S_PLUS_15_2', - 'SIM_IPHONE_6S_15_2', - 'SIM_IPHONE_SE_1ST_GEN_15_2', - 'SIM_IPAD_AIR_2_15_2', + 'SIM_IPHONE_6S_PLUS_15_5', + 'SIM_IPHONE_6S_15_5', + 'SIM_IPHONE_SE_1ST_GEN_15_5', + 'SIM_IPAD_AIR_2_15_5', 'SIM_IPHONE_8_PLUS_16_0', 'SIM_IPHONE_8_16_0', 'SIM_IPHONE_SE_3RD_GEN_16_0', @@ -6601,12 +6601,17 @@ # Please also change ios_code_coverage_tests for any change in this suite. 'ios_simulator_full_configs_tests': { + 'ios_common_tests': { + 'variants': [ + 'SIM_IPHONE_6S_15_5', + ] + }, 'ios_eg2_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_7_15_2', - 'SIM_IPAD_AIR_2_15_2', - 'SIM_IPHONE_X_15_2', + 'SIM_IPHONE_7_15_5', + 'SIM_IPAD_AIR_2_15_5', + 'SIM_IPHONE_X_15_5', 'SIM_IPHONE_8_16_0', 'SIM_IPHONE_X_16_0', 'SIM_IPAD_AIR_3RD_GEN_16_0', @@ -6615,11 +6620,20 @@ 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_7_15_2', - 'SIM_IPAD_AIR_2_15_2', + 'SIM_IPHONE_6S_15_5', + 'SIM_IPHONE_7_15_5', + 'SIM_IPAD_AIR_2_15_5', 'SIM_IPHONE_8_16_0', 'SIM_IPAD_AIR_3RD_GEN_16_0', ] + }, + 'ios_screen_size_dependent_tests': { + 'variants': [ + 'SIM_IPHONE_6S_PLUS_15_5', + 'SIM_IPHONE_6S_15_5', + 'SIM_IPHONE_SE_1ST_GEN_15_5', + 'SIM_IPAD_AIR_2_15_5', + ] } }, @@ -6684,7 +6698,7 @@ 'ios_crash_xcuitests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_7_15_2', + 'SIM_IPHONE_7_15_5', 'SIM_IPHONE_7_14_5', ] }, @@ -6694,23 +6708,17 @@ 'ios_simulator_tests': { 'ios_common_tests': { 'variants': [ - 'SIM_IPHONE_6S_15_2', 'SIM_IPHONE_8_16_0', ] }, 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_6S_15_2', 'SIM_IPHONE_8_16_0', ] }, 'ios_screen_size_dependent_tests': { 'variants': [ - 'SIM_IPHONE_6S_PLUS_15_2', - 'SIM_IPHONE_6S_15_2', - 'SIM_IPHONE_SE_1ST_GEN_15_2', - 'SIM_IPAD_AIR_2_15_2', 'SIM_IPHONE_8_16_0', 'SIM_IPHONE_X_16_0', 'SIM_IPAD_AIR_3RD_GEN_16_0', @@ -6766,6 +6774,14 @@ }, }, + 'lacros_device_arm_tests': { + 'lacros_all_tast_tests': { + 'variants': [ + 'LACROS_JACUZZI', + ] + }, + }, + 'lacros_device_or_vm_tast_tests': { 'lacros_all_tast_tests': { 'variants': [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index aa67584..4db8b6d5947 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -280,18 +280,6 @@ 'ios_runtime_cache_14_5', ], }, - 'SIM_IPHONE_6S_PLUS_15_2': { - 'args': [ - '--platform', - 'iPhone 6s Plus', - '--version', - '15.2', - ], - 'identifier': 'iPhone 6s Plus 15.2', - 'mixins': [ - 'ios_runtime_cache_15_2', - ], - }, 'SIM_IPHONE_6S_PLUS_15_5': { 'args': [ '--platform', @@ -328,18 +316,6 @@ 'ios_runtime_cache_14_5', ], }, - 'SIM_IPHONE_7_15_2': { - 'args': [ - '--platform', - 'iPhone 7', - '--version', - '15.2' - ], - 'identifier': 'iPhone 7 15.2', - 'mixins': [ - 'ios_runtime_cache_15_2', - ], - }, 'SIM_IPHONE_7_15_5': { 'args': [ '--platform', @@ -388,18 +364,6 @@ 'ios_runtime_cache_14_5', ], }, - 'SIM_IPHONE_SE_1ST_GEN_15_2': { - 'args': [ - '--platform', - 'iPhone SE (1st generation)', - '--version', - '15.2', - ], - 'identifier': 'iPhone SE (1st generation) 15.2', - 'mixins': [ - 'ios_runtime_cache_15_2', - ], - }, 'SIM_IPHONE_SE_1ST_GEN_15_5': { 'args': [ '--platform', @@ -1177,6 +1141,21 @@ ], }, }, + 'LACROS_JACUZZI': { + 'args': [ + '--board=jacuzzi', + '--flash', + ], + 'identifier': 'jacuzzi', + 'swarming': { + 'dimension_sets': [ + { + 'os': 'ChromeOS', + 'device_type': 'jacuzzi', + } + ], + }, + }, 'WIN10_INTEL_HD_630_STABLE': { 'identifier': '8086:5912 or 8086:3e92', 'mixins': [ @@ -1190,4 +1169,4 @@ 'win10_nvidia_gtx_1660_stable', ], }, -} \ No newline at end of file +}
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 4e20194..27a028b 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1587,6 +1587,9 @@ 'additional_compile_targets': [ 'chrome', ], + 'test_suites': { + 'gtest_tests': 'lacros_device_arm_tests', + }, 'os_type': 'chromeos' }, 'lacros-arm64-generic-rel': { @@ -5140,7 +5143,7 @@ 'mixins': [ 'has_native_resultdb_integration', 'isolate_profile_data', - 'mac_12_x64', + 'mac_12_t2_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_14_main',
diff --git a/testing/scripts/run_wpt_tests.pydeps b/testing/scripts/run_wpt_tests.pydeps index d91f69b1..29989f8 100644 --- a/testing/scripts/run_wpt_tests.pydeps +++ b/testing/scripts/run_wpt_tests.pydeps
@@ -40,6 +40,7 @@ //third_party/blink/tools/blinkpy/common/net/luci_auth.py //third_party/blink/tools/blinkpy/common/net/network_transaction.py //third_party/blink/tools/blinkpy/common/net/results_fetcher.py +//third_party/blink/tools/blinkpy/common/net/rpc.py //third_party/blink/tools/blinkpy/common/net/web.py //third_party/blink/tools/blinkpy/common/net/web_test_results.py //third_party/blink/tools/blinkpy/common/path_finder.py
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 97b77f0..de81455e 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -117,6 +117,33 @@ ] } ], + "AndroidBackPressRefactor": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "EnabledWithSystemBack_2022_07_20", + "params": { + "system_back": "true" + }, + "enable_features": [ + "BackGestureRefactorAndroid" + ] + }, + { + "name": "EnabledWithoutSystemBack_2022_07_20", + "params": { + "system_back": "false" + }, + "enable_features": [ + "BackGestureRefactorAndroid" + ] + } + ] + } + ], "AndroidBulkTabRestore": [ { "platforms": [ @@ -7319,6 +7346,28 @@ ] } ], + "PriceDropNtpIPH": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "availability": ">=0", + "event_trigger": "name:price_drop_ntp_iph_triggered;comparator:==0;window:365;storage:365", + "event_used": "name:tab_switcher_button_clicked;comparator:any;window:365;storage:365", + "session_rate": "<1" + }, + "enable_features": [ + "IPH_PriceDropNTP" + ], + "disable_features": [] + } + ] + } + ], "PrivacyBudgetClockSkewMetrics": [ { "platforms": [ @@ -9425,6 +9474,21 @@ ] } ], + "UseGetrandomForRandBytes": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "UseGetrandomForRandBytes" + ] + } + ] + } + ], "UseHtmlAttributeNameLookup": [ { "platforms": [
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 631de184..964a9a3 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
@@ -3646,6 +3646,7 @@ kV8PendingGetBeacon_SetURL_Method = 4325, kV8PendingPostBeacon_Constructor = 4326, kV8PendingPostBeacon_SetData_Method = 4327, + kContentVisibilityAutoStateChangedHandlerRegistered = 4328, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/core/css/parser/css_tokenizer.cc b/third_party/blink/renderer/core/css/parser/css_tokenizer.cc index 4bf35b15..08550135 100644 --- a/third_party/blink/renderer/core/css/parser/css_tokenizer.cc +++ b/third_party/blink/renderer/core/css/parser/css_tokenizer.cc
@@ -14,6 +14,106 @@ #include "third_party/blink/renderer/platform/wtf/text/character_names.h" namespace blink { +namespace { + +// To avoid resizing we err on the side of reserving too much space. +// Most strings we tokenize have about 3.5 to 5 characters per token. +constexpr wtf_size_t kEstimatedCharactersPerToken = 3; + +// A tokenizer which contains an already tokenized list of tokens. This can be +// used transparently in place of CSSTokenizer. +class CachedCSSTokenizer : public CSSTokenizerBase { + public: + CachedCSSTokenizer(const String& input, + Vector<CSSParserToken> tokens, + Vector<wtf_size_t> offsets, + Vector<String> string_pool) + : input_(input), + tokens_(std::move(tokens)), + offsets_(std::move(offsets)), + string_pool_(std::move(string_pool)) { + DCHECK_EQ(tokens_.size(), offsets_.size() - 1); + } + + wtf_size_t Offset() const override { return offsets_[index_]; } + + wtf_size_t PreviousOffset() const override { + if (index_ == 0) + return 0; + return offsets_[index_ - 1]; + } + + StringView StringRangeAt(wtf_size_t start, wtf_size_t length) const override { + return input_.RangeAt(start, length); + } + + CSSParserToken TokenizeSingle() override { + while (true) { + const CSSParserToken token = NextToken(); + if (token.GetType() == kCommentToken) + continue; + return token; + } + } + + CSSParserToken TokenizeSingleWithComments() override { return NextToken(); } + + wtf_size_t TokenCount() override { return index_; } + + private: + CSSParserToken NextToken() { + if (index_ >= tokens_.size()) { + DCHECK_EQ(tokens_.back().GetType(), kEOFToken); + return tokens_.back(); + } + return tokens_[index_++]; + } + + // Holds the source text of this sheet. + CSSTokenizerInputStream input_; + + // The full list of tokens in the sheet. + Vector<CSSParserToken> tokens_; + + // Offsets into the source text for each token. + Vector<wtf_size_t> offsets_; + + // String pool to hold allocated strings, taken from CSSTokenizer. + Vector<String> string_pool_; + + // The current token index. + wtf_size_t index_ = 0; +}; + +} // namespace + +// static +std::unique_ptr<CSSTokenizerBase> CSSTokenizer::CreateCachedTokenizer( + const String& input) { + CSSTokenizer tokenizer(input); + + Vector<CSSParserToken> tokens; + + // This holds offsets into the source text for each token. + Vector<wtf_size_t> offsets; + + wtf_size_t reserved_size = (tokenizer.input_.length() - tokenizer.Offset()) / + kEstimatedCharactersPerToken; + tokens.ReserveInitialCapacity(reserved_size); + offsets.ReserveInitialCapacity(reserved_size); + + offsets.push_back(0); + while (true) { + const CSSParserToken token = tokenizer.NextToken(); + tokens.push_back(token); + offsets.push_back(tokenizer.Offset()); + if (token.GetType() == kEOFToken) + break; + } + return std::make_unique<CachedCSSTokenizer>( + input, std::move(tokens), std::move(offsets), + std::move(tokenizer.string_pool_)); +} CSSTokenizer::CSSTokenizer(const String& string, wtf_size_t offset) : input_(string) { @@ -29,10 +129,9 @@ } Vector<CSSParserToken, 32> CSSTokenizer::TokenizeToEOF() { - // To avoid resizing we err on the side of reserving too much space. - // Most strings we tokenize have about 3.5 to 5 characters per token. Vector<CSSParserToken, 32> tokens; - tokens.ReserveInitialCapacity((input_.length() - Offset()) / 3); + tokens.ReserveInitialCapacity((input_.length() - Offset()) / + kEstimatedCharactersPerToken); while (true) { const CSSParserToken token = NextToken();
diff --git a/third_party/blink/renderer/core/css/parser/css_tokenizer.h b/third_party/blink/renderer/core/css/parser/css_tokenizer.h index 817bcbd..e46ba5a1 100644 --- a/third_party/blink/renderer/core/css/parser/css_tokenizer.h +++ b/third_party/blink/renderer/core/css/parser/css_tokenizer.h
@@ -19,25 +19,41 @@ class CSSTokenizerInputStream; -class CORE_EXPORT CSSTokenizer { - DISALLOW_NEW(); - +// Base class for all CSSTokenizer implementations. +class CORE_EXPORT CSSTokenizerBase { public: - CSSTokenizer(const String&, wtf_size_t offset = 0); + virtual ~CSSTokenizerBase() = default; + + virtual wtf_size_t Offset() const = 0; + virtual wtf_size_t PreviousOffset() const = 0; + virtual StringView StringRangeAt(wtf_size_t start, + wtf_size_t length) const = 0; + virtual CSSParserToken TokenizeSingle() = 0; + virtual CSSParserToken TokenizeSingleWithComments() = 0; + virtual wtf_size_t TokenCount() = 0; +}; + +class CORE_EXPORT CSSTokenizer : public CSSTokenizerBase { + public: + // Immediately tokenizes the input string and saves the resulting tokens in + // the returned tokenizer, which can be iterated on later. + static std::unique_ptr<CSSTokenizerBase> CreateCachedTokenizer( + const String& input); + + explicit CSSTokenizer(const String&, wtf_size_t offset = 0); CSSTokenizer(const CSSTokenizer&) = delete; CSSTokenizer& operator=(const CSSTokenizer&) = delete; Vector<CSSParserToken, 32> TokenizeToEOF(); - wtf_size_t TokenCount(); + wtf_size_t TokenCount() override; - wtf_size_t Offset() const { return input_.Offset(); } - wtf_size_t PreviousOffset() const { return prev_offset_; } - StringView StringRangeAt(wtf_size_t start, wtf_size_t length) const; + wtf_size_t Offset() const override { return input_.Offset(); } + wtf_size_t PreviousOffset() const override { return prev_offset_; } + StringView StringRangeAt(wtf_size_t start, wtf_size_t length) const override; + CSSParserToken TokenizeSingle() override; + CSSParserToken TokenizeSingleWithComments() override; private: - CSSParserToken TokenizeSingle(); - CSSParserToken TokenizeSingleWithComments(); - CSSParserToken NextToken(); UChar Consume();
diff --git a/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc b/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc index d24998d..19113ce 100644 --- a/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc
@@ -10,6 +10,16 @@ namespace blink { +constexpr char kCSSText[] = R"( + .foo { + background: url(https://example.com); + } + /* A comment. */ + @hello { + some: stuff; + } +)"; + // This let's us see the line numbers of failing tests #define TEST_TOKENS(string, ...) \ { \ @@ -460,4 +470,52 @@ TEST_TOKENS(";/******", Semicolon()); } +StringView GetLastTokenRange(const CSSTokenizerBase& tokenizer) { + wtf_size_t start = tokenizer.PreviousOffset(); + return tokenizer.StringRangeAt(start, tokenizer.Offset() - start); +} + +class CachedCSSTokenizerTest + : public testing::Test, + public testing::WithParamInterface<bool /* include_comments */> {}; + +TEST_P(CachedCSSTokenizerTest, CachedTokenizer) { + // Make sure the cached tokenizer gives the exact same results as + // CSSTokenizer. + CSSTokenizer tokenizer1(kCSSText); + auto tokenizer2 = CSSTokenizer::CreateCachedTokenizer(kCSSText); + EXPECT_EQ(tokenizer1.Offset(), tokenizer2->Offset()); + EXPECT_EQ(tokenizer1.PreviousOffset(), tokenizer2->PreviousOffset()); + + // Tokenize the full CSS text with comments and verify the tokens and state. + bool last_token_eof = false; + while (true) { + CSSParserToken token1(kEOFToken); + CSSParserToken token2(kEOFToken); + if (GetParam()) { + token1 = tokenizer1.TokenizeSingleWithComments(); + token2 = tokenizer2->TokenizeSingleWithComments(); + } else { + token1 = tokenizer1.TokenizeSingle(); + token2 = tokenizer2->TokenizeSingle(); + } + CompareTokens(token1, token2); + EXPECT_EQ(tokenizer1.Offset(), tokenizer2->Offset()); + EXPECT_EQ(tokenizer1.PreviousOffset(), tokenizer2->PreviousOffset()); + EXPECT_EQ(GetLastTokenRange(tokenizer1), GetLastTokenRange(*tokenizer2)); + if (last_token_eof) + break; + + // Perform one more iteration of the loop to make sure behavior is the same + // if TokenizeSingle() is called beyond EOF. + last_token_eof = token1.GetType() == kEOFToken; + + // CSSTokenizer keeps adding to token count after EOF and CachedCSSTokenizer + // doesn't match this behavior. + EXPECT_EQ(tokenizer1.TokenCount(), tokenizer2->TokenCount()); + } +} + +INSTANTIATE_TEST_SUITE_P(All, CachedCSSTokenizerTest, ::testing::Bool()); + } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/events/event_target.cc b/third_party/blink/renderer/core/dom/events/event_target.cc index 273da6d..62c496b 100644 --- a/third_party/blink/renderer/core/dom/events/event_target.cc +++ b/third_party/blink/renderer/core/dom/events/event_target.cc
@@ -505,6 +505,11 @@ UseCounter::Count(*document, WebFeature::kSlotChangeEventAddListener); } else if (event_type == event_type_names::kBeforematch) { UseCounter::Count(*document, WebFeature::kBeforematchHandlerRegistered); + } else if (event_type == + event_type_names::kContentvisibilityautostatechanged) { + UseCounter::Count( + *document, + WebFeature::kContentVisibilityAutoStateChangedHandlerRegistered); } } }
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 c3073ac..181a579b 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,6 +58,7 @@ auto trust_token_params = network::mojom::blink::TrustTokenParams::New( network::mojom::TrustTokenOperationType::kRedemption, network::mojom::TrustTokenRefreshPolicy::kUseCached, + /* custom_key_commitment=*/"custom_key_commitment", network::mojom::TrustTokenSignRequestData::kInclude, /* include_timestamp_header=*/true, issuers, additional_signed_headers, /* possibly_unsafe_additional_signing_data=*/"ccc");
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc index 5e9e829a..11b0dc9 100644 --- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc +++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -1135,6 +1135,15 @@ reference_point += To<LayoutBox>(offset_parent_object)->PhysicalLocation(); } + } else if (UNLIKELY(IsBox() && + To<LayoutBox>(this)->AnchorScrollContainer())) { + // TODO(crbug.com/1309178): This is copied from + // LayoutBox::OffsetFromContainerInternal(). Consider unifying them into a + // utility function if it gets more usage. + LayoutBox::AnchorScrollData data = + To<LayoutBox>(this)->ComputeAnchorScrollData(); + reference_point -= + PhysicalOffset::FromVector2dFFloor(data.accumulated_scroll_offset); } if (offset_parent_object->IsLayoutInline()) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc index 71aac5d..e4154be 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc
@@ -264,74 +264,46 @@ NGLogicalOutOfFlowInsets ComputeOutOfFlowInsets( const ComputedStyle& style, const LogicalSize& available_logical_size, - const WritingModeConverter& container_converter, - const NGLogicalAnchorQuery& anchor_query, - bool* has_anchor_functions_out) { - struct AnchorEvaluatorImpl : public Length::AnchorEvaluator { - STACK_ALLOCATED(); - - public: - AnchorEvaluatorImpl(const NGLogicalAnchorQuery& anchor_query, - const WritingModeConverter& container_converter) - : anchor_query(anchor_query), - container_converter(container_converter) {} - - absl::optional<LayoutUnit> EvaluateAnchor( - const AtomicString& anchor_name, - AnchorValue anchor_value) const override { - return anchor_query.EvaluateAnchor(anchor_name, anchor_value, - available_size, container_converter, - is_y_axis, is_right_or_bottom); - } - - const NGLogicalAnchorQuery& anchor_query; - const WritingModeConverter& container_converter; - LayoutUnit available_size; - bool is_y_axis = false; - bool is_right_or_bottom = false; - } anchor_evaluator(anchor_query, container_converter); - bool has_anchor_functions = false; - + NGAnchorEvaluatorImpl* anchor_evaluator) { // Compute in physical, because anchors may be in different `writing-mode` or // `direction`. const WritingDirectionMode writing_direction = style.GetWritingDirection(); const PhysicalSize available_size = ToPhysicalSize( available_logical_size, writing_direction.GetWritingMode()); - anchor_evaluator.available_size = available_size.width; absl::optional<LayoutUnit> left; if (const Length& left_length = style.Left(); !left_length.IsAuto()) { + anchor_evaluator->SetAxis(/* is_y_axis */ false, + /* is_right_or_bottom */ false, + available_size.width); left = MinimumValueForLength(left_length, available_size.width, - &anchor_evaluator); - has_anchor_functions = left_length.HasAnchorQueries(); + anchor_evaluator); } absl::optional<LayoutUnit> right; if (const Length& right_length = style.Right(); !right_length.IsAuto()) { - anchor_evaluator.is_right_or_bottom = true; + anchor_evaluator->SetAxis(/* is_y_axis */ false, + /* is_right_or_bottom */ true, + available_size.width); right = MinimumValueForLength(right_length, available_size.width, - &anchor_evaluator); - has_anchor_functions |= right_length.HasAnchorQueries(); + anchor_evaluator); } - anchor_evaluator.is_y_axis = true; - anchor_evaluator.available_size = available_size.height; absl::optional<LayoutUnit> top; if (const Length& top_length = style.Top(); !top_length.IsAuto()) { - anchor_evaluator.is_right_or_bottom = false; + anchor_evaluator->SetAxis(/* is_y_axis */ true, + /* is_right_or_bottom */ false, + available_size.height); top = MinimumValueForLength(top_length, available_size.height, - &anchor_evaluator); - has_anchor_functions |= top_length.HasAnchorQueries(); + anchor_evaluator); } absl::optional<LayoutUnit> bottom; if (const Length& bottom_length = style.Bottom(); !bottom_length.IsAuto()) { - anchor_evaluator.is_right_or_bottom = true; + anchor_evaluator->SetAxis(/* is_y_axis */ true, + /* is_right_or_bottom */ true, + available_size.height); bottom = MinimumValueForLength(bottom_length, available_size.height, - &anchor_evaluator); - has_anchor_functions |= bottom_length.HasAnchorQueries(); + anchor_evaluator); } - if (has_anchor_functions_out) - *has_anchor_functions_out = has_anchor_functions; - // Convert the physical insets to logical. PhysicalToLogical<absl::optional<LayoutUnit>&> insets(writing_direction, top, right, bottom, left);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h index 200dd8ce..a0b2967 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h +++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h
@@ -50,9 +50,7 @@ CORE_EXPORT NGLogicalOutOfFlowInsets ComputeOutOfFlowInsets(const ComputedStyle& style, const LogicalSize& available_size, - const WritingModeConverter& container_converter, - const NGLogicalAnchorQuery& anchor_query, - bool* has_anchor_functions = nullptr); + NGAnchorEvaluatorImpl* anchor_evaluator); CORE_EXPORT LogicalSize ComputeOutOfFlowAvailableSize(const NGBlockNode&,
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc index 4deca4f..41452e32 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils_test.cc
@@ -104,8 +104,11 @@ ToPhysicalSize(space.AvailableSize(), container_writing_direction.GetWritingMode())); NGLogicalAnchorQuery anchor_query; + NGAnchorEvaluatorImpl anchor_evaluator( + anchor_query, container_converter, + /* self_writing_mode */ WritingMode::kHorizontalTb); const NGLogicalOutOfFlowInsets insets = ComputeOutOfFlowInsets( - node.Style(), space.AvailableSize(), container_converter, anchor_query); + node.Style(), space.AvailableSize(), &anchor_evaluator); LogicalSize computed_available_size = ComputeOutOfFlowAvailableSize(node, space, insets, static_position); blink::ComputeOutOfFlowInlineDimensions( @@ -126,8 +129,11 @@ ToPhysicalSize(space.AvailableSize(), container_writing_direction.GetWritingMode())); NGLogicalAnchorQuery anchor_query; + NGAnchorEvaluatorImpl anchor_evaluator( + anchor_query, container_converter, + /* self_writing_mode */ WritingMode::kHorizontalTb); const NGLogicalOutOfFlowInsets insets = ComputeOutOfFlowInsets( - node.Style(), space.AvailableSize(), container_converter, anchor_query); + node.Style(), space.AvailableSize(), &anchor_evaluator); LogicalSize computed_available_size = ComputeOutOfFlowAvailableSize(node, space, insets, static_position); blink::ComputeOutOfFlowBlockDimensions(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc index 2132ee0..c7ea163 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.cc
@@ -184,4 +184,22 @@ visitor->Trace(anchor_references_); } +absl::optional<LayoutUnit> NGAnchorEvaluatorImpl::EvaluateAnchor( + const AtomicString& anchor_name, + AnchorValue anchor_value) const { + has_anchor_functions_ = true; + return anchor_query_.EvaluateAnchor(anchor_name, anchor_value, + available_size_, container_converter_, + is_y_axis_, is_right_or_bottom_); +} + +absl::optional<LayoutUnit> NGAnchorEvaluatorImpl::EvaluateAnchorSize( + const AtomicString& anchor_name, + AnchorSizeValue anchor_size_value) const { + has_anchor_functions_ = true; + return anchor_query_.EvaluateSize(anchor_name, anchor_size_value, + container_converter_.GetWritingMode(), + self_writing_mode_); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h index 58debbf..bd38859b 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h +++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/core/layout/geometry/logical_rect.h" #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" #include "third_party/blink/renderer/platform/geometry/anchor_query_enums.h" +#include "third_party/blink/renderer/platform/geometry/length.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h" @@ -109,6 +110,47 @@ HashMap<AtomicString, NGLogicalAnchorReference> anchor_references_; }; +class CORE_EXPORT NGAnchorEvaluatorImpl : public Length::AnchorEvaluator { + STACK_ALLOCATED(); + + public: + NGAnchorEvaluatorImpl(const NGLogicalAnchorQuery& anchor_query, + const WritingModeConverter& container_converter, + WritingMode self_writing_mode) + : anchor_query_(anchor_query), + container_converter_(container_converter), + self_writing_mode_(self_writing_mode) {} + + // Returns true if this evaluator was invoked for `anchor()` or + // `anchor-size()` functions. + bool HasAnchorFunctions() const { return has_anchor_functions_; } + + // This must be set before evaluating `anchor()` function. + void SetAxis(bool is_y_axis, + bool is_right_or_bottom, + LayoutUnit available_size) { + available_size_ = available_size; + is_y_axis_ = is_y_axis; + is_right_or_bottom_ = is_right_or_bottom; + } + + absl::optional<LayoutUnit> EvaluateAnchor( + const AtomicString& anchor_name, + AnchorValue anchor_value) const override; + absl::optional<LayoutUnit> EvaluateAnchorSize( + const AtomicString& anchor_name, + AnchorSizeValue anchor_size_value) const override; + + private: + const NGLogicalAnchorQuery& anchor_query_; + const WritingModeConverter& container_converter_; + WritingMode self_writing_mode_; + LayoutUnit available_size_; + bool is_y_axis_ = false; + bool is_right_or_bottom_ = false; + mutable bool has_anchor_functions_ = false; +}; + } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_NG_ANCHOR_QUERY_H_
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 82d930d..3a7f84d 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -1442,10 +1442,12 @@ const WritingModeConverter container_converter( container_writing_direction, node_info.container_physical_content_size); + NGAnchorEvaluatorImpl anchor_evaluator( + container_builder_->AnchorQuery(), container_converter, + candidate_writing_direction.GetWritingMode()); const NGLogicalOutOfFlowInsets insets = ComputeOutOfFlowInsets( candidate_style, node_info.constraint_space.AvailableSize(), - container_converter, container_builder_->AnchorQuery(), - &offset_info->disable_first_tier_cache); + &anchor_evaluator); const LogicalSize computed_available_size = ComputeOutOfFlowAvailableSize(node_info.node, node_info.constraint_space, @@ -1455,34 +1457,6 @@ ComputeBorders(node_info.constraint_space, node_info.node) + ComputePadding(node_info.constraint_space, candidate_style); - struct AnchorSizeEvaluatorImpl : public Length::AnchorEvaluator { - STACK_ALLOCATED(); - - public: - AnchorSizeEvaluatorImpl(const NGLogicalAnchorQuery& anchor_query, - const WritingMode container_writing_mode, - const WritingMode self_writing_mode) - : anchor_query(anchor_query), - container_writing_mode(container_writing_mode), - self_writing_mode(self_writing_mode) {} - - absl::optional<LayoutUnit> EvaluateAnchorSize( - const AtomicString& anchor_name, - AnchorSizeValue anchor_size_value) const override { - has_anchor_functions = true; - return anchor_query.EvaluateSize(anchor_name, anchor_size_value, - container_writing_mode, - self_writing_mode); - } - - const NGLogicalAnchorQuery& anchor_query; - const WritingMode container_writing_mode; - const WritingMode self_writing_mode; - mutable bool has_anchor_functions = false; - } anchor_evaluator(container_builder_->AnchorQuery(), - container_writing_direction.GetWritingMode(), - candidate_writing_direction.GetWritingMode()); - absl::optional<LogicalSize> replaced_size; if (node_info.node.IsReplaced()) { replaced_size = ComputeReplacedSize( @@ -1531,7 +1505,7 @@ } offset_info->disable_first_tier_cache |= - anchor_evaluator.has_anchor_functions; + anchor_evaluator.HasAnchorFunctions(); offset_info->block_estimate = node_dimensions.size.block_size; // Calculate the offsets.
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index dfd3365..8a7ed2e 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -888,6 +888,15 @@ // Dirty the z-order list in which we are contained. old_child->DirtyStackingContextZOrderLists(); MarkAncestorChainForFlagsUpdate(); + + if (old_child->GetLayoutObject() + .StyleRef() + .HasStickyConstrainedPosition()) { + if (const auto* scroll_container = + old_child->ContainingScrollContainerLayer()) { + scroll_container->GetScrollableArea()->RemoveStickyLayer(old_child); + } + } } if (GetLayoutObject().StyleRef().Visibility() != EVisibility::kVisible)
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc index 70453275..0f3e9c0 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -2074,6 +2074,11 @@ EnsureRareData().sticky_layers_.insert(layer); } +void PaintLayerScrollableArea::RemoveStickyLayer(PaintLayer* layer) { + if (rare_data_) + rare_data_->sticky_layers_.erase(layer); +} + void PaintLayerScrollableArea::InvalidateAllStickyConstraints() { // Don't clear StickyConstraints for each LayoutObject of each layer in // sticky_layers_ because sticky_layers_ may contain stale pointers.
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h index 77bfe4b..01dc8c1c 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -518,6 +518,7 @@ } void AddStickyLayer(PaintLayer*); + void RemoveStickyLayer(PaintLayer*); bool HasStickyLayer(PaintLayer* layer) const { return rare_data_ && rare_data_->sticky_layers_.Contains(layer); }
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc index eb781cb..a2161a8 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
@@ -1622,4 +1622,28 @@ EXPECT_TRUE(scrollable_area->Layer()->NeedsReorderOverlayOverflowControls()); } +TEST_P(MAYBE_PaintLayerScrollableAreaTest, RemoveStickyUnderContain) { + SetBodyInnerHTML(R"HTML( + <div id="contain" style="contain: strict; width: 100px; height: 2000px"> + <div id="parent"> + <div id="sticky" style="top: 100px; position: sticky">STICKY</div> + </div> + </div> + )HTML"); + + auto* scrollable_area = GetLayoutView().GetScrollableArea(); + auto* sticky_layer = GetPaintLayerByElementId("sticky"); + EXPECT_TRUE(scrollable_area->HasStickyLayer(sticky_layer)); + + GetDocument().getElementById("parent")->remove(); + EXPECT_FALSE(scrollable_area->HasStickyLayer(sticky_layer)); + + UpdateAllLifecyclePhasesForTest(); + + // This should not crash. + scrollable_area->SetScrollOffset(ScrollOffset(0, 100), + mojom::blink::ScrollType::kProgrammatic); + UpdateAllLifecyclePhasesForTest(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index 41862ee..25e01f6 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -1975,7 +1975,9 @@ const ClipPaintPropertyNodeOrAlias* new_clip = nullptr; const EffectPaintPropertyNodeOrAlias* new_effect = nullptr; - if (object_.HasLayer() || properties_ || IsLinkHighlighted(object_)) { + if (object_.HasLayer() || properties_ || IsLinkHighlighted(object_) || + object_.CanContainFixedPositionObjects() || + object_.CanContainAbsolutePositionObjects()) { new_transform = context_.current.transform; new_clip = context_.current.clip; new_effect = context_.current_effect;
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc index 8e8455b0..ade37f26 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -7308,4 +7308,21 @@ EXPECT_FALSE(properties->Effect()->HasDirectCompositingReasons()); } +TEST_P(PaintPropertyTreeBuilderTest, EffectCanUseCurrentClipAsOutputClipCrash) { + SetBodyInnerHTML(R"HTML( + <style type="text/css"> + .c1 { transform: rotate(180deg); } + .c9 { position: relative; opacity: 0.1; } + .c9 > .c18 { position: fixed; } + </style> + <fieldset id="f" class="c1"><samp class="c9"><footer + class="c18"></footer></samp></fiedlset> + )HTML"); + + EXPECT_TRUE(GetLayoutObjectByElementId("f") + ->SlowFirstChild() + ->FirstFragment() + .HasLocalBorderBoxProperties()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.cc b/third_party/blink/renderer/core/timing/performance_resource_timing.cc index 3db32d15..ee80332 100644 --- a/third_party/blink/renderer/core/timing/performance_resource_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_resource_timing.cc
@@ -74,8 +74,9 @@ alpn_negotiated_protocol_( static_cast<String>(info.alpn_negotiated_protocol)), connection_info_(static_cast<String>(info.connection_info)), - render_blocking_status_(info.render_blocking_status ? "blocking" - : "non-blocking"), + render_blocking_status_(info.render_blocking_status + ? RenderBlockingStatusType::kBlocking + : RenderBlockingStatusType::kNonBlocking), time_origin_(time_origin), cross_origin_isolated_capability_(cross_origin_isolated_capability), timing_(ResourceLoadTiming::FromMojo(info.timing.get())), @@ -169,7 +170,14 @@ } AtomicString PerformanceResourceTiming::renderBlockingStatus() const { - return render_blocking_status_; + switch (render_blocking_status_) { + case RenderBlockingStatusType::kBlocking: + return "blocking"; + case RenderBlockingStatusType::kNonBlocking: + return "non-blocking"; + } + NOTREACHED(); + return "non-blocking"; } AtomicString PerformanceResourceTiming::AlpnNegotiatedProtocol() const {
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.h b/third_party/blink/renderer/core/timing/performance_resource_timing.h index 8b73204..a4a5a98c 100644 --- a/third_party/blink/renderer/core/timing/performance_resource_timing.h +++ b/third_party/blink/renderer/core/timing/performance_resource_timing.h
@@ -47,6 +47,8 @@ namespace blink { +enum RenderBlockingStatusType { kBlocking, kNonBlocking }; + class ResourceLoadTiming; class CORE_EXPORT PerformanceResourceTiming : public PerformanceEntry { @@ -137,7 +139,7 @@ AtomicString initiator_type_; AtomicString alpn_negotiated_protocol_; AtomicString connection_info_; - AtomicString render_blocking_status_; + RenderBlockingStatusType render_blocking_status_; base::TimeTicks time_origin_; bool cross_origin_isolated_capability_; scoped_refptr<ResourceLoadTiming> timing_;
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.idl b/third_party/blink/renderer/core/timing/performance_resource_timing.idl index 63d8935..2a75291 100644 --- a/third_party/blink/renderer/core/timing/performance_resource_timing.idl +++ b/third_party/blink/renderer/core/timing/performance_resource_timing.idl
@@ -30,6 +30,11 @@ // https://w3c.github.io/resource-timing/#performanceresourcetiming +enum RenderBlockingStatusType { + "blocking", + "non-blocking" +}; + [Exposed=(Window,Worker)] interface PerformanceResourceTiming : PerformanceEntry { [MeasureAs=PerformanceResourceTimingInitiatorType] readonly attribute DOMString initiatorType; @@ -53,6 +58,6 @@ // PerformanceResourceTiming#renderBlockingStatus // See: https://github.com/abinpaul1/resource-timing/blob/render-blocking-status-explainer/Explainer/Render_Blocking_Status.md [RuntimeEnabled=RenderBlockingStatus] - readonly attribute DOMString renderBlockingStatus; + readonly attribute RenderBlockingStatusType renderBlockingStatus; [CallWith=ScriptState, ImplementedAs=toJSONForBinding] object toJSON(); };
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc index 5c68fd9..bea385e6 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
@@ -914,20 +914,18 @@ return false; } - if (!RuntimeEnabledFeatures:: - SecurePaymentConfirmationRelaxResidentKeyEnabled()) { - if ((!authenticator->hasResidentKey() && - !authenticator->hasRequireResidentKey()) || - (authenticator->hasResidentKey() && - authenticator->residentKey() != "required") || - (!authenticator->hasResidentKey() && - authenticator->hasRequireResidentKey() && - !authenticator->requireResidentKey())) { - resolver->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kNotSupportedError, - "A resident key is required for 'payment' extension.")); - return false; - } + if ((!authenticator->hasResidentKey() && + !authenticator->hasRequireResidentKey()) || + (authenticator->hasResidentKey() && + authenticator->residentKey() == "discouraged") || + (!authenticator->hasResidentKey() && + authenticator->hasRequireResidentKey() && + !authenticator->requireResidentKey())) { + resolver->Reject(MakeGarbageCollected<DOMException>( + DOMExceptionCode::kNotSupportedError, + "A resident key must be 'preferred' or 'required' for 'payment' " + "extension.")); + return false; } if (!authenticator->hasAuthenticatorAttachment() ||
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_playback_speed_list_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_playback_speed_list_element.cc index 7efd4d0..17edb9c 100644 --- a/third_party/blink/renderer/modules/media_controls/elements/media_control_playback_speed_list_element.cc +++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_playback_speed_list_element.cc
@@ -228,7 +228,7 @@ playback_speed.display_name, playback_speed.playback_rate); playback_speed_item->setAttribute( html_names::kAriaSetsizeAttr, - WTF::AtomicString::Number(std::size(kPlaybackSpeeds) + 1)); + WTF::AtomicString::Number(std::size(kPlaybackSpeeds))); playback_speed_item->setAttribute(html_names::kAriaPosinsetAttr, WTF::AtomicString::Number(i + 1)); playback_speed_item->setAttribute(html_names::kRoleAttr,
diff --git a/third_party/blink/renderer/modules/media_controls/resources/ic_playback_speed.svg b/third_party/blink/renderer/modules/media_controls/resources/ic_playback_speed.svg index 20014ca2..43594ed 100644 --- a/third_party/blink/renderer/modules/media_controls/resources/ic_playback_speed.svg +++ b/third_party/blink/renderer/modules/media_controls/resources/ic_playback_speed.svg
@@ -1,4 +1,4 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"> +<svg fill="WindowText" xmlns="http://www.w3.org/2000/svg" height="24" width="24"> <path d="M0 0h24v24H0V0z" fill="none"/> <path d="M13.05 9.79L10 7.5v9l3.05-2.29L16 12l-2.95-2.21zm0 0L10 7.5v9l3.05-2.29L16 12l-2.95-2.21zm0 0L10 7.5v9l3.05-2.29L16 12l-2.95-2.21zM11 4.07V2.05c-2.01.2-3.84 1-5.32 2.21L7.1 5.69A7.941 7.941 0 0111 4.07zM5.69 7.1L4.26 5.68A9.949 9.949 0 002.05 11h2.02c.18-1.46.76-2.79 1.62-3.9zM4.07 13H2.05c.2 2.01 1 3.84 2.21 5.32l1.43-1.43A7.868 7.868 0 014.07 13zm1.61 6.74A9.981 9.981 0 0011 21.95v-2.02a7.941 7.941 0 01-3.9-1.62l-1.42 1.43zM22 12c0 5.16-3.92 9.42-8.95 9.95v-2.02C16.97 19.41 20 16.05 20 12s-3.03-7.41-6.95-7.93V2.05C18.08 2.58 22 6.84 22 12z"/> </svg> \ No newline at end of file
diff --git a/third_party/blink/renderer/modules/quota/deprecated_storage_info.idl b/third_party/blink/renderer/modules/quota/deprecated_storage_info.idl index 606b038f..9ca1126 100644 --- a/third_party/blink/renderer/modules/quota/deprecated_storage_info.idl +++ b/third_party/blink/renderer/modules/quota/deprecated_storage_info.idl
@@ -24,7 +24,8 @@ */ [ - LegacyNoInterfaceObject + LegacyNoInterfaceObject, + RuntimeEnabled=PrefixedStorageInfo ] interface DeprecatedStorageInfo { const unsigned short TEMPORARY = 0; const unsigned short PERSISTENT = 1;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc index 5179e52..957231f 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
@@ -551,7 +551,8 @@ flags.setAlpha(alpha); save_layer_id = cc_list_.push<cc::SaveLayerOp>(nullptr, &flags); } else { - save_layer_id = cc_list_.push<cc::SaveLayerAlphaOp>(nullptr, alpha); + save_layer_id = cc_list_.push<cc::SaveLayerAlphaOp>( + nullptr, static_cast<float>(alpha / 255.0f)); } } else { // Handle filter effect.
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc index c98a1c9..9f1bb0a0 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc
@@ -34,6 +34,7 @@ root_of_2d_translation_ = &node; plane_root_transform_ = nullptr; screen_transform_ = nullptr; + screen_transform_updated_ = true; DCHECK(node.ScrollNode()); nearest_scroll_translation_ = &node; @@ -77,8 +78,7 @@ plane_root_transform_->from_plane_root.PostTranslate(-translation.x(), -translation.y()); plane_root_transform_->has_animation = - parent.plane_root_transform_->has_animation || - node.HasActiveTransformAnimation(); + parent.has_animation_to_plane_root(); } else { // The parent doesn't have plane_root_transform_ means that the parent's // plane root is the same as the 2d translation root, so this node @@ -92,7 +92,7 @@ TransformationMatrix local = node.MatrixWithOriginApplied(); bool is_plane_root = !local.IsFlat() || !local.IsInvertible(); - if (is_plane_root && root_of_2d_translation_ == &node) { + if (is_plane_root) { // We don't need plane root transform because the plane root is the same // as the 2d translation root. plane_root_transform_ = nullptr; @@ -100,34 +100,25 @@ if (!plane_root_transform_) plane_root_transform_ = std::make_unique<PlaneRootTransform>(); - if (is_plane_root) { - plane_root_transform_->plane_root = &node; - plane_root_transform_->to_plane_root.MakeIdentity(); - plane_root_transform_->from_plane_root.MakeIdentity(); - plane_root_transform_->has_animation = false; - } else { - plane_root_transform_->plane_root = parent.plane_root(); - plane_root_transform_->to_plane_root.MakeIdentity(); - parent.ApplyToPlaneRoot(plane_root_transform_->to_plane_root); - plane_root_transform_->to_plane_root.Multiply(local); - plane_root_transform_->from_plane_root = local.Inverse(); - parent.ApplyFromPlaneRoot(plane_root_transform_->from_plane_root); - plane_root_transform_->has_animation = - parent.has_animation_to_plane_root() || - node.HasActiveTransformAnimation(); - } + plane_root_transform_->plane_root = parent.plane_root(); + plane_root_transform_->to_plane_root.MakeIdentity(); + parent.ApplyToPlaneRoot(plane_root_transform_->to_plane_root); + plane_root_transform_->to_plane_root.Multiply(local); + plane_root_transform_->from_plane_root = local.Inverse(); + parent.ApplyFromPlaneRoot(plane_root_transform_->from_plane_root); + plane_root_transform_->has_animation = + parent.has_animation_to_plane_root() || + node.HasActiveTransformAnimation(); } } // screen_transform_ will be updated only when needed. - if (screen_transform_) { - if (plane_root()->IsRoot()) { - // We won't need screen_transform_. - screen_transform_ = nullptr; - } else { - // Keep the struct for possible reuse but mark it as invalid. - screen_transform_->is_valid = false; - } + if (plane_root()->IsRoot()) { + // We won't need screen_transform_. + screen_transform_ = nullptr; + screen_transform_updated_ = true; + } else { + screen_transform_updated_ = false; } } @@ -136,21 +127,20 @@ // The cache should have been updated. DCHECK_EQ(cache_generation_, s_global_generation); - // If the plane root is the root of the tree, we can just use the plane root - // transform as the screen transform. - if (plane_root()->IsRoot()) + if (screen_transform_updated_) return; - // If the node is the root, then its plane root is itself, and we should have - // returned above. + screen_transform_updated_ = true; + + // screen_transform_updated_ should have set to true in Update() if any of + // the following DCHECKs would fail. + DCHECK(!plane_root()->IsRoot()); DCHECK(!node.IsRoot()); + auto* parent_node = node.UnaliasedParent(); parent_node->UpdateScreenTransform(); const auto& parent = parent_node->GetTransformCache(); - if (ScreenTransformIsValid()) - return; - if (screen_transform_) { *screen_transform_ = ScreenTransform(); } else { @@ -175,19 +165,6 @@ screen_transform_->projection_from_screen = to_screen_flattened.Inverse(); screen_transform_->has_animation |= node.HasActiveTransformAnimation(); - - screen_transform_->is_valid = true; } -#if DCHECK_IS_ON() -void GeometryMapperTransformCache::CheckScreenTransformUpdated() const { - // We should create screen transform iff the plane root is not the root. - if (plane_root()->IsRoot()) { - DCHECK(!screen_transform_); - } else { - DCHECK(ScreenTransformIsValid()); - } -} -#endif - } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h index 6758143..07e4886 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h
@@ -50,42 +50,34 @@ // These getters must be called after UpdateScreenTransform() when screen // transform data is really needed. const TransformationMatrix& to_screen() const { - DCHECK(ScreenTransformIsValid()); + DCHECK(screen_transform_updated_); return screen_transform_->to_screen; } const TransformationMatrix& projection_from_screen() const { - DCHECK(ScreenTransformIsValid()); + DCHECK(screen_transform_updated_); return screen_transform_->projection_from_screen; } bool projection_from_screen_is_valid() const { -#if DCHECK_IS_ON() - CheckScreenTransformUpdated(); -#endif + DCHECK(screen_transform_updated_); return LIKELY(!screen_transform_) || screen_transform_->projection_from_screen_is_valid; } void ApplyToScreen(TransformationMatrix& m) const { -#if DCHECK_IS_ON() - CheckScreenTransformUpdated(); -#endif - if (UNLIKELY(ScreenTransformIsValid())) + DCHECK(screen_transform_updated_); + if (UNLIKELY(screen_transform_)) m.Multiply(to_screen()); else ApplyToPlaneRoot(m); } void ApplyProjectionFromScreen(TransformationMatrix& m) const { -#if DCHECK_IS_ON() - CheckScreenTransformUpdated(); -#endif - if (UNLIKELY(ScreenTransformIsValid())) + DCHECK(screen_transform_updated_); + if (UNLIKELY(screen_transform_)) m.Multiply(projection_from_screen()); else ApplyFromPlaneRoot(m); } bool has_animation_to_screen() const { -#if DCHECK_IS_ON() - CheckScreenTransformUpdated(); -#endif + DCHECK(screen_transform_updated_); return UNLIKELY(screen_transform_) ? screen_transform_->has_animation : has_animation_to_plane_root(); } @@ -139,16 +131,8 @@ private: friend class GeometryMapperTransformCacheTest; -#if DCHECK_IS_ON() - void CheckScreenTransformUpdated() const; -#endif - void Update(const TransformPaintPropertyNode&); - bool ScreenTransformIsValid() const { - return screen_transform_ && screen_transform_->is_valid; - } - static unsigned s_global_generation; // The accumulated 2d translation to root_of_2d_translation(). @@ -228,10 +212,13 @@ TransformationMatrix projection_from_screen; bool projection_from_screen_is_valid = false; bool has_animation = false; - bool is_valid = false; }; std::unique_ptr<ScreenTransform> screen_transform_; + const TransformPaintPropertyNode* nearest_scroll_translation_ = nullptr; + const TransformPaintPropertyNode* nearest_directly_composited_ancestor_ = + nullptr; + // Whether or not there is a fixed position transform to the root. bool has_fixed_ = false; // Whether or not there is a sticky translation to the root. @@ -239,9 +226,7 @@ bool is_backface_hidden_ = false; - const TransformPaintPropertyNode* nearest_scroll_translation_ = nullptr; - const TransformPaintPropertyNode* nearest_directly_composited_ancestor_ = - nullptr; + bool screen_transform_updated_ = false; unsigned cache_generation_ = s_global_generation - 1; };
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache_test.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache_test.cc index b0077a11..4bd15d5 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache_test.cc
@@ -19,15 +19,17 @@ } static void UpdateScreenTransform(const TransformPaintPropertyNode& node) { + node.GetTransformCache(); // Ensure the transform cache. node.UpdateScreenTransform(); } - static bool HasPlaneRootTransform(const TransformPaintPropertyNode& node) { - return !!node.GetTransformCache().plane_root_transform_; + static bool ScreenTransformUpdated(const TransformPaintPropertyNode& node) { + return node.GetTransformCache().screen_transform_updated_; } - static bool HasScreenTransform(const TransformPaintPropertyNode& node) { - return node.GetTransformCache().ScreenTransformIsValid(); + static GeometryMapperTransformCache::ScreenTransform* GetScreenTransform( + const TransformPaintPropertyNode& node) { + return GetTransformCache(node).screen_transform_.get(); } static void Check2dTranslationToRoot(const TransformPaintPropertyNode& node, @@ -37,11 +39,8 @@ EXPECT_EQ(&t0(), cache.root_of_2d_translation()); EXPECT_EQ(gfx::Vector2dF(x, y), cache.to_2d_translation_root()); - EXPECT_FALSE(HasPlaneRootTransform(node)); - EXPECT_FALSE(HasScreenTransform(node)); - UpdateScreenTransform(node); - EXPECT_FALSE(HasPlaneRootTransform(node)); - EXPECT_FALSE(HasScreenTransform(node)); + EXPECT_TRUE(ScreenTransformUpdated(node)); + EXPECT_FALSE(GetScreenTransform(node)); EXPECT_EQ(&t0(), cache.plane_root()); TransformationMatrix actual_to_plane_root; @@ -63,11 +62,8 @@ EXPECT_EQ(gfx::Vector2dF(translate_x, translate_y), cache.to_2d_translation_root()); - EXPECT_TRUE(HasPlaneRootTransform(node)); - EXPECT_FALSE(HasScreenTransform(node)); - UpdateScreenTransform(node); - EXPECT_TRUE(HasPlaneRootTransform(node)); - EXPECT_FALSE(HasScreenTransform(node)); + EXPECT_TRUE(ScreenTransformUpdated(node)); + EXPECT_FALSE(GetScreenTransform(node)); EXPECT_EQ(&t0(), cache.plane_root()); EXPECT_EQ(to_plane_root, cache.to_plane_root()); @@ -92,11 +88,10 @@ EXPECT_EQ(gfx::Vector2dF(translate_x, translate_y), cache.to_2d_translation_root()); - EXPECT_FALSE(HasPlaneRootTransform(node)); - EXPECT_FALSE(HasScreenTransform(node)); + EXPECT_FALSE(ScreenTransformUpdated(node)); UpdateScreenTransform(node); - EXPECT_FALSE(HasPlaneRootTransform(node)); - EXPECT_TRUE(HasScreenTransform(node)); + EXPECT_TRUE(ScreenTransformUpdated(node)); + EXPECT_TRUE(GetScreenTransform(node)); EXPECT_EQ(&plane_root, cache.plane_root()); EXPECT_EQ(to_screen, cache.to_screen()); @@ -119,11 +114,10 @@ EXPECT_EQ(gfx::Vector2dF(translate_x, translate_y), cache.to_2d_translation_root()); - EXPECT_TRUE(HasPlaneRootTransform(node)); - EXPECT_FALSE(HasScreenTransform(node)); + EXPECT_FALSE(ScreenTransformUpdated(node)); UpdateScreenTransform(node); - EXPECT_TRUE(HasPlaneRootTransform(node)); - EXPECT_TRUE(HasScreenTransform(node)); + EXPECT_TRUE(ScreenTransformUpdated(node)); + EXPECT_TRUE(GetScreenTransform(node)); EXPECT_EQ(&plane_root, cache.plane_root()); EXPECT_EQ(to_plane_root, cache.to_plane_root()); @@ -134,6 +128,14 @@ projection_from_screen = projection_from_screen.Inverse(); EXPECT_EQ(projection_from_screen, cache.projection_from_screen()); } + + static bool HasAnimationToPlaneRoot(const TransformPaintPropertyNode& node) { + return node.GetTransformCache().has_animation_to_plane_root(); + } + + static bool HasAnimationToScreen(const TransformPaintPropertyNode& node) { + return node.GetTransformCache().has_animation_to_screen(); + } }; TEST_F(GeometryMapperTransformCacheTest, All2dTranslations) { @@ -225,18 +227,51 @@ TransformationMatrix().Rotate3d(0, 45, 0)}); Check2dTranslationToRoot(t0(), 0, 0); Check2dTranslationToRoot(*t1, 1, 2); - auto to_screen = TransformationMatrix().Translate(1, 2).Rotate3d(0, 45, 0); - CheckPlaneRootSameAs2dTranslationRoot(*t2, to_screen, *t2, 0, 0); - to_screen = to_screen.Translate(7, 8); - CheckPlaneRootSameAs2dTranslationRoot(*t3, to_screen, *t2, 7, 8); + + auto t2_to_screen = TransformationMatrix().Translate(1, 2).Rotate3d(0, 45, 0); + CheckPlaneRootSameAs2dTranslationRoot(*t2, t2_to_screen, *t2, 0, 0); + auto t3_to_screen = t2_to_screen; + t3_to_screen.Translate(7, 8); + CheckPlaneRootSameAs2dTranslationRoot(*t3, t3_to_screen, *t2, 7, 8); + + auto* t2_screen_transform = GetScreenTransform(*t2); + ASSERT_TRUE(t2_screen_transform); + auto* t3_screen_transform = GetScreenTransform(*t3); + ASSERT_TRUE(t3_screen_transform); + + // UpdateScreenTransform should not reallocate screen_transform_. + UpdateScreenTransform(*t2); + EXPECT_TRUE(ScreenTransformUpdated(*t2)); + UpdateScreenTransform(*t3); + EXPECT_TRUE(ScreenTransformUpdated(*t3)); + EXPECT_EQ(t2_screen_transform, GetScreenTransform(*t2)); + EXPECT_EQ(t3_screen_transform, GetScreenTransform(*t3)); + + // Invalidating cache should invalidate screen_transform_ but not free it. + GeometryMapperTransformCache::ClearCache(); + t3->Update(*t2, TransformPaintPropertyNode::State{gfx::Vector2dF(28, 27)}); + EXPECT_FALSE(ScreenTransformUpdated(*t2)); + EXPECT_FALSE(ScreenTransformUpdated(*t3)); + EXPECT_EQ(t2_screen_transform, GetScreenTransform(*t2)); + EXPECT_EQ(t3_screen_transform, GetScreenTransform(*t3)); + + // Update screen transforms (by CheckPlaneRootSameAs2dTranslationRoot()). + // Screen transforms should be valid and have expected values. + CheckPlaneRootSameAs2dTranslationRoot(*t2, t2_to_screen, *t2, 0, 0); + t3_to_screen = t2_to_screen; + t3_to_screen.Translate(28, 27); + CheckPlaneRootSameAs2dTranslationRoot(*t3, t3_to_screen, *t2, 28, 27); + // The pointers should be also the same as before. + EXPECT_EQ(t2_screen_transform, GetScreenTransform(*t2)); + EXPECT_EQ(t3_screen_transform, GetScreenTransform(*t3)); // Change t2 back to a 2d translation. GeometryMapperTransformCache::ClearCache(); t2->Update(*t1, TransformPaintPropertyNode::State{gfx::Vector2dF(11, 12)}); Check2dTranslationToRoot(t0(), 0, 0); Check2dTranslationToRoot(*t1, 1, 2); - Check2dTranslationToRoot(*t2, 12, 14); - Check2dTranslationToRoot(*t3, 19, 22); + Check2dTranslationToRoot(*t2, 1 + 11, 2 + 12); + Check2dTranslationToRoot(*t3, 1 + 11 + 28, 2 + 12 + 27); } } // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 504445f..c10bd32 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2064,13 +2064,6 @@ origin_trial_feature_name: "SecurePaymentConfirmationOptOut", origin_trial_allows_third_party: true }, - // Relaxes the resident key requirement for SPC. This is necessary to ship - // SPC on Android, and will be enabled on all platforms for simplicity, - // with the assumption that desktop platforms will always create a - // resident key/discoverable credential. - { - name: "SecurePaymentConfirmationRelaxResidentKey", - }, { name: "SendBeaconThrowForBlobWithNonSimpleType", status: "stable",
diff --git a/third_party/blink/tools/blinkpy/common/base85.py b/third_party/blink/tools/blinkpy/common/base85.py deleted file mode 100644 index 7d57140..0000000 --- a/third_party/blink/tools/blinkpy/common/base85.py +++ /dev/null
@@ -1,43 +0,0 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -_BASE85_CHARACTERS = ('0123456789' - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - 'abcdefghijklmnopqrstuvwxyz' - '!#$%&()*+-;<=>?@^_`{|}~') - -# pylint: disable=invalid-name -_char_to_value = {} - - -def decode_base85(encoded_str): - """Decodes a base85 string. - - The input string length must be a multiple of 5, and the resultant - binary length is always a multiple of 4. - """ - if len(encoded_str) % 5 != 0: - raise ValueError('Input string length is not a multiple of 5; ' + - str(len(encoded_str))) - if not _char_to_value: - for i, ch in enumerate(_BASE85_CHARACTERS): - _char_to_value[ch] = i - - result = '' - i = 0 - while i < len(encoded_str): - acc = 0 - for _ in range(5): - ch = encoded_str[i] - if ch not in _char_to_value: - raise ValueError('Invalid base85 character; "{}"'.format(ch)) - new_acc = acc * 85 + _char_to_value[ch] - assert new_acc >= acc - acc = new_acc - i += 1 - for _ in range(4): - result += chr(acc >> 24) - acc = (acc & 0x00ffffff) << 8 - assert acc >= 0 - return result
diff --git a/third_party/blink/tools/blinkpy/common/base85_unittest.py b/third_party/blink/tools/blinkpy/common/base85_unittest.py deleted file mode 100644 index d701933..0000000 --- a/third_party/blink/tools/blinkpy/common/base85_unittest.py +++ /dev/null
@@ -1,34 +0,0 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import six -import unittest - -from blinkpy.common.base85 import decode_base85 - - -# (TODO(crbug/1218641) Remove this test entirely when we enable Python3. -# Python3 offers base64.b85decode() -class TestBase85(unittest.TestCase): - def test_decode(self): - if six.PY2: - self.assertEqual(decode_base85('cmV?d00001'), - 'x\x01\x03\x00\x00\x00\x00\x01') - - def test_decode_invalid_input(self): - if six.PY2: - self.assertRaises(ValueError, decode_base85, '1') - self.assertRaises(ValueError, decode_base85, '123456') - self.assertRaises(ValueError, decode_base85, ' 2345') - self.assertRaises(ValueError, decode_base85, '1234/') - - def test_decode_corners(self): - if six.PY2: - self.assertEqual(decode_base85(''), '') - self.assertEqual(decode_base85('00000'), '\x00\x00\x00\x00') - self.assertEqual(decode_base85('|NsC0'), '\xFF\xFF\xFF\xFF') - - # acc will be larger than 0xFFFFFFFF. Such input is invalid. - self.assertRaises(ValueError, decode_base85, '|NsC1') - self.assertRaises(ValueError, decode_base85, '~~~~~')
diff --git a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py index ca5fc62..14da214 100644 --- a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py +++ b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py
@@ -658,7 +658,7 @@ self.is_extra_result = True return - assert fs.exists(path), path + "does not exist" + assert fs.exists(path), path + " does not exist" if path.endswith('.txt'): try: content = fs.read_text_file(path)
diff --git a/third_party/blink/tools/blinkpy/common/config/builders.json b/third_party/blink/tools/blinkpy/common/config/builders.json index cd0f449..abb5b89 100644 --- a/third_party/blink/tools/blinkpy/common/config/builders.json +++ b/third_party/blink/tools/blinkpy/common/config/builders.json
@@ -254,17 +254,6 @@ "Android", "android_weblayer", "Release" ] }, - "android-weblayer-pie-x86-wpt-smoketest": { - "port_name": "android-android-pie", - "main": "chromium.android.fyi", - "specifiers": [ - "Android", "android_weblayer", "Release" - ], - "steps": { - "weblayer_shell_wpt (with patch, experimental)": {} - }, - "is_try_builder": true - }, "android-chrome-pie-x86-wpt-fyi-rel": { "port_name": "android-android-pie", "main": "chromium.android.fyi",
diff --git a/third_party/blink/tools/blinkpy/common/host.py b/third_party/blink/tools/blinkpy/common/host.py index 4b071fc..711d0e0 100644 --- a/third_party/blink/tools/blinkpy/common/host.py +++ b/third_party/blink/tools/blinkpy/common/host.py
@@ -47,9 +47,6 @@ self._git = None - # Everything below this line is WebKit-specific and belongs on a higher-level object. - self.results_fetcher = TestResultsFetcher() - # FIXME: Unfortunately Port objects are currently the central-dispatch objects of the NRWT world. # In order to instantiate a port correctly, we have to pass it at least an executive, user, git, and filesystem # so for now we just pass along the whole Host object. @@ -58,6 +55,7 @@ self.bb_agent = BBAgent(self) self.builders = BuilderList.load_default_builder_list(self.filesystem) + self.results_fetcher = TestResultsFetcher.from_host(self) def git(self, path=None): if path:
diff --git a/third_party/blink/tools/blinkpy/common/host_mock.py b/third_party/blink/tools/blinkpy/common/host_mock.py index 85f074a3..7f7d62c7 100644 --- a/third_party/blink/tools/blinkpy/common/host_mock.py +++ b/third_party/blink/tools/blinkpy/common/host_mock.py
@@ -114,7 +114,7 @@ 'is_try_builder': True, }, }) - self.results_fetcher = MockTestResultsFetcher(self.builders) + self.results_fetcher = MockTestResultsFetcher.from_host(self) def git(self, path=None): if path:
diff --git a/third_party/blink/tools/blinkpy/common/net/luci_auth.py b/third_party/blink/tools/blinkpy/common/net/luci_auth.py index 89374dc1..545b98d 100644 --- a/third_party/blink/tools/blinkpy/common/net/luci_auth.py +++ b/third_party/blink/tools/blinkpy/common/net/luci_auth.py
@@ -12,14 +12,21 @@ class LuciAuth(object): def __init__(self, host): self._host = host - finder = PathFinder(host.filesystem) + self._finder = PathFinder(host.filesystem) + + @property + def _luci_auth_executable(self): luci_auth_bin = ('luci-auth.bat' - if host.platform.is_win() else 'luci-auth') - self._luci_auth_path = host.filesystem.join(finder.depot_tools_base(), - luci_auth_bin) + if self._host.platform.is_win() else 'luci-auth') + depot_tools_base = self._finder.depot_tools_base() + if depot_tools_base: + return self._host.filesystem.join(depot_tools_base, luci_auth_bin) + # If `//third_party/depot_tools` is not found, try using `luci-auth` in + # the current `PATH`. + return luci_auth_bin def get_access_token(self): # ScriptError will be raised if luci-auth fails. output = self._host.executive.run_command( - [self._luci_auth_path, 'token']) + [self._luci_auth_executable, 'token']) return output.strip()
diff --git a/third_party/blink/tools/blinkpy/common/net/results_fetcher.py b/third_party/blink/tools/blinkpy/common/net/results_fetcher.py index 90601b7..a2eee309 100644 --- a/third_party/blink/tools/blinkpy/common/net/results_fetcher.py +++ b/third_party/blink/tools/blinkpy/common/net/results_fetcher.py
@@ -37,7 +37,7 @@ from blinkpy.common.memoized import memoized from blinkpy.common.net.luci_auth import LuciAuth -from blinkpy.common.net.web import Web +from blinkpy.common.net.rpc import ResultDBClient from blinkpy.common.net.web_test_results import WebTestResults from blinkpy.common.system.filesystem import FileSystem from blinkpy.web_tests.builder_list import BuilderList @@ -76,11 +76,16 @@ https://www.chromium.org/developers/the-json-test-results-format """ - def __init__(self, builders=None): - self.web = Web() + def __init__(self, web, luci_auth, builders=None): + self.web = web + self._resultdb_client = ResultDBClient(web, luci_auth) self.builders = builders or BuilderList.load_default_builder_list( FileSystem()) + @classmethod + def from_host(cls, host): + return cls(host.web, LuciAuth(host), host.builders) + def results_url(self, builder_name, build_number=None, step_name=None): """Returns a URL for one set of archived web test results. @@ -318,6 +323,39 @@ return None return WebTestResults.results_from_string(data) + def fetch_wpt_report_urls(self, *build_ids): + """Get a list of URLs pointing to a given build's wptreport artifacts. + + wptreports are a wptrunner log format used to store test results. + + The URLs look like: + https://results.usercontent.cr.dev/invocations/ \ + task-chromium-swarm.appspot.com-58590ed6228fd611/ \ + artifacts/wpt_reports_android_webview_01.json \ + ?token=AXsiX2kiOiIxNjQx... + + Arguments: + build_ids: One or more build IDs retrieved from Buildbucket. + + Returns: + A list of URLs, sorted by (product, shard index). Note that the URLs + contain a time-sensitive `token` query parameter required for + access. + """ + artifacts = self._resultdb_client.query_artifacts( + list(build_ids), { + 'followEdges': { + 'includedInvocations': True, + }, + }) + filename_pattern = re.compile(r'wpt_reports_(.*)\.json') + url_to_index = {} + for artifact in artifacts: + filename_match = filename_pattern.match(artifact['artifactId']) + if filename_match: + url_to_index[artifact['fetchUrl']] = filename_match[0] + return sorted(url_to_index, key=url_to_index.get) + def filter_latest_builds(builds): """Filters Build objects to include only the latest for each builder.
diff --git a/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py b/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py index 1b516fc..b19ac8a 100644 --- a/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py +++ b/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py
@@ -35,8 +35,8 @@ # TODO(qyearsley): To be consistent with other fake ("mock") classes, this # could be changed so it's not a subclass of TestResultsFetcher. class MockTestResultsFetcher(TestResultsFetcher): - def __init__(self, builders=None): - super(MockTestResultsFetcher, self).__init__(builders) + def __init__(self, web, luci_auth, builders=None): + super(MockTestResultsFetcher, self).__init__(web, luci_auth, builders) self._canned_results = {} self._canned_artifacts_resultdb = {} self._canned_retry_summary_json = {}
diff --git a/third_party/blink/tools/blinkpy/common/net/results_fetcher_test.py b/third_party/blink/tools/blinkpy/common/net/results_fetcher_test.py index 3811ae70..bd51325 100644 --- a/third_party/blink/tools/blinkpy/common/net/results_fetcher_test.py +++ b/third_party/blink/tools/blinkpy/common/net/results_fetcher_test.py
@@ -30,58 +30,57 @@ import logging import unittest +from blinkpy.common.host_mock import MockHost from blinkpy.common.net.results_fetcher import TestResultsFetcher, Build, filter_latest_builds -from blinkpy.common.net.web_mock import MockWeb +from blinkpy.common.net.web_mock import MockWeb, MockResponse from blinkpy.common.system.log_testing import LoggingTestCase class BuilderTest(LoggingTestCase): def setUp(self): self.set_logging_level(logging.DEBUG) + self.fetcher = TestResultsFetcher.from_host(MockHost()) def test_results_url_no_build_number(self): self.assertEqual( - TestResultsFetcher().results_url('Test Builder'), + self.fetcher.results_url('Test Builder'), 'https://test-results.appspot.com/data/layout_results/Test_Builder/results/layout-test-results' ) @unittest.skip('crbug/1234319 disable to unblock the CI') def test_results_url_with_build_number(self): self.assertEqual( - TestResultsFetcher().results_url('Test Builder', 10), + self.fetcher.results_url('Test Builder', 10), 'https://test-results.appspot.com/data/layout_results/Test_Builder/10/layout-test-results' ) def test_results_url_with_build_number_step_name(self): self.assertEqual( - TestResultsFetcher().results_url('Test Builder', 10, - 'blink_web_tests (with patch)'), + self.fetcher.results_url('Test Builder', 10, + 'blink_web_tests (with patch)'), 'https://test-results.appspot.com/data/layout_results/Test_Builder' '/10/blink_web_tests%20%28with%20patch%29/layout-test-results') def test_results_url_with_non_numeric_build_number(self): with self.assertRaisesRegexp(AssertionError, 'expected numeric build number'): - TestResultsFetcher().results_url('Test Builder', 'ba5eba11') + self.fetcher.results_url('Test Builder', 'ba5eba11') def test_builder_results_url_base(self): self.assertEqual( - TestResultsFetcher().builder_results_url_base( - 'WebKit Mac10.8 (dbg)'), + self.fetcher.builder_results_url_base('WebKit Mac10.8 (dbg)'), 'https://test-results.appspot.com/data/layout_results/WebKit_Mac10_8__dbg_' ) def test_accumulated_results_url(self): self.assertEqual( - TestResultsFetcher().accumulated_results_url_base( - 'WebKit Mac10.8 (dbg)'), + self.fetcher.accumulated_results_url_base('WebKit Mac10.8 (dbg)'), 'https://test-results.appspot.com/data/layout_results/WebKit_Mac10_8__dbg_/results/layout-test-results' ) def test_fetch_web_test_results_with_no_results_fetched(self): - fetcher = TestResultsFetcher() - fetcher.web = MockWeb() - results = fetcher.fetch_web_test_results(fetcher.results_url('B')) + results = self.fetcher.fetch_web_test_results( + self.fetcher.results_url('B')) self.assertIsNone(results) self.assertLog([ 'DEBUG: Got 404 response from:\n' @@ -89,8 +88,7 @@ ]) def test_fetch_results_with_weird_step_name(self): - fetcher = TestResultsFetcher() - fetcher.web = MockWeb( + self.fetcher.web = MockWeb( urls={ 'https://test-results.appspot.com/testfile?buildnumber=123&' 'callback=ADD_RESULTS&builder=builder&name=full_results.json': @@ -108,36 +106,31 @@ }).encode('utf8', 'replace') }) step_name = 'blink_web_tests on Intel GPU (with patch)' - results = fetcher.fetch_results(Build('builder', 123), False, - step_name) + results = self.fetcher.fetch_results(Build('builder', 123), False, + step_name) self.assertEqual( results._results, # pylint: disable=protected-access {'passed': True}) self.assertLog([]) def test_fetch_results_without_build_number(self): - fetcher = TestResultsFetcher() - self.assertIsNone(fetcher.fetch_results(Build('builder', None))) + self.assertIsNone(self.fetcher.fetch_results(Build('builder', None))) def test_fetch_webdriver_results_without_build_number(self): - fetcher = TestResultsFetcher() self.assertIsNone( - fetcher.fetch_webdriver_test_results( - Build('builder', None), 'bar')) + self.fetcher.fetch_webdriver_test_results(Build('builder', None), + 'bar')) self.assertLog( ['DEBUG: Builder name or build number or master is None\n']) def test_fetch_webdriver_results_without_master(self): - fetcher = TestResultsFetcher() self.assertIsNone( - fetcher.fetch_webdriver_test_results(Build('builder', 1), '')) + self.fetcher.fetch_webdriver_test_results(Build('builder', 1), '')) self.assertLog( ['DEBUG: Builder name or build number or master is None\n']) def test_fetch_webdriver_test_results_with_no_results(self): - fetcher = TestResultsFetcher() - fetcher.web = MockWeb() - results = fetcher.fetch_webdriver_test_results( + results = self.fetcher.fetch_webdriver_test_results( Build('bar-rel', 123), 'foo.chrome') self.assertIsNone(results) self.assertLog([ @@ -148,8 +141,7 @@ ]) def test_fetch_webdriver_results_success(self): - fetcher = TestResultsFetcher() - fetcher.web = MockWeb( + self.fetcher.web = MockWeb( urls={ 'https://test-results.appspot.com/testfile?buildnumber=123&' 'master=foo.chrome&builder=bar-rel&' @@ -159,7 +151,7 @@ 'passed': True }).encode('utf8', 'replace'), }) - results = fetcher.fetch_webdriver_test_results( + results = self.fetcher.fetch_webdriver_test_results( Build('bar-rel', 123), 'foo.chrome') self.assertEqual( results._results, # pylint: disable=protected-access @@ -167,20 +159,66 @@ self.assertLog([]) def test_get_full_builder_url(self): - fetcher = TestResultsFetcher() self.assertEqual( - fetcher.get_full_builder_url('https://storage.googleapis.com', - 'foo bar'), + self.fetcher.get_full_builder_url('https://storage.googleapis.com', + 'foo bar'), 'https://storage.googleapis.com/foo_bar') self.assertEqual( - fetcher.get_full_builder_url('https://storage.googleapis.com', - 'foo.bar'), + self.fetcher.get_full_builder_url('https://storage.googleapis.com', + 'foo.bar'), 'https://storage.googleapis.com/foo_bar') self.assertEqual( - fetcher.get_full_builder_url('https://storage.googleapis.com', - 'foo(bar)'), + self.fetcher.get_full_builder_url('https://storage.googleapis.com', + 'foo(bar)'), 'https://storage.googleapis.com/foo_bar_') + def test_fetch_wpt_report_urls(self): + res = { + 'artifacts': [{ + 'name': 'report1', + 'artifactId': 'wpt_reports_dada.json', + 'fetchUrl': 'https://a.b.c/report1.json', + 'sizeBytes': '8472164' + }, { + 'name': 'report2', + 'artifactId': 'wpt_reports_dada.json', + 'fetchUrl': 'https://a.b.c/report2.json', + 'sizeBytes': '8455564' + }, { + 'name': 'other', + 'artifactId': 'other_dada.json', + 'fetchUrl': 'https://a.b.c/other.json', + 'sizeBytes': '9845' + }] + } + self.fetcher.web.responses.append({ + 'status_code': 200, + 'body': json.dumps(res).encode(), + }) + self.assertEqual( + self.fetcher.fetch_wpt_report_urls("31415926535"), + ['https://a.b.c/report1.json', 'https://a.b.c/report2.json']) + + res = { + 'artifacts': [{ + 'name': 'other', + 'artifactId': 'other_dada.json', + 'fetchUrl': 'https://a.b.c/other.json', + 'sizeBytes': '9845' + }] + } + self.fetcher.web.responses.append({ + 'status_code': 200, + 'body': json.dumps(res).encode(), + }) + self.assertEqual(self.fetcher.fetch_wpt_report_urls("31415926535"), []) + + self.fetcher.web.responses.append({ + 'status_code': 200, + 'body': b'{}', + }) + self.assertEqual(self.fetcher.fetch_wpt_report_urls("31415926535"), []) + class TestResultsFetcherHelperFunctionTest(unittest.TestCase): def test_filter_latest_jobs_empty(self):
diff --git a/third_party/blink/tools/blinkpy/common/net/rpc.py b/third_party/blink/tools/blinkpy/common/net/rpc.py index d28a4f3..14699a6 100644 --- a/third_party/blink/tools/blinkpy/common/net/rpc.py +++ b/third_party/blink/tools/blinkpy/common/net/rpc.py
@@ -26,50 +26,123 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import logging import json +from urllib.parse import urlunsplit + import six -from blinkpy.common.net.luci_auth import LuciAuth +from blinkpy.common.memoized import memoized + +_log = logging.getLogger(__name__) # These characters always appear at the beginning of the RPC response. -SEARCHBUILDS_RESPONSE_PREFIX = b")]}'" +RESPONSE_PREFIX = b")]}'" -class Rpc(object): - def __init__(self, host): - self._host = host +class BaseRPC: + """pRPC client. - def luci_rpc(self, url, data): + A pRPC server handles HTTP POST requests at: + /prpc/<service>/<method> + + See Also: + go/prpc: Describes the provisional RPC protocol. + """ + + def __init__(self, web, luci_auth, hostname, service): + self._web = web + self._luci_auth = luci_auth + self._hostname = hostname + self._service = service + + @memoized + def _make_url(self, method): + return urlunsplit(( + 'https', + self._hostname, + '/prpc/%s/%s' % (self._service, method), + '', # No query params + '', # No fragment + )) + + def luci_rpc(self, method, data): """Fetches json data through Luci RPCs Args: - url: url for the rpc call + method: Method for the RPC call. data: the request body in json format Returns: On success: Returns the json representation of the response. Otherwise: None """ - luci_token = LuciAuth(self._host).get_access_token() + luci_token = self._luci_auth.get_access_token() headers = { 'Authorization': 'Bearer ' + luci_token, 'Accept': 'application/json', 'Content-Type': 'application/json', } - if six.PY3: - body = json.dumps(data).encode("utf-8") - else: - body = json.dumps(data) - response = self._host.web.request('POST', url, data=body, headers=headers) + url = self._make_url(method) + body = six.ensure_binary(json.dumps(data, separators=(',', ':'))) + response = self._web.request('POST', url, data=body, headers=headers) if response.getcode() == 200: response_body = response.read() - if response_body.startswith(SEARCHBUILDS_RESPONSE_PREFIX): - response_body = response_body[len(SEARCHBUILDS_RESPONSE_PREFIX - ):] + if response_body.startswith(RESPONSE_PREFIX): + response_body = response_body[len(RESPONSE_PREFIX):] return json.loads(response_body) - _log.error( - "RPC request failed. Status=%s, url=%s" % - (response.status, url)) + _log.error("RPC request failed. Status=%s, url=%s", response.status, + url) _log.debug("Full RPC response: %s" % str(response)) return None + + def luci_rpc_paginated(self, method, data, field, count=1000): + """Retrieve entities from a pRPC endpoint with paginated results. + + Some methods receive a response token like: + {..., "pageSize": ..., "pageToken": ...} + + and reply with a payload like: + {<repeated field>: [<entity1>, ...], "nextPageToken": ...} + + This method automatically makes a sequence of requests needed to gather + the requested number of entities. Generally, the payload should not + change between requests. + + See Also: + https://source.chromium.org/chromium/infra/infra/+/master:go/src/go.chromium.org/luci/buildbucket/proto/builds_service.proto + https://source.chromium.org/chromium/infra/infra/+/master:go/src/go.chromium.org/luci/resultdb/proto/v1/resultdb.proto + """ + entities = [] + while data.get('pageToken', True) and count > 0: + response = self.luci_rpc(method, data) + if not isinstance(response, dict): + break + new_entities = response.get(field) or [] + entities.extend(new_entities) + count -= len(new_entities) + data['pageToken'] = response.get('nextPageToken') + return entities[:count] + + +class ResultDBClient(BaseRPC): + def __init__(self, + web, + luci_auth, + hostname='results.api.cr.dev', + service='luci.resultdb.v1.ResultDB'): + super().__init__(web, luci_auth, hostname, service) + + def _get_invocations(self, build_ids): + return ['invocations/build-%s' % build_id for build_id in build_ids] + + def query_artifacts(self, build_ids, predicate, count=1000): + request = { + 'invocations': self._get_invocations(build_ids), + 'predicate': predicate, + } + return self.luci_rpc_paginated('QueryArtifacts', + request, + 'artifacts', + count=count)
diff --git a/third_party/blink/tools/blinkpy/common/net/rpc_mock.py b/third_party/blink/tools/blinkpy/common/net/rpc_mock.py deleted file mode 100644 index 4c578de..0000000 --- a/third_party/blink/tools/blinkpy/common/net/rpc_mock.py +++ /dev/null
@@ -1,38 +0,0 @@ -# Copyright (C) 2011 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -class MockRpc(object): - def __init__(self, host): # pylint: disable=unused-argument - self._response = None - - def luci_rpc(self, url, data): # pylint: disable=unused-argument - return self._response - - def set_response(self, data): - self._response = data
diff --git a/third_party/blink/tools/blinkpy/common/pretty_diff.py b/third_party/blink/tools/blinkpy/common/pretty_diff.py index 84d549f..fab4ae2 100644 --- a/third_party/blink/tools/blinkpy/common/pretty_diff.py +++ b/third_party/blink/tools/blinkpy/common/pretty_diff.py
@@ -21,8 +21,6 @@ else: import html as cgi -from blinkpy.common.base85 import decode_base85 - # The style below is meant to be similar to PolyGerrit. _LEADING_HTML = """<!DOCTYPE html> <meta charset="UTF-8"> @@ -540,8 +538,5 @@ 'letter:{}, actual:{}, line:"{}"'.format( line_length * 5, (len(line) - 1) * 4, line)) - if six.PY2: - bin_data += decode_base85(line[1:])[0:line_length] - else: - bin_data += base64.b85decode(line[1:].encode('utf8')) + bin_data += base64.b85decode(line[1:].encode('utf8')) raise ValueError('No blank line terminating a binary hunk.')
diff --git a/third_party/blink/tools/blinkpy/common/system/filesystem.py b/third_party/blink/tools/blinkpy/common/system/filesystem.py index 6fdf0cc9..8d7bc93 100644 --- a/third_party/blink/tools/blinkpy/common/system/filesystem.py +++ b/third_party/blink/tools/blinkpy/common/system/filesystem.py
@@ -334,7 +334,7 @@ except exceptions.WindowsError: time.sleep(sleep_interval) retry_timeout_sec -= sleep_interval - if retry_timeout_sec < 0 and not retry: + if retry_timeout_sec < 0 or not retry: raise def rmtree(self, path, ignore_errors=True, onerror=None):
diff --git a/third_party/blink/tools/blinkpy/style/checkers/python.py b/third_party/blink/tools/blinkpy/style/checkers/python.py index cbefb1b..84a96367 100644 --- a/third_party/blink/tools/blinkpy/style/checkers/python.py +++ b/third_party/blink/tools/blinkpy/style/checkers/python.py
@@ -64,7 +64,7 @@ ]) return executive.run_command([ sys.executable, - finder.path_from_depot_tools_base('pylint'), + finder.path_from_depot_tools_base('pylint-1.5'), '--output-format=parseable', '--rcfile=' + finder.path_from_blink_tools('blinkpy', 'pylintrc'), path,
diff --git a/third_party/blink/tools/blinkpy/tool/commands/copy_existing_baselines.py b/third_party/blink/tools/blinkpy/tool/commands/copy_existing_baselines.py index f42c65a..66173e9 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/copy_existing_baselines.py +++ b/third_party/blink/tools/blinkpy/tool/commands/copy_existing_baselines.py
@@ -121,17 +121,17 @@ "immediate predecessors" of the given baseline path. """ port_names = self._tool.port_factory.all_port_names() - immediate_predecessors = [] + immediate_predecessors = set() for port_name in port_names: port = self._tool.port_factory.get(port_name) baseline_search_path = port.baseline_search_path() try: index = baseline_search_path.index(path_to_rebaseline) if index: - immediate_predecessors.append( + immediate_predecessors.add( self._tool.filesystem.basename( baseline_search_path[index - 1])) except ValueError: # baseline_search_path.index() throws a ValueError if the item isn't in the list. pass - return immediate_predecessors + return list(immediate_predecessors)
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py index 521a5e8..1daba38 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py
@@ -602,16 +602,16 @@ def _run_in_parallel(self, commands): if not commands: - return {} + return [] command_results = self._tool.executive.run_in_parallel(commands) for _, _, stderr in command_results: if stderr: - _log.error(stderr) + lines = stderr.decode("utf-8", "ignore").splitlines() + for line in lines: + print(line) - change_set = self._extract_expectation_line_changes(command_results) - - return change_set.lines_to_remove + return command_results def rebaseline(self, options, test_baseline_set): """Fetches new baselines and removes related test expectation lines. @@ -637,7 +637,10 @@ test_baseline_set, options) lines_to_remove = {} self._run_in_parallel(copy_baseline_commands) - lines_to_remove = self._run_in_parallel(rebaseline_commands) + + command_results = self._run_in_parallel(rebaseline_commands) + change_set = self._extract_expectation_line_changes(command_results) + lines_to_remove = change_set.lines_to_remove for test in extra_lines_to_remove: if test in lines_to_remove: lines_to_remove[test] = (
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py index 1ebca985..2560a618a 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py
@@ -184,11 +184,15 @@ _log.info('Aborting.') return 1 options.fill_missing = self._tool.user.confirm( - 'Would you like to try to fill in missing results with\n' - 'available results?\n' - 'Note: This will generally yield correct results\n' - 'as long as the results are not platform-specific.', + 'Would you like to try to fill in missing results with' + ' available results?\n' + 'Note: This is generally not suggested unless the results' + ' are platform agnostic.', default=self._tool.user.DEFAULT_NO) + if not options.fill_missing: + _log.info( + 'Please rebaseline again for builders with no results later.' + ) if options.test_name_file: test_baseline_set = self._make_test_baseline_set_from_file(
diff --git a/third_party/blink/tools/blinkpy/w3c/test_importer.py b/third_party/blink/tools/blinkpy/w3c/test_importer.py index 4e32e8e..0c49ac9 100644 --- a/third_party/blink/tools/blinkpy/w3c/test_importer.py +++ b/third_party/blink/tools/blinkpy/w3c/test_importer.py
@@ -178,15 +178,14 @@ _log.info('Only manifest or expectations was updated; skipping the import.') return 0 - with self._expectations_updater.prepare_smoke_tests(self.chromium_git): - self._commit_changes(commit_message) - _log.info('Changes imported and committed.') + self._commit_changes(commit_message) + _log.info('Changes imported and committed.') - if not options.auto_upload and not options.auto_update: - return 0 + if not options.auto_upload and not options.auto_update: + return 0 - self._upload_cl() - _log.info('Issue: %s', self.git_cl.run(['issue']).strip()) + self._upload_cl() + _log.info('Issue: %s', self.git_cl.run(['issue']).strip()) if not self.update_expectations_for_cl(): return 1
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py index 4ed1f94d..0d39de86 100644 --- a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py +++ b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py
@@ -1000,47 +1000,6 @@ wont_fix_file_content) return line_dict - @contextlib.contextmanager - def prepare_smoke_tests(self, chromium_git): - """List test cases that should be run by the smoke test builder - - Add new and modified test cases to WPT_SMOKE_TESTS_FILE, - builder android-weblayer-pie-x86-wpt-smoketest will run those - tests. wpt-importer will generate initial expectations for weblayer - based on the result. Save and restore WPT_SMOKE_TESTS_FILE as - necessary. - """ - _log.info('Backup file WPTSmokeTestCases.') - temp_dir = tempfile.gettempdir() - base_path = os.path.basename(WPT_SMOKE_TESTS_FILE) - self._saved_test_cases_file = os.path.join(temp_dir, base_path) - shutil.copyfile(WPT_SMOKE_TESTS_FILE, self._saved_test_cases_file) - tests = (self._list_add_files() - + self._list_modified_files()) - - manifest_path = os.path.join( - self.finder.web_tests_dir(), "external", BASE_MANIFEST_NAME) - manifest = WPTManifest(self.host, manifest_path) - with open(WPT_SMOKE_TESTS_FILE, 'w') as out_file: - _log.info('Test cases to run on smoke test builder:') - prelen = len('external/wpt/') - for test in sorted(tests): - if test.startswith('external/wpt/') \ - and manifest.is_test_file(test[prelen:]): - # path should be the relative path of the test case to - # out/Release dir, as that will be same as that on swarming - # infra. We use path instead of the test case name, because - # that is needed to correctly run cases in js files - path = '../../third_party/blink/web_tests/' + test - _log.info(' ' + path) - out_file.write(path + '\n') - try: - yield - finally: - _log.info('Restore file WPTSmokeTestCases.') - shutil.copyfile(self._saved_test_cases_file, WPT_SMOKE_TESTS_FILE) - chromium_git.commit_locally_with_message('Restore WPTSmokeTestCases') - def skip_slow_timeout_tests(self, port): """Skip any Slow and Timeout tests found in TestExpectations. """
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py index 6850742..84e583e 100644 --- a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py +++ b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py
@@ -9,8 +9,6 @@ from blinkpy.common.net.git_cl import TryJobStatus from blinkpy.common.net.git_cl_mock import MockGitCL from blinkpy.common.net.results_fetcher import Build -from blinkpy.common.net.results_fetcher_mock import ( - MockTestResultsFetcher, BuilderStep) from blinkpy.common.net.web_test_results import WebTestResult, WebTestResults from blinkpy.common.path_finder import RELATIVE_WEB_TESTS from blinkpy.common.system.executive import ScriptError @@ -216,7 +214,6 @@ def test_get_failing_results_dict_no_results(self): host = self.mock_host() - host.results_fetcher = MockTestResultsFetcher() host.results_fetcher.set_results_to_resultdb(Build('MOCK Try Mac10.10', 123), None) updater = WPTExpectationsUpdater(host) self.assertFalse(
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py b/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py index cc6e9e2e..09a5aff8 100644 --- a/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py +++ b/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py
@@ -13,7 +13,8 @@ import six import tempfile -from blinkpy.common.net.rpc import Rpc +from blinkpy.common.net.luci_auth import LuciAuth +from blinkpy.common.net.rpc import BaseRPC from blinkpy.common.system.log_utils import configure_logging _log = logging.getLogger(__name__) @@ -22,7 +23,9 @@ class WptReportUploader(object): def __init__(self, host): self._host = host - self._rpc = Rpc(host) + self._rpc = BaseRPC(host.web, LuciAuth(host), + 'cr-buildbucket.appspot.com', + 'buildbucket.v2.Builds') self.options = None self._dry_run = False configure_logging(logging_level=logging.INFO, include_time=True) @@ -51,7 +54,8 @@ build = self.fetch_latest_complete_build(*builder) if build: _log.info("Find latest completed build %d" % build.get("number")) - urls = self.fetch_wpt_report_urls(build.get("id")) + urls = self._host.results_fetcher.fetch_wpt_report_urls( + build["id"]) for url in urls: _log.info("Fetching wpt report from %s" % url) res = self._host.web.request("GET", url) @@ -72,60 +76,6 @@ return rv - def fetch_wpt_report_urls(self, build_id): - """Get a list of fetchUrl for wpt-report from given build. - - This uses the QueryArtifacts rpc format specified in - https://source.chromium.org/chromium/infra/infra/+/main:go/src/go.chromium.org/luci/resultdb/proto/v1/resultdb.proto - - The response is a list of dicts of the following form: - - { - 'artifacts': [ - { - 'name': 'some name', - 'artifactId': 'wpt_reports_dada.json', - 'fetchUrl': 'https://something...', - 'fetchUrlExpiration': 'some future time', - 'sizeBytes': '8472164' - }, - ... more artifacts - ] - } - - An example of the url as below: - https://results.usercontent.cr.dev/invocations/ \ - task-chromium-swarm.appspot.com-58590ed6228fd611/ \ - artifacts/wpt_reports_android_webview_01.json? \ - token=AXsiX2kiOiIxNjQxNzYyNzU0MDkxIiwiX3giOiIzNjAwMDAwIn24WM72ciT_oYJG0hGx6MShOXu8SyVxfB_fw - - Returns a sorted(based on shard number) list of URLs for wpt report - """ - - invocation = "invocations/build-%s" % build_id - data = { - "invocations": [invocation], - "predicate": { - "followEdges": {"includedInvocations": True} - } - } - url = 'https://results.api.cr.dev/prpc/luci.resultdb.v1.ResultDB/QueryArtifacts' - res = self._rpc.luci_rpc(url, data) - artifacts = res.get("artifacts") if res else None - if not artifacts: - return [] - - rv = [] - for artifact in artifacts: - if artifact.get("artifactId").startswith("wpt_reports"): - rv.append(artifact.get("fetchUrl")) - - if len(rv) > 0: - pos = rv[0].find("wpt_reports") - rv.sort(key=lambda x: x[pos:]) - - return rv - def fetch_latest_complete_build(self, project, bucket, builder_name): """Gets latest successful build from a CI builder. @@ -159,8 +109,7 @@ "fields": "builds.*.builder.builder,builds.*.number,builds.*.status,builds.*.id", "pageSize": 10 } - url = 'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds/SearchBuilds' - raw_results_json = self._rpc.luci_rpc(url, data) + raw_results_json = self._rpc.luci_rpc('SearchBuilds', data) if 'builds' not in raw_results_json: return None builds = raw_results_json['builds']
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py index 576201a1..1d0da91 100644 --- a/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py +++ b/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py
@@ -2,8 +2,9 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import json + from blinkpy.common.host_mock import MockHost -from blinkpy.common.net.rpc_mock import MockRpc from blinkpy.common.system.log_testing import LoggingTestCase from blinkpy.w3c.wpt_uploader import WptReportUploader @@ -13,41 +14,10 @@ super(WptReportUploaderTest, self).setUp() self.host = MockHost() - def test_fetch_wpt_report_urls(self): - uploader = WptReportUploader(self.host) - uploader._rpc = MockRpc(self.host) - res = {'artifacts': [{'name': 'report1', - 'artifactId': 'wpt_reports_dada.json', - 'fetchUrl': 'https://a.b.c/report1.json', - 'sizeBytes': '8472164'}, - {'name': 'report2', - 'artifactId': 'wpt_reports_dada.json', - 'fetchUrl': 'https://a.b.c/report2.json', - 'sizeBytes': '8455564'}, - {'name': 'other', - 'artifactId': 'other_dada.json', - 'fetchUrl': 'https://a.b.c/other.json', - 'sizeBytes': '9845'}]} - uploader._rpc.set_response(res) - self.assertEqual(uploader.fetch_wpt_report_urls("31415926535"), - ['https://a.b.c/report1.json', - 'https://a.b.c/report2.json']) - - res = {'artifacts': [{'name': 'other', - 'artifactId': 'other_dada.json', - 'fetchUrl': 'https://a.b.c/other.json', - 'sizeBytes': '9845'}]} - uploader._rpc.set_response(res) - self.assertEqual(uploader.fetch_wpt_report_urls("31415926535"), []) - - res = {} - uploader._rpc.set_response(res) - self.assertEqual(uploader.fetch_wpt_report_urls("31415926535"), []) - def test_fetch_latest_complete_build(self): uploader = WptReportUploader(self.host) - uploader._rpc = MockRpc(self.host) builder = ("chromium", "ci", "test_builder") + expected = {"id": "31415926535", "builder": {"builder": "test_builder"}, "status": "SUCCESS", @@ -61,12 +31,22 @@ "builder": {"builder": "test_builder"}, "status": "SUCCESS", "number": "98"}]} - uploader._rpc.set_response(res) + self.host.results_fetcher.web.responses.append({ + 'status_code': + 200, + 'body': + json.dumps(res).encode(), + }) build = uploader.fetch_latest_complete_build(*builder) self.assertEqual(build, expected) res = {"builds": []} - uploader._rpc.set_response(res) + self.host.results_fetcher.web.responses.append({ + 'status_code': + 200, + 'body': + json.dumps(res).encode(), + }) build = uploader.fetch_latest_complete_build(*builder) self.assertIsNone(build)
diff --git a/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py b/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py index 51f280c6..38e5ad5d 100644 --- a/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py +++ b/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py
@@ -209,8 +209,8 @@ try: self._remove_log_files(self._output_dir, log_prefix) except OSError: - _log.warning('Failed to remove old %s %s files', self._name, - log_prefix) + _log.exception('Failed to remove old %s %s files', self._name, + log_prefix) def _spawn_process(self): _log.debug('Starting %s server, cmd="%s"', self._name, self._start_cmd)
diff --git a/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility b/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility index 7d0478e..d13d2173 100644 --- a/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility +++ b/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility
@@ -27,10 +27,10 @@ # Failures # Too few events and dirty objects marked: -fast/forms/calendar-picker/date-picker-ax.html [ Pass Failure ] -fast/forms/month/month-picker-ax.html [ Pass Failure ] +fast/forms/calendar-picker/date-picker-ax.html [ Failure Pass ] +fast/forms/month/month-picker-ax.html [ Failure Pass ] # isUseCounted() difference: -virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-non-ad-followed-by-ad.html [ Pass Failure ] +virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-non-ad-followed-by-ad.html [ Failure Pass ] # ax_position.h#467 -- IsIgnored(): external/wpt/fullscreen/crashtests/chrome-1312699.html [ Crash ] http/tests/devtools/console/console-format.js [ Crash ] @@ -39,9 +39,9 @@ media/video-controls-attribute-fullscreen.html [ Crash ] media/autoplay-muted.html [ Crash ] # Unknown cause: -virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-ad-fixed-position.html [ Pass Failure ] -virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-image-ad-fixed-position.html [ Pass Failure ] -external/wpt/css/css-transitions/transition-base-response-002.html [ Pass Failure ] +virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-ad-fixed-position.html [ Failure Pass ] +virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-image-ad-fixed-position.html [ Failure Pass ] +external/wpt/css/css-transitions/transition-base-response-002.html [ Failure Pass ] # Timeouts fast/loader/iframe-navigation-stealing-focus.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index cefdd11..3d14be26 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -153,6 +153,7 @@ crbug.com/1339293 [ Linux ] media/controls/rotated-video-has-right-panel-width.html [ Failure Pass ] crbug.com/1339293 [ Linux ] media/media-controls-overflow-hidden.html [ Failure Pass ] crbug.com/1339293 [ Linux ] external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/029.html [ Failure Pass ] +crbug.com/1351106 [ Linux ] fast/frames/invalid-cols-rows-value.html [ Failure Pass ] # ====== Timed HTML parser budget tests to here ======================== @@ -1030,16 +1031,17 @@ crbug.com/1250666 crbug.com/1286944 [ Mac ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/valid-image-after-load.https.html [ Failure Pass Timeout ] crbug.com/1250666 crbug.com/1286944 [ Mac ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/valid-image-before-load.https.html [ Failure Pass Timeout ] crbug.com/1339051 [ Linux ] virtual/off-main-thread-css-paint/http/tests/csspaint/shadow-scale-with-page-zoom.html [ Failure ] -crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-roundRect.https.html [ Failure ] +crbug.com/1299442 [ Mac ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-roundRect.https.html [ Failure ] crbug.com/1299442 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-composite.https.html [ Failure ] crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-tiled-001.https.html [ Failure ] -crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-010.https.html [ Failure ] +crbug.com/1299442 [ Mac ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-010.https.html [ Failure ] crbug.com/1299442 [ Mac ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-interpolation-004.https.html [ Failure ] crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-paint-error.https.html [ Failure ] crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-002.https.html [ Failure ] crbug.com/1299442 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-006.https.html [ Failure ] crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-006.https.html [ Failure ] crbug.com/1299442 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/background-image-multiple.https.html [ Failure ] +crbug.com/1299442 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-018.https.html [ Failure ] # ====== Paint team owned tests to here ====== @@ -1480,13 +1482,6 @@ # These require css-align-3 positional keywords that Blink doesn't yet support for flexbox. crbug.com/1011718 external/wpt/css/css-flexbox/flexbox-safe-overflow-position-001.html [ Failure ] -# We don't support requesting flex line breaks and it is not clear that we should. -# See https://lists.w3.org/Archives/Public/www-style/2015May/0065.html -crbug.com/473481 external/wpt/css/css-flexbox/flexbox-break-request-horiz-001a.html [ Failure ] -crbug.com/473481 external/wpt/css/css-flexbox/flexbox-break-request-horiz-001b.html [ Failure ] -crbug.com/473481 external/wpt/css/css-flexbox/flexbox-break-request-vert-001a.html [ Failure ] -crbug.com/473481 external/wpt/css/css-flexbox/flexbox-break-request-vert-001b.html [ Failure ] - # We don't currently support visibility: collapse in flexbox crbug.com/336604 external/wpt/css/css-flexbox/flexbox-collapsed-item-baseline-001.html [ Failure ] crbug.com/336604 external/wpt/css/css-flexbox/flexbox-collapsed-item-horiz-001.html [ Failure ] @@ -1964,6 +1959,9 @@ crbug.com/1035708 external/wpt/css/css-pseudo/target-text-dynamic-002.html [ Failure ] crbug.com/1035708 external/wpt/css/css-pseudo/target-text-dynamic-003.html [ Failure ] crbug.com/1035708 external/wpt/css/css-pseudo/target-text-dynamic-004.html [ Failure ] +crbug.com/1147859 external/wpt/css/css-pseudo/highlight-currentcolor-root-implicit-default-001.html [ Failure ] +crbug.com/1350469 external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-001.html [ Failure ] +crbug.com/1350469 external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-002.html [ Failure ] # CSS highlight painting (HighlightOverlayPainting) crbug.com/1147859 [ Mac ] external/wpt/css/css-highlight-api/painting/custom-highlight-painting-text-decoration-001.html [ Failure ] @@ -3202,6 +3200,7 @@ crbug.com/27659 external/wpt/css/css-ruby/ruby-text-collapse.html [ Failure ] crbug.com/27659 external/wpt/css/css-ruby/ruby-whitespace-001.html [ Failure ] crbug.com/27659 external/wpt/css/css-ruby/ruby-whitespace-002.html [ Failure ] +crbug.com/27659 external/wpt/css/css-ruby/rbc-rtc-basic-001.html [ Failure ] crbug.com/1223955 external/wpt/css/css-ruby/nested-ruby-pairing-001.html [ Failure ] crbug.com/1223955 external/wpt/css/css-ruby/ruby-autohide-001.html [ Failure ] @@ -3366,10 +3365,6 @@ crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 external/wpt/css/css-ruby/rbc-rtc-basic-001.html [ Failure ] -crbug.com/626703 [ Mac11-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-022.html [ Failure ] -crbug.com/626703 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-018.https.html [ Failure ] -crbug.com/626703 external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html [ Failure ] crbug.com/626703 external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml [ Crash ] crbug.com/626703 [ Linux ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] crbug.com/626703 [ Mac10.15 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] @@ -3379,22 +3374,7 @@ crbug.com/626703 [ Mac12-arm64 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] crbug.com/626703 [ Win11 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] crbug.com/626703 [ Win10.20h2 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash Timeout ] -crbug.com/626703 external/wpt/html/dom/directionality/bdi-element-invalid-dir.html [ Failure ] -crbug.com/626703 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html [ Failure ] -crbug.com/626703 virtual/css-highlight-overlay-painting/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html [ Failure ] crbug.com/626703 [ Linux ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/background-sync.https.html [ Timeout ] -crbug.com/626703 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-roundRect.https.html [ Failure ] -crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-010.https.html [ Failure ] -crbug.com/626703 external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-001.html [ Failure ] -crbug.com/626703 external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-002.html [ Failure ] -crbug.com/626703 external/wpt/css/css-pseudo/highlight-currentcolor-root-implicit-default-001.html [ Failure ] -crbug.com/626703 [ Mac10.15 ] external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html [ Failure Timeout ] -crbug.com/626703 [ Mac11-arm64 ] external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html [ Failure Timeout ] -crbug.com/626703 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-001.html [ Failure ] -crbug.com/626703 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-002.html [ Failure ] -crbug.com/626703 virtual/css-highlight-overlay-painting/external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-001.html [ Failure ] -crbug.com/626703 virtual/css-highlight-overlay-painting/external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-002.html [ Failure ] -crbug.com/626703 virtual/css-highlight-overlay-painting/external/wpt/css/css-pseudo/highlight-currentcolor-root-implicit-default-001.html [ Failure ] crbug.com/626703 [ Mac11 ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/background-sync.https.html [ Timeout ] crbug.com/626703 [ Mac11 ] virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/background-sync.https.html [ Timeout ] crbug.com/626703 [ Mac10.15 ] external/wpt/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html [ Timeout ] @@ -5247,6 +5227,7 @@ crbug.com/1330586 [ Mac11-arm64 ] virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https_1-2.html [ Failure ] crbug.com/1330586 [ Mac11-arm64 ] virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https_3-4.html [ Failure ] crbug.com/1330586 [ Mac11-arm64 ] virtual/coop-restrict-properties/external/wpt/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https_7-8.html [ Failure ] +crbug.com/1350975 external/wpt/html/dom/directionality/bdi-element-invalid-dir.html [ Failure ] # Sheriff 2020-03-06 @@ -5956,6 +5937,7 @@ crbug.com/1147859 [ Linux ] virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-53.html [ Failure ] crbug.com/1147859 [ Mac ] virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-53.html [ Failure ] + # Green Mac11 Test crbug.com/1201406 [ Mac11 ] http/tests/credentialmanagement/credentialscontainer-create-origins.html [ Crash Timeout ] crbug.com/1201406 [ Mac12 ] http/tests/credentialmanagement/credentialscontainer-create-origins.html [ Crash Timeout ] @@ -7063,7 +7045,6 @@ crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-reset.https.html [ Failure Pass ] crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-tiled-001.https.html [ Failure Pass ] crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/top-level-await.https.html [ Failure Pass ] -crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-roundRect.https.html [ Failure Pass ] crbug.com/1343935 [ Mac10.15 ] external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body.html [ Failure Pass ] # Sheriff 2022-07-26
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index d03659b..ed1f415 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: 5c79743a93cfc4ded75d99338225531936da0c56 +Version: 0aa1b356be50e2025e98bf9ef6067dee8a360ca0
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index fa66cce..e486ff5 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -97555,7 +97555,7 @@ ] ], "contain-size-select-001.html": [ - "071db67831fd7951b8568ca1b7e4dcc5dbc119a1", + "479eb810aafa161ea49630d699c05f959bd2641e", [ null, [ @@ -97568,7 +97568,7 @@ ] ], "contain-size-select-002.html": [ - "1aa2d9f31d0cf4fe2b92f6d150e6c76596737115", + "3fdea550470adb6b061c59447a3c3fb6145b08ce", [ null, [ @@ -266796,7 +266796,7 @@ [] ], "contain-size-select-001-ref.html": [ - "960abc1e158756fca26ed3e42afcc9d97a0d07b1", + "1944e4937554f8c46a8a88e8593d6e128ef92cab", [] ], "contain-strict-011-ref.html": [ @@ -332457,6 +332457,10 @@ "db965fa928f2ad01285e362d9c8fb7d374acd29c", [] ], + "storage-persist.https.html": [ + "ab5fabd9e3099fbf1fd47f2d01461ec64b4352fa", + [] + ], "utils.js": [ "0dc7e33185e84280f2cc6ecabc2bb094574a2d51", [] @@ -470474,6 +470478,20 @@ } }, "terminology-0": { + "document-base-url-about-srcdoc.https.window.js": [ + "b8fad36ccf8b493d18ece3d47cb230b90fac6975", + [ + "html/infrastructure/urls/terminology-0/document-base-url-about-srcdoc.https.window.html", + { + "script_metadata": [ + [ + "script", + "/common/get-host-info.sub.js" + ] + ] + } + ] + ], "document-base-url-initiated-grand-parent.https.window.js": [ "1983f02c267837a9152f94d91bdbde4b1c3add6d", [ @@ -531607,6 +531625,15 @@ } ] ], + "restriction-storage-persist.https.html": [ + "7d2f04f6d05ae5295b0bc018a31b1a5fe60af07c", + [ + null, + { + "timeout": "long" + } + ] + ], "restriction-web-usb.https.html": [ "9d96a39c9c5528e3c0d41ba013343b6a4cbf0528", [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-001.html index 071db67..479eb81 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-001.html
@@ -7,7 +7,7 @@ <meta name=assert content="<select> elements with 'contain: size' should be treated as having no contents."> <style> select { - color: white; + color: transparent; background: white; contain: size; }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-002.html index 1aa2d9f..3fdea55 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-select-002.html
@@ -8,7 +8,7 @@ <meta name=assert content="Check that setting 'contain: size' on a <select> elements causes it to be sized as having no contents."> <style> select { - color: white; + color: transparent; background: white; } </style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-select-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-select-001-ref.html index 960abc1..1944e49 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-select-001-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-select-001-ref.html
@@ -4,7 +4,7 @@ <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> <style> select { - color: white; + color: transparent; background: white; } </style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001-ref.html index 642c1e3..da5469d3 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001-ref.html
@@ -56,16 +56,16 @@ <div class="item fullCrossSize" style="float: left"></div> </div> <div class="flexbox"> - <div class="item halfCrossSize"></div> - <div class="item halfCrossSize"></div> + <div class="item fullCrossSize" style="float: left"></div> + <div class="item fullCrossSize" style="float: left"></div> </div> <div class="flexbox"> - <div class="item halfCrossSize"></div> - <div class="item halfCrossSize"></div> + <div class="item fullCrossSize" style="float: left"></div> + <div class="item fullCrossSize" style="float: left"></div> </div> <div class="flexbox"> - <div class="item halfCrossSize"></div> - <div class="item halfCrossSize"></div> + <div class="item fullCrossSize" style="float: left"></div> + <div class="item fullCrossSize" style="float: left"></div> </div> <div style="clear: both"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001a.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001a.html index 613acd2..583f461 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001a.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001a.html
@@ -7,7 +7,7 @@ <head> <title>CSS Test: Testing page-break-before in horizontal multi-line flex containers</title> <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> - <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#algo-line-break"> + <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#change-201409-algo-breaks"> <link rel="match" href="flexbox-break-request-horiz-001-ref.html"> <meta charset="utf-8"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001b.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001b.html index 3ef1436..545c8c4 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001b.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-horiz-001b.html
@@ -7,7 +7,7 @@ <head> <title>CSS Test: Testing page-break-after in horizontal multi-line flex containers</title> <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> - <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#algo-line-break"> + <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#change-201409-algo-breaks"> <link rel="match" href="flexbox-break-request-horiz-001-ref.html"> <meta charset="utf-8"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001-ref.html index a9a2867..849fdef 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001-ref.html
@@ -56,16 +56,16 @@ <div class="item fullCrossSize"></div> </div> <div class="flexbox"> - <div class="item halfCrossSize" style="float: left"></div> - <div class="item halfCrossSize" style="float: left"></div> + <div class="item fullCrossSize"></div> + <div class="item fullCrossSize"></div> </div> <div class="flexbox"> - <div class="item halfCrossSize" style="float: left"></div> - <div class="item halfCrossSize" style="float: left"></div> + <div class="item fullCrossSize"></div> + <div class="item fullCrossSize"></div> </div> <div class="flexbox"> - <div class="item halfCrossSize" style="float: left"></div> - <div class="item halfCrossSize" style="float: left"></div> + <div class="item fullCrossSize"></div> + <div class="item fullCrossSize"></div> </div> <div style="clear: both"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001a.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001a.html index 5be8d53..57fd0d5 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001a.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001a.html
@@ -7,7 +7,7 @@ <head> <title>CSS Test: Testing page-break-before in vertical multi-line flex containers</title> <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> - <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#algo-line-break"> + <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#change-201409-algo-breaks"> <link rel="match" href="flexbox-break-request-vert-001-ref.html"> <meta charset="utf-8"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001b.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001b.html index 87ba97a..8c5a8868 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001b.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-break-request-vert-001b.html
@@ -7,7 +7,7 @@ <head> <title>CSS Test: Testing page-break-after in vertical multi-line flex containers</title> <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> - <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#algo-line-break"> + <link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#change-201409-algo-breaks"> <link rel="match" href="flexbox-break-request-vert-001-ref.html"> <meta charset="utf-8"> <style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html index f54e8cb..ec1e156 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html
@@ -2,7 +2,7 @@ <html> <head> <link rel="help" href="https://drafts.csswg.org/selectors/#lang-pseudo"> -<link rel="match" href="marker-and-other-pseudo-elements-ref.html"> +<link rel="match" href="lang-pseudo-class-across-shadow-boundaries-ref.html"> </head> <body> <p>Test passes if you see a single 100px by 100px green box below.</p>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/enrollment.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/enrollment.https.html index d9e86918..7a370aa 100644 --- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/enrollment.https.html +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/enrollment.https.html
@@ -1,7 +1,7 @@ <!DOCTYPE html> <meta charset="utf-8"> <meta name="timeout" content="long"> -<title>Test for registering a PublicKeyCredential with "payment" extension"</title> +<title>Test for registering a PublicKeyCredential with "payment" extension</title> <link rel="help" href="https://w3c.github.io/secure-payment-confirmation/#client-extension-processing-registration"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -29,16 +29,16 @@ standardSetup(function() { // good creates new CreatePaymentCredentialsTest().runTest('Payment credential is created successfully.'); + new CreatePaymentCredentialsTest({residentKey: 'preferred'}) + .runTest('Payment credential allows residentKey to be "preferred".'); // bad creates new CreatePaymentCredentialsTest({userVerification: 'preferred'}) .runTest('Payment credential requires userVerification to be "required", not "preferred".', "NotSupportedError"); new CreatePaymentCredentialsTest({userVerification: 'discouraged'}) .runTest('Payment credential requires userVerification to be "required", not "discouraged".', "NotSupportedError"); - new CreatePaymentCredentialsTest({residentKey: 'preferred'}) - .runTest('Payment credential requires residentKey to be "required", not "preferred".', "NotSupportedError"); new CreatePaymentCredentialsTest({residentKey: 'discouraged'}) - .runTest('Payment credential requires residentKey to be "required", not "discouraged".', "NotSupportedError"); + .runTest('Payment credential does not allow residentKey to be "discouraged".', "NotSupportedError"); new CreatePaymentCredentialsTest({authenticatorAttachment: 'cross-platform'}) .runTest('Payment credential requires authenticatorAttachment to be "platform", not "cross-platform".', "NotSupportedError"); }, {
diff --git a/third_party/blink/web_tests/media/controls/accessibility-playback-speed-button.html b/third_party/blink/web_tests/media/controls/accessibility-playback-speed-button.html index c11368f..36e10a5d 100644 --- a/third_party/blink/web_tests/media/controls/accessibility-playback-speed-button.html +++ b/third_party/blink/web_tests/media/controls/accessibility-playback-speed-button.html
@@ -36,7 +36,7 @@ var playbackSpeedListItem = playbackSpeedListItemAtPlaybackRate(video, playbackSpeed); assert_equals(playbackSpeedListItem.innerText, playbackSpeed == 1.0 ? 'Normal' : `${playbackSpeed}`); assert_equals(playbackSpeedListItem.getAttribute('role'), 'menuitemcheckbox'); - assert_equals(playbackSpeedListItem.getAttribute('aria-setsize'), '9'); + assert_equals(playbackSpeedListItem.getAttribute('aria-setsize'), `${playbackSpeeds.length}`); assert_equals(playbackSpeedListItem.getAttribute('aria-posinset'), `${index + 1}`); }); }));
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-color-adjust/inheritance-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-color-adjust/inheritance-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/css/css-color-adjust/inheritance-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/css/css-color-adjust/inheritance-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/selectors/focus-visible-025-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/focus-visible-025-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/css/selectors/focus-visible-025-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/focus-visible-025-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/linux/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt index b4b7dfa1..bf94399 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -FAIL SPC enrollment in cross-origin iframe assert_equals: expected null but got object "NotSupportedError: The user agent does not support public key credentials." +FAIL SPC enrollment in cross-origin iframe assert_equals: expected null but got object "SecurityError: A user activation is required to create a credential in a cross-origin iframe." PASS SPC enrollment in cross-origin iframe fails without user activation PASS SPC enrollment in cross-origin iframe without payment permission Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment.https-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment.https-expected.txt index 3613bbc..d3dd35b 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment.https-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/secure-payment-confirmation/enrollment.https-expected.txt
@@ -1,9 +1,9 @@ This is a testharness.js-based test. FAIL Payment credential is created successfully. promise_test: Unhandled rejection with value: object "NotSupportedError: The user agent does not support public key credentials." +FAIL Payment credential allows residentKey to be "preferred". promise_test: Unhandled rejection with value: object "NotSupportedError: The user agent does not support public key credentials." PASS Payment credential requires userVerification to be "required", not "preferred". PASS Payment credential requires userVerification to be "required", not "discouraged". -PASS Payment credential requires residentKey to be "required", not "preferred". -PASS Payment credential requires residentKey to be "required", not "discouraged". +PASS Payment credential does not allow residentKey to be "discouraged". PASS Payment credential requires authenticatorAttachment to be "platform", not "cross-platform". PASS Clean up the test environment Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/service-workers/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/service-workers/idlharness.https.any.worker-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/service-workers/idlharness.https.any.worker-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/service-workers/idlharness.https.any.worker-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/webvtt/api/VTTCue/constructor-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/webvtt/api/VTTCue/constructor-expected.txt index 087efc5..f4033eff 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/webvtt/api/VTTCue/constructor-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/webvtt/api/VTTCue/constructor-expected.txt
@@ -2,6 +2,7 @@ FAIL VTTCue(), initial values assert_equals: expected (string) "start" but got (undefined) undefined PASS VTTCue(), bad start time PASS VTTCue(), bad end time +FAIL VTTCue(), unbounded end time Failed to construct 'VTTCue': The provided double value is non-finite. PASS VTTCue(), text formatting Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/generic/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt b/third_party/blink/web_tests/platform/generic/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt deleted file mode 100644 index 12cdab12..0000000 --- a/third_party/blink/web_tests/platform/generic/inspector-protocol/emulation/select-popup-auto-dark-mode-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -[crbug/1311561] Tests that auto dark mode emulation from DevTools correctly emulates dark mode for select element -=== Before auto dark mode (autoDarkMode and prefers-color-scheme override) is not enabled === -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAHwlJREFUeJzt3X+QlfV96PHP7h6WDSyBkA0/l12YZkKsWEqqt40BkUQTiNVoWSe6ViWI9eK9BTVx6WIJGGlwM7SW+gOJBofLDEoSEUyIBuSGTKeTZqbk6tybBJ046N1JugKtbOBGS9g99w/rWrqA7LPLJxl9vf7Rc77P83y+e/7aN+c8eyrK5XI5AAAAElT+pjcAAAC8ewgQAAAgjQABAADSCBAAACCNAAEAANIIEAAAII0AAQAA0pRO56AlS5ac6X2847S1tf2mtwAAAL913jZAlixZ4pfpArxuAADQm49gAQAAaQQIAACQRoAAAABp+hUg3/3ud2PmzJlRW1sbw4cPjxkzZsSTTz553DEjRoyI6urqqKmpiZqamhg3blzceOON0dnZGRERn/nMZ6JUKkWpVIrKysqorKzseXz99ddHRMS5554bDz74YKHZH//4x3vte/r06fHNb36z5/H3v//9GD58eNx33339eTkAAIC3UThANm/eHE1NTfG5z30uOjo64pVXXolFixbFvHnzYt26dccd++STT8brr78er7/+evzjP/5j7N27N2655ZaIiNi2bVscO3Ysjh07Fs3NzXHzzTf3PN6wYUO/Z7/44ovxrW9966Q/x9atW2PlypXx4Q9/uOhLAQAAnKZCAXL06NFYvHhx3HXXXTFv3ryora2NmpqauPLKK2PNmjXx+c9/Po4cOXLCcxsaGuL222+P73znO4U23NfZX/ziF6OlpSWOHTt2wuv9+Mc/jm3btsWwYcNOOXfFihVx6NChXs8fOnQo7rzzzkI/CwAAvNsUCpAf/vCHsX///rjxxht7rTU3N0epVIqdO3ee9Pyurq6orq4uMrrPsy+88MKYOHFiPPTQQye83h133BFDhgw55cwVK1bEnXfeGbNmzTouQg4dOhSzZs2KFStWxIoVKwr9PAAA8G5SKEBefvnlGDNmTAwdOrTXWlVVVUyaNClefvnlXmvlcjlefPHFaGtri6ampiKj+zy7XC7HV77ylbjrrrvi8OHDhWbecsstMXXq1Hj22Wd7IuTN+Hj22Wdj6tSpPR8pAwAATq5QgAwaNCi6urpOut7d3R2VlW9d+oorroja2tp473vfG5/61KfiggsuiC9/+ctFRvd5dkTEOeecE5/+9Kdj1apVhWaOGDEidu/efVyE/Mf42L17d4wYMaLQtQEA4N3kbb8J/UQmTZoU+/fvj0OHDvX6xburqyteeuml+OAHP9jz3BNPPBGzZ8/u304Lzn7Tl770pZg6dWosXLgwKioq+jz3zQi58MIL49lnn42IEB8AANBHhd4BOffcc6O+vj7uv//+XmuPPvpoDBo0KD7xiU/0e3MDOXvcuHGxcOHCuOOOO2LQoEGFZv/Hd0LEBwAA9F2hd0AqKyvjgQceiKuvvjpGjRoVV199dZRKpdi+fXvceuutce+998bgwYMHeq/9nt3S0hIf+tCHCt8AH/FWhLz5/wAAwOkr/D0gl156aWzfvj2+/vWvx4QJE2L06NHxd3/3d7Fx48a4+uqrB3KPAza7trY2li9f3nOTeldXV88XJH7ve9+LW2+9NWpqauLP//zPTzl/xIgR4gMAAAqoKJfL5VMdsGTJkmhra8vazzuG1w0AAHor/A4IAABAXwkQAAAgjQABAADSvO09IBFv3M9A37j/AwAAenvbd0DERzFeNwAA6O20vgfksXH+Nb+vrvqFAAEAgP/MPSAAAEAaAQIAAKQ5rY9gncxre78bv9z55Tjavieisiqqx/1eDPv47TFkymU9x7S3jojy0V9FVLzROlVDRkbN714S7/vM6qh8z/A48PBn4rWfbH/j4HL3G//992OH/sE18f5rNkTHX58bQ/9oQQz72H/t8+zq+o/E6P/2P4/b9ytrpsewmbfEkN9vioiI13/2/Tjw8GUx4pK/imEz/nt/XhIAAOAUCgfI//tfm+NfH1sQ75t7b3zgz7ZHRWUpXvvxt+JfN82Lrj9eFcPOv6nn2A8seDLec9bsiIg49ur/jX/ZeE28+sQt8f7mR+IDC7b1HHdw459G5XtGxMim+wZs9rGDL8av/s+3YsiUS094rV/9761x5O/vj0GjPlz0pQAAAE5ToY9glY8djVe3LI7hn74rav/LvKgcXBsVg2piyO9fGe+7Yk0c2vr56P63Iyc8t/S+hhj28dvjtZ98p9CG+zp7+Ke+GIe+1RLlrmMnvN6v//nHUbdgW1TUDCu0HwAA4PQVCpB/e/mH0X1kf9T+0Y291ob8QXNEVSlef37nyS/Q3RUVpeoio/s8e/AHL4zSyIlx5AcPnfB6wz95R1RWDym0FwAAoG8KBUjXqy9H1bAxUTl4aK+1isqqKI2cFMdefbnXWrlcjl8ffDF+uasthkxtKjK677PL5Rhx6Vfilzvuiu7XDxeaCQAADIxi94BUDYpyd9fJ18vdUVHxVtscXH9FREVVREVFVA0bHe/5vT+J4bPvLDS6r7MjIqrHnRM1v/vp+OUzq2LEH3+52FwAAKDfCgVIaeSk6D6yP7pfOxSV7xlx3Fq5uyuO/etLUar7YM9zdfOf6LkJvb/6OvtNw+d8KTq+MjVqP7YwoqJiQPYCAAD0TaGPYFVPODeqRtTH4b+/v9far370aFRUDYqaD32i35sbyNml4eOi9mMLo3P7HRFVg87I3gAAgFMr9A5IRWVlvK/pgfiX/3F1VA0bFUM+cvUbfwr3J9vj1Sdujff9yb1RURo80Hvt9+z3fqIl/vmvPhRR8AZ4AACgfwp/D8iQKZdG5Z9tj1/uWBmvPtkSUe6O6vG/H+//040D9nGrgZ5dObg23jt7ebz69Te+0LDc3RXtLf9+M3vXr+Pffvb9eHXbF6L2ozfGyLn3ntGfAQAA3o0qyuVy+VQHLFmyJB4b15a1n3eMq36xJNravG4AAPAfFboHBAAAoAgBAgAApBEgAABAmtO6Cf256w+d6X2846xa9ZveAQAA/PbxDggAAJBGgAAAAGn6FSC7du2KSy65JOrr66OxsTHmzJkTTz311HHHNDY2xqhRo2LMmDExZsyYOOuss2Lx4sXR2dkZERHNzc1RV1cXdXV1MXLkyBg5cmTP44ULF0ZExKxZs2L9+vWFZl922WW99j1nzpzYtm1bRET84Ac/iIsuuigmTpwYH/nIR+LRRx/tz0sCAACcQuEA2bJlS8ybNy+uueaa2Lt3bzz//PNx0003xc033xyPPPLIccdu2rQpOjo6oqOjI3bs2BEvvPBCLF26tGft4MGDcfDgwWhqaoobbrih5/HatWv7PXvfvn3x9NNPn/A6nZ2dcdVVV8WCBQti3759sXbt2rjtttvipz/9adGXBQAAOIVCAXL06NFobW2NpUuXRnNzc9TW1kZNTU1cfvnlcffdd8eyZcviyJEjJzx3woQJsWjRoti5c2ehDfd1dktLSyxfvjyOHTt2wmvdddddcdVVV0VFRUX84R/+YUyZMiX27NlTaG8AAMCpFQqQPXv2xIEDB+K6667rtdbU1BRVVVWxe/fuk57f1dUV1dXVRUb3efb06dOjoaEhNmzY0Ov4D3zgA8ddp1wuR3t7e9TX1xfaGwAAcGqFAqS9vT1Gjx4dQ4cO7bVWVVUVjY2N0d7e3mutXC7Hvn37Ys2aNSe8N+NMzC6Xy7FixYpYvXp1HD58+JTXvvfee2Ps2LFxwQUXFNobAABwaoUCpFQqRVdX10nXu7u7o7LyrUtfe+21UV9fHw0NDTF37tw4//zzY9myZUVG93l2RMTZZ58dF198cdxzzz0nPW/9+vWxbt26WL9+fa/zAQCAgXFaX0T4nzU2NsaBAweis7Mzhg8fftxaV1dXtLe3x6RJk3qe27hxY1x00UX922nB2W9qbW2NGTNmxPz583ut3X///fHQQw/F9u3bY+LEiQOyTwAAoLdC/9Q/bdq0GD9+fDz88MO91h5//PEolUoxc+bMfm9uIGePHTs25s+fHytXroxBgwb1PL9ly5b46le/Gt/+9rfFBwAAnGGF3gGprKyM1atXx4IFC6Kuri7mzp0bpVIpduzYEUuXLo22trYYPHjwQO+137MXLVoU5513Xk+AHD58OFpbW2PDhg1uPAcAgASFb3aYPXt2bN68ObZu3RpTpkyJyZMnx7p16+LBBx+MpqamgdzjgM2ura2NlpaWnpvUd+3aFfv374/LL7+854sSx4wZ0/MdJQAAwMCqKJfL5VMdsGTJkmhtbc3azzvGqlWroq2t7Te9DQAA+K3izz0BAABpBAgAAJBGgAAAAGkECAAAkEaAAAAAaQQIAACQpl8BsmvXrrjkkkuivr4+GhsbY86cOfHUU08dd0xjY2OMGjWq5zs2zjrrrFi8eHF0dnZGRERzc3PU1dVFXV1djBw5MkaOHNnzeOHChRERMWvWrFi/fn2h2Zdddlmvfc+ZMye2bdsWERHPPPNMXHDBBTFx4sSYNm1afO1rX+vPSwIAAJxC4QDZsmVLzJs3L6655prYu3dvPP/883HTTTfFzTffHI888shxx27atCk6Ojqio6MjduzYES+88ELPl/1t2rQpDh48GAcPHoympqa44YYbeh6vXbu237P37dsXTz/99Amv8/Of/zyuv/76+Mu//Mt46aWXYv369bFs2bL40Y9+VPRlAQAATqFQgBw9ejRaW1tj6dKl0dzcHLW1tVFTUxOXX3553H333bFs2bI4cuTICc+dMGFCLFq0KHbu3Flow32d3dLSEsuXL49jx471ulZFRUXcd9998clPfjIiIqZNmxa/8zu/Ez/72c8K7Q0AADi1QgGyZ8+eOHDgQFx33XW91pqamqKqqip279590vO7urqiurq6yOg+z54+fXo0NDTEhg0beh0/bty4uOKKKyIi4vXXX49t27bF/v37Y8aMGYX2BgAAnFqhAGlvb4/Ro0fH0KFDe61VVVVFY2NjtLe391orl8uxb9++WLNmzQnvzTgTs8vlcqxYsSJWr14dhw8fPuE1v/GNb8S4cePiC1/4QqxduzbGjh1baG8AAMCpFQqQUqkUXV1dJ13v7u6Oysq3Ln3ttddGfX19NDQ0xNy5c+P888+PZcuWFRnd59kREWeffXZcfPHFcc8995zwnCuvvDI6OjrigQceiAULFsQ//dM/FdobAABwaqUiJzU2NsaBAweis7Mzhg8fftxaV1dXtLe3x6RJk3qe27hxY1x00UX922nB2W9qbW2NGTNmxPz580943erq6rj44ovj0ksvjUcffTTOPffcAdkvAADwlkLvgEybNi3Gjx8fDz/8cK+1xx9/PEqlUsycObPfmxvI2WPHjo358+fHypUrY9CgQRER8dxzz8WmTZuOO667uztKpUJdBgAAvI1Cv2lXVlbG6tWrY8GCBVFXVxdz586NUqkUO3bsiKVLl0ZbW1sMHjx4oPfa79mLFi2K8847rydAIiJuv/32GD9+fFxwwQXx3HPPxZNPPum7QAAA4Awp/D0gs2fPjs2bN8fWrVtjypQpMXny5Fi3bl08+OCD0dTUNJB7HLDZtbW10dLS0nOT+tSpU2PNmjXxF3/xF9HQ0BCf+9znYtmyZQP2cTEAAOB4FeVyuXyqA5YsWRKtra1Z+3nHWLVqVbS1tf2mtwEAAL9VCr8DAgAA0FcCBAAASCNAAACANAIEAABII0AAAIA0AgQAAEjTrwDZtWtXXHLJJVFfXx+NjY0xZ86ceOqpp447prGxMUaNGhVjxoyJMWPGxFlnnRWLFy+Ozs7OiIhobm6Ourq6qKuri5EjR8bIkSN7Hi9cuDAiImbNmhXr168vNPuyyy7rte85c+bEtm3bjnvutddei6lTp8Ztt93Wn5cEAAA4hcIBsmXLlpg3b15cc801sXfv3nj++efjpptuiptvvjkeeeSR447dtGlTdHR0REdHR+zYsSNeeOGFWLp0ac/awYMH4+DBg9HU1BQ33HBDz+O1a9f2e/a+ffvi6aefftuf52//9m+ju7u74KsBAACcjkIBcvTo0WhtbY2lS5dGc3Nz1NbWRk1NTVx++eVx9913x7Jly+LIkSMnPHfChAmxaNGi2LlzZ6EN93V2S0tLLF++PI4dO3bSa7788suxZcuW+OxnP1toTwAAwOkpFCB79uyJAwcOxHXXXddrrampKaqqqmL37t0nPb+rqyuqq6uLjO7z7OnTp0dDQ0Ns2LDhpNdsbW2NlpaWqKmpKbQnAADg9BQKkPb29hg9enQMHTq011pVVVU0NjZGe3t7r7VyuRz79u2LNWvWnPDejDMxu1wux4oVK2L16tVx+PDhXuc888wz8corr0RTU1Oh/QAAAKevUICUSqXo6uo66Xp3d3dUVr516WuvvTbq6+ujoaEh5s6dG+eff34sW7asyOg+z46IOPvss+Piiy+Oe+6557jn3/w418qVK6OioqLQfgAAgNNXKnJSY2NjHDhwIDo7O2P48OHHrXV1dUV7e3tMmjSp57mNGzfGRRdd1L+dFpz9ptbW1pgxY0bMnz+/57kHHnggzjnnnPjoRz86IHsDAABOrdA7INOmTYvx48fHww8/3Gvt8ccfj1KpFDNnzuz35gZy9tixY2P+/PmxcuXKGDRoUERE/PSnP41/+Id/iMmTJ8fkyZNjzZo18dhjj8WcOXPOyN4BAODdrtA7IJWVlbF69epYsGBB1NXVxdy5c6NUKsWOHTti6dKl0dbWFoMHDx7ovfZ79qJFi+K8887rCZB169Ydt7569er4xS9+EX/zN39zRvYOAADvdoW/B2T27NmxefPm2Lp1a0yZMiUmT54c69atiwcffPCM39BddHZtbW20tLSc8AZ5AADgzKsol8vlUx2wZMmSaG1tzdrPO8aqVauira3tN70NAAD4rVL4HRAAAIC+EiAAAEAaAQIAAKQ5rb+CtWrVqjO9DwAA4F3gbW9CBwAAGCg+ggUAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApBEgAABAGgECAACkESAAAEAaAQIAAKQRIAAAQBoBAgAApPn/KVRFXTObneEAAAAASUVORK5CYII= - -=== After auto dark mode (autoDarkMode and prefers-color-scheme override) is enabled === -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAYAAACadoJwAAAAAXNSR0IArs4c6QAAH0VJREFUeJzt3X2QlvV97/HPLoQC3Z4OJB4XaJImjSGlGauNYin2aIi2R86QB9KeTOMgBs8xLTJAD9kRY44moSCZZGeNUkadnULtgGfoJKIhwIAGOIWCbeVkkjSloKZpTLdQLA4PQmAfzh/W7VAeIjfsV0dfr7/gvq77+v72/mvfc1+/vZpGjhzZFwAAgALNr/UCAACANw8BAgAAlBEgAABAGQECAACUESAAAEAZAQIAAJQRIAAAQJnBr+akefPmDfQ63nDa29tf6yUAAMDrTtNPexDhvHnzsnbt2qr1vGFMnjxZhAAAwH/gFiwAAKCMAAEAAMoIEAAAoMyr2oR+JuPHj89NN92UsWPHpre3N88++2xWrlyZrVu39p+zfv36DB06NL29vUmSgwcPZvv27VmyZEmOHDmSxYsXZ8KECUmS5uaXe+iVczds2JCFCxems7Mza9asyerVq8959u7duzN79uyT1r106dKsWrUqmzdvTpJcdtll+dKXvpSHHnooX/va187nIwEAAM6i4QCZNGlS5s+fn46OjrS1taWnpycTJ07MnXfemQceeCCPPfZY/7m33357nnrqqSTJxRdfnLvvvjtz5szJokWLMn/+/P7z7rrrrhw6dCgdHR0XbPaYMWMyceLEbNu27bTX+s3f/M1MnTo1P/zhDxv9KAAAgFepoVuwBg8enLlz56azszPr1q3L0aNHc/z48WzatCn33ntvZs2alWHDhp32vXv37s3KlSv7v/UY6NnLli3LzJkzM2jQoNNe713velfmz5+fl1566axzZ8yYkZaWllNeb2lpyac+9amGfhYAAHizaShAxo0blxEjRuTxxx8/5djGjRvT09OTK6+88sxDm5tz4sSJRkaf8+ydO3emq6srU6ZMOe31Hn744fzkJz8568wZM2ZkxowZuf/++0+KkJaWltx///255ZZbMmPGjIZ+HgAAeDNpKEBaW1vzwgsv5NixY6cc6+3tTVdXV1pbW0/73tGjR+fGG2/s338x0LObmpqydOnS3HzzzRk+fHhDM1etWpVnnnkml1xySX+EvBIfl1xySZ555pmsWrWqoWsDAMCbSUN7QLq7u894S1Py8i/9r2wkT5J77rknPT096evry4EDB7Jly5Z0dnY2MvqcZyfJc889lx07dmTatGl58MEHz3nm4cOHM2vWrCxZsqQ/QpL0x8esWbNy+PDhc74uAAC82TQUIF1dXRkxYkRaWlpO+cW7ubk5o0aNyvPPP9//2h133NG/Cf18nevsV3R2dmb58uV59NFHG5r7HyMkifgAAIBz1NAtWLt27cq+ffsyderUU45dd9116e7uztNPP33ei7uQs/fv35/Vq1fn1ltvTXd3d0OzX4mQZ555RnwAAEADGvoGpK+vL+3t7fn85z+fAwcO5IknnkhPT08mTJiQ2bNnp6Ojo+FN5gM5e8WKFXnkkUcaDpDk3yPklX8DAACvXsPPAdm2bVva2toyffr0zJw5M83NzdmzZ08WLFhwwW63utCzjx49mmXLlqWtrS3Jy7dsPfHEE0le/vO+l19+eW677bZ84xvfOOuzSIQHAAA0pmnkyJF9Zzth3rx5Wbt2bdV63jAmT56c9vb213oZAADwutLQHhAAAIBGCBAAAKCMAAEAAMr81D0gycv7QDg39n8AAMCpfuo3IOKjMT43AAA41av6M7xv+9BnB3odbzj7n1z0Wi8BAABed+wBAQAAyggQAACgTMNPQk+SH+96Kt998uH86/N/nzQ1Z+To9+RXPvjJvP1Xru4/55E7fzvdx4+lqfnl1vmZ4f8pY943IVd8eFaGDGvJpj+Zn+f/7i+TJH29vUnSf+67fu23cvXvfS7f7Lgl77lqSsb+xkfPefZbf2FsfusP7jtp3evu/4P88n/57/nFX/1gkuSfn/l/+daf3J5fm/zpvO/qj5/PRwIAAJxFwwHyD99+Mn+5anHGf+wP845bvpxBgwbnR3+7Ndv+z8JcfsOnT4qFD874Un7hl389SXLkwN78xYov5K9WfzVX/96d+eCMxf3n/cWKL2bIsJZcNfV/XbDZh174cf7xe1vzjvdffdpr/eN3/2/+ftvX8/P/+Z2NfhQAAMCr1NAtWD3dJ/JXj96by//r/8x7rpycIUOHZ9BbhuQXL5uUKz8yJ09/Y0mOH3vptO/92REX51c++Mn8+O+2N7Tgc5196fWfys5vLk1vT89pr/fiP/8gH5yxOG8ZOryh9QAAAK9eQwGy/x+/n2OHD+Q9V0055di7Lr8+Tc2D0rX7r8/4/t6engwa/JZGRp/z7NZfujwtI0dlz47HT3u9S6+fnsFDhja0FgAA4Nw0FCBHDvxzhv2nt+YtPzPs1AsOGpSWkaPy0ot7TznW19eXQ/t/nL/dtCLv/Lf9FwM9u6+vLx/4bzPznSeW58QZvpUBAABqNLQHpHnQ4DPe0pQk6etLmpr6/7vlTz+bpqbmpKkpQ1tG5J2XXptf/a1bGhl9zrOTZMToX8qYX56Q737rz/Jrkz/d0FwAAOD8NRQgPztiVH5y5MX85KVD+ZnhP3fSsd6enhz616783Nt+of+1a6Yv6t+Efr7OdfYrLvvt/5FvtE/Peyd8NE3/IVAAAIAaDd2C9da3vy/Df/6i/P22r59y7B++/USaBw1O63s+cN6Lu5Czh//82zL2Nz6Wb697KM2DzuuvDwMAAA1qKECam5szfuq8fO9bf5bdOx7P8WMvpefE8fzwO5vz14/dl/Ef+8MMfsuQC73W85497tpPpmvP3+TQCz8ekLUBAABn1/BXAe94/9WZdMuX890n/jQ71yxNb29vRo65JBN/739fsNutLvTsIUOH59LrP5WnvvaVJC/fsrXys9f927+7s/fZb+dvvrEk7/31D2f8x/5wQH8GAAB4M2oaOXJk39lOmDdvXt72oc9WrecNY/+Ti9Le3v5aLwMAAF5XGroFCwAAoBECBAAAKCNAAACAMq9qE/rD864e6HW84UyePPm1XgIAALzu+AYEAAAoI0AAAIAy5/VI8PHjx+emm27K2LFj09vbm2effTYrV67M1q1b+89Zv359hg4dmt7e3iTJwYMHs3379ixZsiRHjhzJ4sWLM2HChCQvP2QwSf+5GzZsyMKFC9PZ2Zk1a9Zk9erV5zx79+7dmT179knrXrp0aVatWpXNmzfn0ksvzaxZs/L2t789Bw8ezPLly7Nu3brz+VgAAIAzaDhAJk2alPnz56ejoyNtbW3p6enJxIkTc+edd+aBBx7IY4891n/u7bffnqeeeipJcvHFF+fuu+/OnDlzsmjRosyfP7//vLvuuiuHDh1KR0fHBZs9ZsyYTJw4Mdu2bTvlOi0tLfnyl7+cjo6OrF+/Pu9///tz3333ZdeuXfnBD37Q6EcDAACcQUO3YA0ePDhz585NZ2dn1q1bl6NHj+b48ePZtGlT7r333syaNSvDhg077Xv37t2blStX9n/rMdCzly1blpkzZ2bQoEGnvdb999+f9evXJ0m+973vZc+ePRk3blxDawMAAM6uoQAZN25cRowYkccff/yUYxs3bkxPT0+uvPLKMw9tbs6JEycaGX3Os3fu3Jmurq5MmTLllPNffPHFrFmz5qTXWltbs3fv3obWBgAAnF1DAdLa2poXXnghx44dO+VYb29vurq60traetr3jh49OjfeeGM2b97cyOhznt3U1JSlS5fm5ptvzvDhw8967U9+8pP5l3/5lzz99NMNrQ0AADi7hvaAdHd3n/aWplc0NTX1byRPknvuuSc9PT3p6+vLgQMHsmXLlnR2djYy+pxnJ8lzzz2XHTt2ZNq0aXnwwQdP+76PfvSj+d3f/d3cdttt6evra2htAADA2TUUIF1dXRkxYkRaWlpy+PDhk441Nzdn1KhRef755/tfu+OOO/o3oZ+vc539is7OzixfvjyPPvroKcc+8YlP5OMf/3huu+22/NM//dMFWScAAHCqhm7B2rVrV/bt25epU6eecuy6665Ld3f3gN3G1Ojs/fv3Z/Xq1bn11lvT3d3d//qkSZPyO7/zO5k1a5b4AACAAdZQgPT19aW9vT3Tpk3LlClTMmzYsAwZMiTXXHNNZs+enY6OjoY3mQ/k7BUrVuSKK67I6NGjkyTDhw/P3Llz88UvfjH79u0bkPUCAAD/ruHngGzbti1tbW2ZPn16Zs6cmebm5uzZsycLFiy4YLdbXejZR48ezbJly9LW1pYkueqqqzJy5Mh89atfPem81atX57777hvQnwEAAN6MmkaOHHnWHdfz5s3L2rVrq9bzhjF58uS0t7e/1ssAAIDXlYZuwQIAAGiEAAEAAMoIEAAAoIwAAQAAyggQAACgjAABAADKNPwckCQZP358brrppowdOza9vb159tlns3LlymzdurX/nPXr12fo0KHp7e1Nkhw8eDDbt2/PkiVLcuTIkSxevDgTJkxIkjQ3v9xDr5y7YcOGLFy4MJ2dnVmzZk1Wr159zrN3796d2bNnn7TupUuXZtWqVdm8eXOuuuqq/P7v/35aW1tz6NChrFy58qQ5AADAhdNwgEyaNCnz589PR0dH2tra0tPTk4kTJ+bOO+/MAw88kMcee6z/3Ntvv73/AYEXX3xx7r777syZMyeLFi3K/Pnz+8+76667cujQoXR0dFyw2WPGjMnEiROzbdu2U65z0UUXZeHChfnc5z6XHTt25H3ve1/++I//OLt27cquXbsa/WgAAIAzaOgWrMGDB2fu3Lnp7OzMunXrcvTo0Rw/fjybNm3Kvffem1mzZmXYsGGnfe/evXuzcuXK/m89Bnr2smXLMnPmzAwaNOiUa/X19WXRokXZsWNHkmTXrl350Y9+lHe84x0NrQ0AADi7hgJk3LhxGTFiRB5//PFTjm3cuDE9PT258sorzzy0uTknTpxoZPQ5z965c2e6uroyZcqUU87fv39/vvWtbyVJhgwZkmuvvTYjR47Mzp07G1obAABwdg0FSGtra1544YUcO3bslGO9vb3p6upKa2vrad87evTo3Hjjjdm8eXMjo895dlNTU5YuXZqbb745w4cPP+01r7/++jz55JP5zGc+kwULFmT//v0NrQ0AADi7hvaAdHd3n/aWplc0NTX1byRPknvuuSc9PT3p6+vLgQMHsmXLlnR2djYy+pxnJ8lzzz2XHTt2ZNq0aXnwwQdPec/GjRuzadOmXHHFFfnCF76Qz3zmM/n+97/f0PoAAIAzayhAurq6MmLEiLS0tOTw4cMnHWtubs6oUaPy/PPP9792xx139G9CP1/nOvsVnZ2dWb58eR599NHTXre7uzs7duzIli1bcsMNNwgQAAAYAA3dgrVr167s27cvU6dOPeXYddddl+7u7jz99NPnvbgLOXv//v1ZvXp1br311nR3dydJ3vve9+aGG2446bympqb09PQMyNoBAODNrqEA6evrS3t7e6ZNm5YpU6Zk2LBhGTJkSK655prMnj07HR0dDW8yH8jZK1asyBVXXJHRo0f3vzZv3rx84AMfSJKMHTs21157bbZv3z4gawcAgDe7hp8Dsm3btrS1tWX69OmZOXNmmpubs2fPnixYsOCC3W51oWcfPXo0y5YtS1tbW5Jk9+7dWbx4cebOnZuLL744L774Yh566KEBXz8AALxZNY0cObLvbCfMmzcva9eurVrPG8bkyZPT3t7+Wi8DAABeVxq6BQsAAKARAgQAACgjQAAAgDICBAAAKCNAAACAMgIEAAAo0/BzQJJk/PjxuemmmzJ27Nj09vbm2WefzcqVK7N169b+c9avX5+hQ4emt7c3SXLw4MFs3749S5YsyZEjR7J48eJMmDAhSdLc/HIPvXLuhg0bsnDhwnR2dmbNmjVZvXr1Oc/evXt3Zs+efdK6ly5dmlWrVmXz5s39rw0ZMiQrVqzIU089la985Svn87EAAABn0PA3IJMmTcof/dEf5Zvf/GY+/OEPZ8qUKfnzP//z3HnnnfnIRz5y0rm33357Jk2alEmTJuXTn/503vnOd2bOnDlJkvnz5+eaa67JNddck40bN+brX/96//8XLlx43rPHjBmTiRMn/tSfZ9q0af0BBAAADIyGfuMePHhw5s6dm87Ozqxbty5Hjx7N8ePHs2nTptx7772ZNWtWhg0bdtr37t27NytXruz/1mOgZy9btiwzZ87MoEGDznjNUaNG5UMf+lDWr1/f0JoAAIBXp6EAGTduXEaMGJHHH3/8lGMbN25MT09PrrzyyjMPbW7OiRMnGhl9zrN37tyZrq6uTJky5YzXnDNnTpYvX57jx483tCYAAODVaShAWltb88ILL+TYsWOnHOvt7U1XV1daW1tP+97Ro0fnxhtvPGn/xUDObmpqytKlS3PzzTdn+PDhp7znqquuylvf+tZs2LChofUAAACvXkOb0Lu7u896S1NTU1P/RvIkueeee9LT05O+vr4cOHAgW7ZsSWdnZyOjz3l2kjz33HPZsWNHpk2blgcffLD/9cGDB2fOnDlZvHhxQ2sBAADOTUMB0tXVlREjRqSlpSWHDx8+6Vhzc3NGjRqV559/vv+1O+64I0899dT5rbTB2a/o7OzM8uXL8+ijj/a/9olPfCLPPPNMvvOd71yQtQEAAGfXUIDs2rUr+/bty9SpU/Pwww+fdOy6665Ld3d3nn766QuywAs1e//+/Vm9enVuvfXWdHd3J0ne/e5357LLLuvfTzJ06NAMGjQo7373uzNz5swBWT8AALyZNRQgfX19aW9vz+c///kcOHAgTzzxRHp6ejJhwoTMnj07HR0dDW8yH8jZK1asyCOPPNIfIAsWLDjp+PTp03PRRRd5DggAAAyQhh9EuG3btrS1tWX69OmZOXNmmpubs2fPnixYsOCC3W51oWcfPXo0y5YtS1tb24CuDwAAOL2mkSNH9p3thHnz5mXt2rVV63nDmDx5ctrb21/rZQAAwOuKR38DAABlBAgAAFBGgAAAAGVe1Sb0yZMnD/Q6AACAN4GfugkdAADgQnELFgAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQRoAAAABlBAgAAFBGgAAAAGUECAAAUEaAAAAAZQQIAABQ5v8DP7+kS7i28+0AAAAASUVORK5CYII= -
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/flexbox/repaint-on-layout-expected.txt b/third_party/blink/web_tests/platform/generic/paint/invalidation/flexbox/repaint-on-layout-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/paint/invalidation/flexbox/repaint-on-layout-expected.txt rename to third_party/blink/web_tests/platform/generic/paint/invalidation/flexbox/repaint-on-layout-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/virtual/backface-visibility-interop/paint/invalidation/image/image-resize-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/backface-visibility-interop/paint/invalidation/image/image-resize-expected.txt deleted file mode 100644 index 575e960..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/backface-visibility-interop/paint/invalidation/image/image-resize-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [0, 50, 100, 200], - [100, 50, 50, 150] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/backface-visibility-interop/paint/invalidation/scroll/outline-change-scrollable-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/backface-visibility-interop/paint/invalidation/scroll/outline-change-scrollable-expected.txt deleted file mode 100644 index 5fb6ed16..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/backface-visibility-interop/paint/invalidation/scroll/outline-change-scrollable-expected.txt +++ /dev/null
@@ -1,20 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [1008, 585], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [0, 0, 1008, 128] - ] - }, - { - "name": "HorizontalScrollbar", - "position": [0, 585], - "bounds": [800, 15], - "contentsOpaque": true - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/clipboard-custom-formats/external/wpt/clipboard-apis/clipboard-item.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/clipboard-custom-formats/external/wpt/clipboard-apis/clipboard-item.https-expected.txt deleted file mode 100644 index c176160..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/clipboard-custom-formats/external/wpt/clipboard-apis/clipboard-item.https-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -PASS ClipboardItem({string, Blob}) succeeds with different types -PASS ClipboardItem() succeeds with empty options -PASS ClipboardItem({}) fails with empty dictionary input -PASS ClipboardItem(Blob) fails -PASS ClipboardItem() fails with null input -PASS ClipboardItem() fails with no input -PASS types() returns correct values -PASS getType(DOMString valid type) succeeds with correct output -PASS getType(DOMString invalid type) succeeds with correct output -PASS getType(DOMString type) rejects correctly when querying for missing type -FAIL getType(DOMString valid type) converts DOMString to Blob assert_equals: expected (string) "text/plain" but got (undefined) undefined -FAIL getType(DOMString invalid type) converts DOMString to Blob assert_equals: expected (string) "not a/real type" but got (undefined) undefined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/idlharness-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/idlharness-expected.txt deleted file mode 100644 index f76169b..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/idlharness-expected.txt +++ /dev/null
@@ -1,29 +0,0 @@ -This is a testharness.js-based test. -FAIL idl_test setup promise_test: Unhandled rejection with value: object "TypeError: window.getPseudoElements is not a function" -PASS idl_test validation -PASS Partial interface Element: original interface defined -PASS Partial interface Element: member names are unique -PASS Element includes ParentNode: member names are unique -PASS Element includes NonDocumentTypeChildNode: member names are unique -PASS Element includes ChildNode: member names are unique -PASS Element includes Slottable: member names are unique -FAIL CSSPseudoElement interface: existence and properties of interface object assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface object length assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface object name assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface: attribute type assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface: attribute element assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface: attribute parent assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement interface: operation pseudo(CSSOMString) assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing -FAIL CSSPseudoElement must be primary interface of beforeElements.item(0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined" -FAIL Stringification of beforeElements.item(0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined" -FAIL CSSPseudoElement interface: beforeElements.item(0) must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined" -FAIL CSSPseudoElement interface: beforeElements.item(0) must inherit property "element" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined" -FAIL CSSPseudoElement interface: beforeElements.item(0) must inherit property "parent" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined" -FAIL CSSPseudoElement interface: beforeElements.item(0) must inherit property "pseudo(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined" -FAIL CSSPseudoElement interface: calling pseudo(CSSOMString) on beforeElements.item(0) with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined" -FAIL Element interface: operation pseudo(CSSOMString) assert_own_property: interface prototype object missing non-static operation expected property "pseudo" missing -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png index c6cd040f..e62aa23 100644 --- a/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ b/third_party/blink/web_tests/platform/generic/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/generic/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png index d22fa23cb..7e04575a 100644 --- a/third_party/blink/web_tests/platform/generic/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ b/third_party/blink/web_tests/platform/generic/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt deleted file mode 100644 index d5f35b07..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -PASS Setup -PASS Anonymous same-origin iframe is loaded without credentials -PASS Anonymous cross-origin iframe is loaded without credentials -PASS same_origin anonymous iframe can't send same_origin credentials -PASS same_origin anonymous iframe can't send cross_origin credentials -PASS cross_origin anonymous iframe can't send cross_origin credentials -PASS cross_origin anonymous iframe can't send same_origin credentials -PASS same_origin anonymous iframe can't send same_origin credentials on child iframe -PASS same_origin anonymous iframe can't send cross_origin credentials on child iframe -PASS cross_origin anonymous iframe can't send cross_origin credentials on child iframe -PASS cross_origin anonymous iframe can't send same_origin credentials on child iframe -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/unique-cookie-partition.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/unique-cookie-partition.https-expected.txt deleted file mode 100644 index 80040e9..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/unique-cookie-partition.https-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Cookie access from top-level fenced frame -PASS Cookie access from iframe nested in a fenced frame -PASS Cookie access from nested fenced frame -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt deleted file mode 100644 index d5f35b07..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -PASS Setup -PASS Anonymous same-origin iframe is loaded without credentials -PASS Anonymous cross-origin iframe is loaded without credentials -PASS same_origin anonymous iframe can't send same_origin credentials -PASS same_origin anonymous iframe can't send cross_origin credentials -PASS cross_origin anonymous iframe can't send cross_origin credentials -PASS cross_origin anonymous iframe can't send same_origin credentials -PASS same_origin anonymous iframe can't send same_origin credentials on child iframe -PASS same_origin anonymous iframe can't send cross_origin credentials on child iframe -PASS cross_origin anonymous iframe can't send cross_origin credentials on child iframe -PASS cross_origin anonymous iframe can't send same_origin credentials on child iframe -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/unique-cookie-partition.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/unique-cookie-partition.https-expected.txt deleted file mode 100644 index 80040e9..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/unique-cookie-partition.https-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Cookie access from top-level fenced frame -PASS Cookie access from iframe nested in a fenced frame -PASS Cookie access from nested fenced frame -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/platform/generic/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png new file mode 100644 index 0000000..29a3caa --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-layer-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-expected.png new file mode 100644 index 0000000..110e5c5 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-seek-expected.png new file mode 100644 index 0000000..92f3683 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-seek-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-seek-object-fit-expected.png new file mode 100644 index 0000000..c7a0892c --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/media-gpu-accelerated/media/color-profile-video-seek-object-fit-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/offsetparent-old-behavior/external/wpt/shadow-dom/offsetParent-across-shadow-boundaries-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/offsetparent-old-behavior/external/wpt/shadow-dom/offsetParent-across-shadow-boundaries-expected.txt deleted file mode 100644 index 9b46c72..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/offsetparent-old-behavior/external/wpt/shadow-dom/offsetParent-across-shadow-boundaries-expected.txt +++ /dev/null
@@ -1,19 +0,0 @@ -This is a testharness.js-based test. -PASS offsetParent must return the offset parent in the same shadow tree of open mode -PASS offsetParent must return the offset parent in the same shadow tree of closed mode -PASS offsetParent must return the offset parent in the same shadow tree of open mode even when nested -PASS offsetParent must return the offset parent in the same shadow tree of closed mode even when nested -FAIL offsetParent must skip offset parents of an element when the context object is assigned to a slot in a shadow tree of open mode assert_equals: expected Element node <div id="container" style="position: relative"><div><div ... but got Element node <div style="position: relative; padding-left: 85px; paddi... -PASS offsetParent must skip offset parents of an element when the context object is assigned to a slot in a shadow tree of closed mode -FAIL offsetParent must skip multiple offset parents of an element when the context object is assigned to a slot in a shadow tree of open mode assert_equals: expected Element node <div id="container" style="position: relative"><div style... but got Element node <div style="position: absolute; top: 10px; left: 10px;"><... -PASS offsetParent must skip multiple offset parents of an element when the context object is assigned to a slot in a shadow tree of closed mode -FAIL offsetParent must skip offset parents of an element when the context object is assigned to a slot in nested shadow trees of open mode assert_equals: expected Element node <div id="container" style="position: relative"><section><... but got Element node <div style="position: absolute; top: 200px; margin-left: ... -PASS offsetParent must skip offset parents of an element when the context object is assigned to a slot in nested shadow trees of closed mode -FAIL offsetParent must find the first offset parent which is a shadow-including ancestor of the context object even some shadow tree of open mode did not have any offset parent assert_equals: expected Element node <div id="container" style="position: relative"><section><... but got Element node <div style="position: absolute; top: 23px; left: 24px;"><... -PASS offsetParent must find the first offset parent which is a shadow-including ancestor of the context object even some shadow tree of closed mode did not have any offset parent -PASS offsetParent must return null on a child element of a shadow host for the shadow tree in open mode which is not assigned to any slot -PASS offsetParent must return null on a child element of a shadow host for the shadow tree in closed mode which is not assigned to any slot -PASS offsetParent must return null on a child element of a shadow host for the shadow tree in open mode which is not in the flat tree -PASS offsetParent must return null on a child element of a shadow host for the shadow tree in closed mode which is not in the flat tree -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/external/wpt/cookies/partitioned-cookies/partitioned-cookies.tentative.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/external/wpt/cookies/partitioned-cookies/partitioned-cookies.tentative.https-expected.txt deleted file mode 100644 index 058e7fc..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/external/wpt/cookies/partitioned-cookies/partitioned-cookies.tentative.https-expected.txt +++ /dev/null
@@ -1,10 +0,0 @@ -This is a testharness.js-based test. -PASS Partitioned cookies accessible on the top-level site they are created in via HTTP -PASS Partitioned cookies accessible on the top-level site they are created in via DOM -PASS Partitioned cookies accessible on the top-level site they are created in via CookieStore -PASS Cross-site window opened correctly -PASS Partitioned cookies are not accessible on a different top-level site via HTTP -PASS Partitioned cookies are not accessible on a different top-level site via DOM -PASS Partitioned cookies are not accessible on a different top-level site via CookieStore -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt deleted file mode 100644 index d5f35b07..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/external/wpt/html/anonymous-iframe/cookie.tentative.https.window-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -This is a testharness.js-based test. -PASS Setup -PASS Anonymous same-origin iframe is loaded without credentials -PASS Anonymous cross-origin iframe is loaded without credentials -PASS same_origin anonymous iframe can't send same_origin credentials -PASS same_origin anonymous iframe can't send cross_origin credentials -PASS cross_origin anonymous iframe can't send cross_origin credentials -PASS cross_origin anonymous iframe can't send same_origin credentials -PASS same_origin anonymous iframe can't send same_origin credentials on child iframe -PASS same_origin anonymous iframe can't send cross_origin credentials on child iframe -PASS cross_origin anonymous iframe can't send cross_origin credentials on child iframe -PASS cross_origin anonymous iframe can't send same_origin credentials on child iframe -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/http/tests/cookies/partitioned-cookies/clear-site-data.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/http/tests/cookies/partitioned-cookies/clear-site-data.https-expected.txt deleted file mode 100644 index 5e23b5e..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/http/tests/cookies/partitioned-cookies/clear-site-data.https-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -CONSOLE MESSAGE: Clear-Site-Data header on 'https://cookies.not-example.test:8443/cookies/resources/clear-site-data.php': Cleared data types: "cookies". Clearing channel IDs and HTTP authentication cache is currently not supported, as it breaks active network connections. -CONSOLE MESSAGE: Clear-Site-Data header on 'https://cookies.not-example.test:8443/cookies/resources/clear-site-data.php': Cleared data types: "cookies". Clearing channel IDs and HTTP authentication cache is currently not supported, as it breaks active network connections. -This is a testharness.js-based test. -PASS Clearing partitioned cookies -PASS Clearing partitioned cookies in another partition -PASS Opened page from first partition -PASS Clear-Site-Data does not leak across partitions -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/http/tests/inspector-protocol/network/cookies-protocol-test-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/http/tests/inspector-protocol/network/cookies-protocol-test-expected.txt deleted file mode 100644 index c5384f6..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/partitioned-cookies/http/tests/inspector-protocol/network/cookies-protocol-test-expected.txt +++ /dev/null
@@ -1,224 +0,0 @@ -Tests that cookies are set, updated and removed. -Test started -Enabling network - -Running test: deleteAllCookies - -Running test: simpleCookieAdd -Setting Cookie -Num of cookies 1 -name: foo, value: bar1, domain: 127.0.0.1, path: /, session - -Running test: simpleCookieChange -Setting Cookie -Num of cookies 1 -name: foo, value: second bar2, domain: 127.0.0.1, path: /, session - -Running test: anotherSimpleCookieAdd -Setting Cookie -Num of cookies 2 -name: foo, value: second bar2, domain: 127.0.0.1, path: /, session -name: foo2, value: bar1, domain: 127.0.0.1, path: /, session - -Running test: simpleCookieDelete -Deleting Cookie -Num of cookies 1 -name: foo2, value: bar1, domain: 127.0.0.1, path: /, session - -Running test: deleteAllCookies - -Running test: sessionCookieAdd -Setting Cookie -Num of cookies 1 -name: foo, value: bar4, domain: 127.0.0.1, path: /, session - -Running test: deleteAllCookies - -Running test: nonSessionCookieZeroAdd -Setting Cookie -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: nonSessionCookieAdd -Setting Cookie -Num of cookies 1 -name: foo, value: bar6, domain: 127.0.0.1, path: /, expires - -Running test: deleteAllCookies - -Running test: differentOriginCookieAdd -Setting Cookie -Num of cookies 1 -name: foo, value: bar7, domain: example.com, path: /, session - -Running test: deleteAllCookies - -Running test: invalidCookieAddDomain -Setting Cookie -setCookie failed: URL must have scheme http or https -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: invalidCookieAddName -Setting Cookie -setCookie failed: Sanitizing cookie failed -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: invalidCookieSourceScheme -Setting Cookie -setCookie failed: Invalid cookie source scheme -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: invalidCookieSourcePort -Setting Cookie -setCookie failed: Invalid source port -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: secureCookieAdd -Setting Cookie -Num of cookies 1 -name: foo, value: bar, domain: 127.0.0.1, path: /, secure, session - -Running test: deleteAllCookies - -Running test: cookieAddHttpOnly -Setting Cookie -Num of cookies 1 -name: foo, value: bar, domain: 127.0.0.1, path: /, httpOnly, session - -Running test: deleteAllCookies - -Running test: cookieAddSameSiteLax -Setting Cookie -Num of cookies 1 -name: foo, value: bar, domain: 127.0.0.1, path: /, session, Lax - -Running test: deleteAllCookies - -Running test: cookieAddSameSiteLax -Setting Cookie -Num of cookies 1 -name: foo, value: bar, domain: 127.0.0.1, path: /, session, Strict - -Running test: deleteAllCookies - -Running test: setCookiesBasic -Adding multiple cookies -Num of cookies 8 -name: cookie1, value: session, domain: localhost, path: /, session -name: cookie2, value: httpOnly, domain: localhost, path: /, httpOnly, session -name: cookie3, value: secure, domain: localhost, path: /, secure, session -name: cookie4, value: lax, domain: localhost, path: /, session, Lax -name: cookie5, value: expires, domain: localhost, path: /, expires -name: cookie6, value: .domain, domain: .chromium.org, path: /path, session -name: cookie7, value: domain, domain: www.chromium.org, path: /path, session -name: cookie8, value: url-based, domain: www.chromium.org, path: /, secure, session - -Running test: deleteAllCookies - -Running test: setCookiesWithInvalidCookie -Adding multiple cookies -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: deleteCookieByURL -Adding multiple cookies -Num of cookies 2 -name: cookie1, value: .domain, domain: www.chromium.org, path: /, session -name: cookie2, value: .domain, domain: www.chromium.org, path: /, expires -Deleting Cookie -Num of cookies 1 -name: cookie2, value: .domain, domain: www.chromium.org, path: /, expires - -Running test: deleteAllCookies - -Running test: deleteCookieByDomain -Adding multiple cookies -Num of cookies 2 -name: cookie1, value: .domain, domain: .chromium.org, path: /path, session -name: cookie2, value: .domain, domain: .chromium.org, path: /path, expires -Deleting Cookie -Num of cookies 1 -name: cookie2, value: .domain, domain: .chromium.org, path: /path, expires -Deleting Cookie -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: deleteCookieByDomainAndPath -Adding multiple cookies -Num of cookies 1 -name: cookie1, value: .domain, domain: .chromium.org, path: /path, session -Deleting Cookie -Num of cookies 1 -name: cookie1, value: .domain, domain: .chromium.org, path: /path, session -Deleting Cookie -Num of cookies 0 - -Running test: deleteAllCookies - -Running test: nonUnicodeCookie -Adding multiple cookies -Num of cookies 1 -name: cookie1, value: привет, domain: .chromium.org, path: /path, session - -Running test: deleteAllCookies - -Running test: setCookieViaFetch -Num of cookies 1 -name: name, value: value, domain: 127.0.0.1, path: /inspector-protocol/network/resources, session - -Running test: deleteAllCookies - -Running test: printCookieViaFetch -Cookies as seen on server: "HTTP_COOKIE: foo=bar1\n" - -Running test: deleteAllCookies - -Running test: setPartitionedCookie -Setting Cookie -Num of cookies 1 -name: __Host-foo, value: bar, domain: devtools.test, path: /, partitionKey: https://example.test, secure, session, None -Setting Cookie -Num of cookies 2 -name: __Host-foo, value: bar, domain: devtools.test, path: /, partitionKey: https://example.test, secure, session, None -name: __Host-foo, value: bar, domain: example.test, path: /, partitionKey: https://devtools.test, secure, session, None -Setting Cookie -Num of cookies 3 -name: __Host-foo, value: bar, domain: devtools.test, path: /, partitionKey: https://example.test, secure, session, None -name: __Host-foo, value: bar, domain: example.test, path: /, partitionKey: https://devtools.test, secure, session, None -name: __Host-foo, value: bar, domain: example.test, path: /, partitionKey: https://notinset.test, secure, session, None - -Running test: deleteAllCookies - -Running test: logCookies -Num of cookies 0 - -Running test: setPartitionedCookies -Adding multiple cookies -Num of cookies 3 -name: __Host-foo, value: bar, domain: devtools.test, path: /, partitionKey: https://example.test, secure, session, None -name: __Host-foo, value: bar, domain: example.test, path: /, partitionKey: https://devtools.test, secure, session, None -name: __Host-foo, value: bar, domain: example.test, path: /, partitionKey: https://notinset.test, secure, session, None - -Running test: getPartitionedCookie -Num of cookies 1 -name: __Host-foo, value: bar, domain: example.test, path: /, partitionKey: https://devtools.test, secure, session, None - -Running test: deleteAllCookies - -Running test: getPartitionedCookieFromOpaqueOrigin -Num of cookies 1 -name: __Host-foo, value: bar, domain: example.test, path: /, partitionKey: <opaque>, secure, session, None - -Running test: deleteAllCookies -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/fetch/api/basic/response-null-body.any.sharedworker-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/fetch/api/basic/response-null-body.any.sharedworker-expected.txt deleted file mode 100644 index fa818f44..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/fetch/api/basic/response-null-body.any.sharedworker-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL Response.body is null for responses with status=204 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with method=HEAD assert_equals: the body should be null expected null but got object "[object ReadableStream]" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/fetch/content-type/script.window-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/fetch/content-type/script.window-expected.txt new file mode 100644 index 0000000..c425ce7 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/fetch/content-type/script.window-expected.txt
@@ -0,0 +1,34 @@ +This is a testharness.js-based test. +PASS Loading JSON… +PASS separate text/javascript;charset=windows-1252 +PASS separate text/javascript;";charset=windows-1252 +PASS separate text/javascript +PASS separate "text/javascript" +PASS separate text/ javascript +PASS separate text /javascript +FAIL separate x/x text/javascript assert_unreached: onerror Reached unreachable code +FAIL combined x/x text/javascript assert_unreached: onerror Reached unreachable code +FAIL separate x/x;charset=windows-1252 text/javascript assert_unreached: onerror Reached unreachable code +FAIL combined x/x;charset=windows-1252 text/javascript assert_unreached: onerror Reached unreachable code +FAIL separate text/javascript x/x assert_unreached: onload Reached unreachable code +FAIL combined text/javascript x/x assert_unreached: onload Reached unreachable code +PASS separate text/javascript; charset=windows-1252 text/javascript +PASS combined text/javascript; charset=windows-1252 text/javascript +PASS separate text/javascript;" x/x +PASS combined text/javascript;" x/x +PASS separate text/javascript +PASS combined text/javascript +PASS separate text/javascript error +PASS combined text/javascript error +PASS separate text/javascript;charset=windows-1252 x/x text/javascript +PASS combined text/javascript;charset=windows-1252 x/x text/javascript +PASS separate text/javascript;charset=windows-1252 error text/javascript +PASS combined text/javascript;charset=windows-1252 error text/javascript +PASS separate text/javascript;charset=windows-1252 text/javascript +PASS combined text/javascript;charset=windows-1252 text/javascript +FAIL separate text/javascript;charset=windows-1252;" \" x/x assert_equals: expected "€" but got "€" +PASS combined text/javascript;charset=windows-1252;" \" x/x +FAIL separate x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: onerror Reached unreachable code +FAIL combined x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: onerror Reached unreachable code +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/resource-timing-fetch-variants.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/resource-timing-fetch-variants.https-expected.txt new file mode 100644 index 0000000..9166fc4 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/resource-timing-fetch-variants.https-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +PASS Redirects done from within a service-worker should not be exposed to client ResourceTiming +PASS Connection info from within a service-worker should not be exposed to client ResourceTiming +FAIL requestStart should never be before fetchStart assert_not_equals: got disallowed value "back" +PASS Delay from within service-worker (after internal fetching) should be accessible through `responseStart` +PASS Delay from within service-worker (before internal fetching) should be measured before responseStart in the client ResourceTiming entry +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/http/tests/devtools/elements/node-xpath-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/http/tests/devtools/elements/node-xpath-expected.txt new file mode 100644 index 0000000..48e43b1 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/plz-dedicated-worker/http/tests/devtools/elements/node-xpath-expected.txt
@@ -0,0 +1,25 @@ +Tests node xPath construction + +'#document':'' - '/' - '/' + '#comment':' Pre-comment ' - '/comment()[1]' - '/comment()[1]' + 'html':'' - '/html' - '/html' + 'head':'' - '/html/head' - '/html/head' + 'script':'' - '/html/head/script' - '/html/head/script' + '#text':'\n// Comment\n//' - '/html/head/script/text()[1]' - '/html/head/script/text()[1]' + '#cdata-section':'\nfunction f()\n{\n document.write("<");\n}\n//' - '/html/head/script/text()[2]' - '/html/head/script/text()[2]' + 'body':'' - '/html/body' - '/html/body' + 'div':'' - '//*[@id="id1"]' - '/html/body/div[1]' + 'div':'' - '//*[@id="id2"]' - '/html/body/div[2]' + 'div':'' - '//*[@id="container"]' - '/html/body/div[3]' + 'div':'' - '//*[@id="id3"]' - '/html/body/div[3]/div[1]' + '#text':'3 Prefix ' - '//*[@id="id3"]/text()[1]' - '/html/body/div[3]/div[1]/text()[1]' + '#cdata-section':'<greeting>Hello, world!</greeting>' - '//*[@id="id3"]/text()[2]' - '/html/body/div[3]/div[1]/text()[2]' + '#text':' Suffix' - '//*[@id="id3"]/text()[3]' - '/html/body/div[3]/div[1]/text()[3]' + 'div':'' - '//*[@id="id4"]' - '/html/body/div[3]/div[2]' + '#text':'4' - '//*[@id="id4"]/text()' - '/html/body/div[3]/div[2]/text()' + 'div':'' - '//*[@id="id5"]' - '/html/body/div[3]/div[3]' + '#text':'5' - '//*[@id="id5"]/text()' - '/html/body/div[3]/div[3]/text()' + 'div':'' - '//*[@id="id6"]' - '/html/body/div[3]/div[4]' + '#text':'6' - '//*[@id="id6"]/text()' - '/html/body/div[3]/div[4]/text()' + '#comment':' Post-comment ' - '/comment()[2]' - '/comment()[2]' +
diff --git a/third_party/blink/web_tests/platform/generic/virtual/prefer_compositing_to_lcd_text/compositing/overflow/clip-content-under-overflow-controls-expected.png b/third_party/blink/web_tests/platform/generic/virtual/prefer_compositing_to_lcd_text/compositing/overflow/clip-content-under-overflow-controls-expected.png deleted file mode 100644 index 797fa6c1..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/prefer_compositing_to_lcd_text/compositing/overflow/clip-content-under-overflow-controls-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/fast/dom/Window/window-resize-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/fast/dom/Window/window-resize-expected.txt deleted file mode 100644 index 462122c..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/stable/fast/dom/Window/window-resize-expected.txt +++ /dev/null
@@ -1,143 +0,0 @@ -This test makes sure that we have similar behavior as other browsers when resizing and moving a window outside of the screen. This test will fail in some dimensions when run manually because of inconsistencies of when the window can and cannot go behind the doc. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - - - -window.resizeTo Tests - - -Testing - resizeTo: Too Big -PASS window.outerWidth == screen.availWidth is true - - -Testing - resizeTo: Too Small -PASS window.outerWidth == 100 is true - - -Testing - resizeTo: Full Screen Out of Bounds -PASS window.screenY == screen.availTop is true -PASS window.outerHeight == screen.availHeight is true -PASS window.screenX == screen.availLeft is true -PASS window.outerWidth == screen.availWidth is true - - -Testing - resizeTo: Not Full Screen Out of Bounds -PASS window.outerHeight + window.screenY - screen.availTop == screen.availHeight is true -PASS window.outerWidth + window.screenX - screen.availLeft == screen.availWidth is true - - -window.resizeBy Tests - - -Testing - resizeBy: Too Small -PASS window.outerWidth == 100 is true - - -Testing - resizeBy: Too Big -PASS window.outerWidth == screen.availWidth is true - - -window.moveTo Tests - - -Testing - moveTo: Top Left -PASS window.screenY == screen.availTop is true -PASS window.screenX == screen.availLeft is true - - -Testing - moveTo: Top -PASS window.screenY == screen.availTop is true -PASS window.screenX == screen.availLeft is true - - -Testing - moveTo: Top Right -PASS window.screenY == screen.availTop is true -PASS window.outerWidth == screen.availWidth is true - - -Testing - moveTo: Right -PASS window.screenY == screen.availTop is true -PASS window.outerWidth == screen.availWidth is true - - -Testing - moveTo: Bottom Right -PASS window.outerHeight == screen.availHeight is true -PASS window.outerWidth == screen.availWidth is true - - -Testing - moveTo: Bottom -PASS window.outerHeight == screen.availHeight is true -PASS window.screenX == screen.availLeft is true - - -Testing - moveTo: Bottom Left -PASS window.outerHeight == screen.availHeight is true -PASS window.screenX == screen.availLeft is true - - -Testing - moveTo: Left -PASS window.screenY == screen.availTop is true -PASS window.screenX == screen.availLeft is true - - -window.moveBy Tests - - -Testing - moveBy: Zero Zero -PASS window.screenX == previousScreenX is true -PASS window.screenY == previousScreenY is true - - -Testing - moveBy: One Zero -PASS window.screenX == previousScreenX + 1 is true -PASS window.screenY == previousScreenY is true - - -Testing - moveBy: Zero One -PASS window.screenX == previousScreenX is true -PASS window.screenY == previousScreenY + 1 is true - - -Testing - moveBy: Top Left -PASS window.screenY == screen.availTop is true -PASS window.screenX == screen.availLeft is true - - -Testing - moveBy: Top -PASS window.screenY == screen.availTop is true -PASS window.screenX == screen.availLeft is true - - -Testing - moveBy: Top Right -PASS window.screenY == screen.availTop is true -PASS window.outerWidth == screen.availWidth is true - - -Testing - moveBy: Right -PASS window.screenY == screen.availTop is true -PASS window.outerWidth == screen.availWidth is true - - -Testing - moveBy: Bottom Right -PASS window.outerHeight == screen.availHeight is true -PASS window.outerWidth == screen.availWidth is true - - -Testing - moveBy: Bottom -PASS window.outerHeight == screen.availHeight is true - - -Testing - moveBy: Bottom Left -PASS window.outerHeight == screen.availHeight is true -PASS window.screenX == screen.availLeft is true - - -Testing - moveBy: Left -PASS window.screenX == screen.availLeft is true - - -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/navigation/location-change-repeated-from-blank-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/navigation/location-change-repeated-from-blank-expected.txt new file mode 100644 index 0000000..4dec770 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/navigation/location-change-repeated-from-blank-expected.txt
@@ -0,0 +1,10 @@ +This test checks the following case: +* Create an iframe +* Set its location to about:blank +* In a setTimeout(), navigate to a non-blank page +The iframe navigations should not create new history entries, even though the non-blank navigation is after the load (there is only one history entry in the iframe context, and it is about:blank). + +============== Back Forward List ============== +curr-> http://127.0.0.1:8000/navigation/location-change-repeated-from-blank.html + http://127.0.0.1:8000/navigation/resources/pass-and-notify-done.html (in frame "i") +===============================================
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/worklet/webexposed/global-interface-listing-audio-worklet-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/worklet/webexposed/global-interface-listing-audio-worklet-expected.txt deleted file mode 100644 index 3a787a0..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/worklet/webexposed/global-interface-listing-audio-worklet-expected.txt +++ /dev/null
@@ -1,168 +0,0 @@ -CONSOLE MESSAGE: This test logs exposed APIs from AudioWorkletGlobalScope -CONSOLE MESSAGE: [INTERFACES] -CONSOLE MESSAGE: interface AudioWorkletGlobalScope : WorkletGlobalScope -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: interface AudioWorkletProcessor -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter port -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: interface ByteLengthQueuingStrategy -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter highWaterMark -CONSOLE MESSAGE: getter size -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: interface CountQueuingStrategy -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter highWaterMark -CONSOLE MESSAGE: getter size -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: interface Event -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: attribute AT_TARGET -CONSOLE MESSAGE: attribute BUBBLING_PHASE -CONSOLE MESSAGE: attribute CAPTURING_PHASE -CONSOLE MESSAGE: attribute NONE -CONSOLE MESSAGE: getter bubbles -CONSOLE MESSAGE: getter cancelBubble -CONSOLE MESSAGE: getter cancelable -CONSOLE MESSAGE: getter composed -CONSOLE MESSAGE: getter currentTarget -CONSOLE MESSAGE: getter defaultPrevented -CONSOLE MESSAGE: getter eventPhase -CONSOLE MESSAGE: getter path -CONSOLE MESSAGE: getter returnValue -CONSOLE MESSAGE: getter srcElement -CONSOLE MESSAGE: getter target -CONSOLE MESSAGE: getter timeStamp -CONSOLE MESSAGE: getter type -CONSOLE MESSAGE: method composedPath -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method initEvent -CONSOLE MESSAGE: method preventDefault -CONSOLE MESSAGE: method stopImmediatePropagation -CONSOLE MESSAGE: method stopPropagation -CONSOLE MESSAGE: setter cancelBubble -CONSOLE MESSAGE: setter returnValue -CONSOLE MESSAGE: interface EventTarget -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: method addEventListener -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method dispatchEvent -CONSOLE MESSAGE: method removeEventListener -CONSOLE MESSAGE: interface MessageEvent : Event -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter data -CONSOLE MESSAGE: getter lastEventId -CONSOLE MESSAGE: getter origin -CONSOLE MESSAGE: getter ports -CONSOLE MESSAGE: getter source -CONSOLE MESSAGE: getter userActivation -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method initMessageEvent -CONSOLE MESSAGE: interface MessagePort : EventTarget -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter onmessage -CONSOLE MESSAGE: getter onmessageerror -CONSOLE MESSAGE: method close -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method postMessage -CONSOLE MESSAGE: method start -CONSOLE MESSAGE: setter onmessage -CONSOLE MESSAGE: setter onmessageerror -CONSOLE MESSAGE: interface ReadableByteStreamController -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter byobRequest -CONSOLE MESSAGE: getter desiredSize -CONSOLE MESSAGE: method close -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method enqueue -CONSOLE MESSAGE: method error -CONSOLE MESSAGE: interface ReadableStream -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter locked -CONSOLE MESSAGE: method cancel -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method getReader -CONSOLE MESSAGE: method pipeThrough -CONSOLE MESSAGE: method pipeTo -CONSOLE MESSAGE: method tee -CONSOLE MESSAGE: interface ReadableStreamBYOBReader -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter closed -CONSOLE MESSAGE: method cancel -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method read -CONSOLE MESSAGE: method releaseLock -CONSOLE MESSAGE: interface ReadableStreamBYOBRequest -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter view -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method respond -CONSOLE MESSAGE: method respondWithNewView -CONSOLE MESSAGE: interface ReadableStreamDefaultController -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter desiredSize -CONSOLE MESSAGE: method close -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method enqueue -CONSOLE MESSAGE: method error -CONSOLE MESSAGE: interface ReadableStreamDefaultReader -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter closed -CONSOLE MESSAGE: method cancel -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method read -CONSOLE MESSAGE: method releaseLock -CONSOLE MESSAGE: interface TransformStream -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter readable -CONSOLE MESSAGE: getter writable -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: interface TransformStreamDefaultController -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter desiredSize -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method enqueue -CONSOLE MESSAGE: method error -CONSOLE MESSAGE: method terminate -CONSOLE MESSAGE: interface UserActivation -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter hasBeenActive -CONSOLE MESSAGE: getter isActive -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: interface WorkletGlobalScope -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: interface WritableStream -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter locked -CONSOLE MESSAGE: method abort -CONSOLE MESSAGE: method close -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method getWriter -CONSOLE MESSAGE: interface WritableStreamDefaultController -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter signal -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method error -CONSOLE MESSAGE: interface WritableStreamDefaultWriter -CONSOLE MESSAGE: attribute @@toStringTag -CONSOLE MESSAGE: getter closed -CONSOLE MESSAGE: getter desiredSize -CONSOLE MESSAGE: getter ready -CONSOLE MESSAGE: method abort -CONSOLE MESSAGE: method close -CONSOLE MESSAGE: method constructor -CONSOLE MESSAGE: method releaseLock -CONSOLE MESSAGE: method write -CONSOLE MESSAGE: [NAMESPACES] -CONSOLE MESSAGE: [GLOBAL OBJECT] -CONSOLE MESSAGE: attribute console -CONSOLE MESSAGE: attribute globalThis -CONSOLE MESSAGE: getter currentFrame -CONSOLE MESSAGE: getter currentTime -CONSOLE MESSAGE: getter sampleRate -CONSOLE MESSAGE: method gc -CONSOLE MESSAGE: method registerProcessor -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/third-party-storage-partitioning/external/wpt/IndexedDB/idb-partitioned-persistence.tentative.sub-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/third-party-storage-partitioning/external/wpt/IndexedDB/idb-partitioned-persistence.tentative.sub-expected.txt deleted file mode 100644 index c06bd21..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/third-party-storage-partitioning/external/wpt/IndexedDB/idb-partitioned-persistence.tentative.sub-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -PASS Persistence test for partitioned IndexedDB -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/third-party-storage-partitioning/fast/filesystem/simple-persistent-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/third-party-storage-partitioning/fast/filesystem/simple-persistent-expected.txt new file mode 100644 index 0000000..4a7d057 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/third-party-storage-partitioning/fast/filesystem/simple-persistent-expected.txt
@@ -0,0 +1,11 @@ +requestFileSystem PERSISTENT test. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +Successfully obtained PERSISTENT FileSystem:file__0:Persistent +PASS fileSystem.name.length > 0 is true +PASS fileSystem.root.fullPath is "/" +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/platform/generic/virtual/threaded/compositing/webgl/webgl-no-alpha-expected.png b/third_party/blink/web_tests/platform/generic/virtual/threaded/compositing/webgl/webgl-no-alpha-expected.png deleted file mode 100644 index aa254fa0a..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/threaded/compositing/webgl/webgl-no-alpha-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt deleted file mode 100644 index bf94399..0000000 --- a/third_party/blink/web_tests/platform/linux/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL SPC enrollment in cross-origin iframe assert_equals: expected null but got object "SecurityError: A user activation is required to create a credential in a cross-origin iframe." -PASS SPC enrollment in cross-origin iframe fails without user activation -PASS SPC enrollment in cross-origin iframe without payment permission -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations-expected.txt deleted file mode 100644 index c85db91..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/plz-dedicated-worker/http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -Checks that JavaScriptSourceFrame show inline breakpoints correctly - - -Running: testAddRemoveBreakpoint -Setting breakpoint -PROMISE FAILURE: undefined -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-vertical-expected.png deleted file mode 100644 index abc2a805..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-vertical-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png deleted file mode 100644 index 8e1fd7d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png deleted file mode 100644 index 47b0fb2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/service-workers/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/service-workers/idlharness.https.any.worker-expected.txt deleted file mode 100644 index 4feb2445..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/service-workers/idlharness.https.any.worker-expected.txt +++ /dev/null
@@ -1,157 +0,0 @@ -This is a testharness.js-based test. -Found 153 tests; 113 PASS, 40 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS idl_test validation -PASS Partial interface Navigator: original interface defined -PASS Partial interface Navigator: member names are unique -PASS Partial interface WorkerNavigator: original interface defined -PASS Partial interface WorkerNavigator: member names are unique -PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined -PASS Partial interface mixin WindowOrWorkerGlobalScope: member names are unique -PASS Partial interface mixin NavigatorID: member names are unique -PASS Partial interface Window: member names are unique -PASS ServiceWorker includes AbstractWorker: member names are unique -PASS Window includes GlobalEventHandlers: member names are unique -PASS Window includes WindowEventHandlers: member names are unique -PASS Window includes WindowOrWorkerGlobalScope: member names are unique -PASS WorkerGlobalScope includes WindowOrWorkerGlobalScope: member names are unique -PASS Navigator includes NavigatorID: member names are unique -PASS Navigator includes NavigatorLanguage: member names are unique -PASS Navigator includes NavigatorOnLine: member names are unique -PASS Navigator includes NavigatorContentUtils: member names are unique -PASS Navigator includes NavigatorCookies: member names are unique -PASS Navigator includes NavigatorPlugins: member names are unique -PASS Navigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes AnimationFrameProvider: member names are unique -PASS WorkerNavigator includes NavigatorID: member names are unique -PASS WorkerNavigator includes NavigatorLanguage: member names are unique -PASS WorkerNavigator includes NavigatorOnLine: member names are unique -PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes WindowSessionStorage: member names are unique -PASS Window includes WindowLocalStorage: member names are unique -FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, sequence<object>) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, optional StructuredSerializeOptions) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -PASS ServiceWorkerRegistration interface: existence and properties of interface object -PASS ServiceWorkerRegistration interface object length -PASS ServiceWorkerRegistration interface object name -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's @@unscopables property -PASS ServiceWorkerRegistration interface: attribute installing -PASS ServiceWorkerRegistration interface: attribute waiting -PASS ServiceWorkerRegistration interface: attribute active -PASS ServiceWorkerRegistration interface: attribute navigationPreload -PASS ServiceWorkerRegistration interface: attribute scope -PASS ServiceWorkerRegistration interface: attribute updateViaCache -PASS ServiceWorkerRegistration interface: operation update() -PASS ServiceWorkerRegistration interface: operation unregister() -PASS ServiceWorkerRegistration interface: attribute onupdatefound -FAIL ServiceWorkerContainer interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object length assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object name assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute controller assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute ready assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation register(USVString, optional RegistrationOptions) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistration(optional USVString) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistrations() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation startMessages() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute oncontrollerchange assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessage assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessageerror assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer must be primary interface of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL Stringification of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "controller" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "ready" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "register(USVString, optional RegistrationOptions)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling register(USVString, optional RegistrationOptions) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistration(optional USVString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling getRegistration(optional USVString) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistrations()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "startMessages()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "oncontrollerchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessage" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessageerror" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -PASS NavigationPreloadManager interface: existence and properties of interface object -PASS NavigationPreloadManager interface object length -PASS NavigationPreloadManager interface object name -PASS NavigationPreloadManager interface: existence and properties of interface prototype object -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's @@unscopables property -PASS NavigationPreloadManager interface: operation enable() -PASS NavigationPreloadManager interface: operation disable() -PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) -PASS NavigationPreloadManager interface: operation getState() -PASS ServiceWorkerGlobalScope interface: existence and properties of interface object -PASS Client interface: existence and properties of interface object -PASS WindowClient interface: existence and properties of interface object -PASS Clients interface: existence and properties of interface object -PASS ExtendableEvent interface: existence and properties of interface object -PASS FetchEvent interface: existence and properties of interface object -PASS ExtendableMessageEvent interface: existence and properties of interface object -PASS Cache interface: existence and properties of interface object -PASS Cache interface object length -PASS Cache interface object name -PASS Cache interface: existence and properties of interface prototype object -PASS Cache interface: existence and properties of interface prototype object's "constructor" property -PASS Cache interface: existence and properties of interface prototype object's @@unscopables property -PASS Cache interface: operation match(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation matchAll(optional RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation add(RequestInfo) -PASS Cache interface: operation addAll(sequence<RequestInfo>) -PASS Cache interface: operation put(RequestInfo, Response) -PASS Cache interface: operation delete(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation keys(optional RequestInfo, optional CacheQueryOptions) -PASS Cache must be primary interface of self.cacheInstance -PASS Stringification of self.cacheInstance -PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling match(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "matchAll(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling matchAll(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type -PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "addAll(sequence<RequestInfo>)" with the proper type -PASS Cache interface: calling addAll(sequence<RequestInfo>) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type -PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling delete(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "keys(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling keys(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS CacheStorage interface: existence and properties of interface object -PASS CacheStorage interface object length -PASS CacheStorage interface object name -PASS CacheStorage interface: existence and properties of interface prototype object -PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property -PASS CacheStorage interface: existence and properties of interface prototype object's @@unscopables property -PASS CacheStorage interface: operation match(RequestInfo, optional MultiCacheQueryOptions) -PASS CacheStorage interface: operation has(DOMString) -PASS CacheStorage interface: operation open(DOMString) -PASS CacheStorage interface: operation delete(DOMString) -PASS CacheStorage interface: operation keys() -PASS CacheStorage must be primary interface of caches -PASS Stringification of caches -PASS CacheStorage interface: caches must inherit property "match(RequestInfo, optional MultiCacheQueryOptions)" with the proper type -PASS CacheStorage interface: calling match(RequestInfo, optional MultiCacheQueryOptions) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "has(DOMString)" with the proper type -PASS CacheStorage interface: calling has(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "open(DOMString)" with the proper type -PASS CacheStorage interface: calling open(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "delete(DOMString)" with the proper type -PASS CacheStorage interface: calling delete(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "keys()" with the proper type -PASS WorkerGlobalScope interface: attribute caches -FAIL WorkerNavigator interface: attribute serviceWorker assert_true: The prototype object must have a property "serviceWorker" expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png deleted file mode 100644 index 8e1fd7d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png deleted file mode 100644 index 47b0fb2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.worker-expected.txt deleted file mode 100644 index 4feb2445..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.worker-expected.txt +++ /dev/null
@@ -1,157 +0,0 @@ -This is a testharness.js-based test. -Found 153 tests; 113 PASS, 40 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS idl_test validation -PASS Partial interface Navigator: original interface defined -PASS Partial interface Navigator: member names are unique -PASS Partial interface WorkerNavigator: original interface defined -PASS Partial interface WorkerNavigator: member names are unique -PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined -PASS Partial interface mixin WindowOrWorkerGlobalScope: member names are unique -PASS Partial interface mixin NavigatorID: member names are unique -PASS Partial interface Window: member names are unique -PASS ServiceWorker includes AbstractWorker: member names are unique -PASS Window includes GlobalEventHandlers: member names are unique -PASS Window includes WindowEventHandlers: member names are unique -PASS Window includes WindowOrWorkerGlobalScope: member names are unique -PASS WorkerGlobalScope includes WindowOrWorkerGlobalScope: member names are unique -PASS Navigator includes NavigatorID: member names are unique -PASS Navigator includes NavigatorLanguage: member names are unique -PASS Navigator includes NavigatorOnLine: member names are unique -PASS Navigator includes NavigatorContentUtils: member names are unique -PASS Navigator includes NavigatorCookies: member names are unique -PASS Navigator includes NavigatorPlugins: member names are unique -PASS Navigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes AnimationFrameProvider: member names are unique -PASS WorkerNavigator includes NavigatorID: member names are unique -PASS WorkerNavigator includes NavigatorLanguage: member names are unique -PASS WorkerNavigator includes NavigatorOnLine: member names are unique -PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes WindowSessionStorage: member names are unique -PASS Window includes WindowLocalStorage: member names are unique -FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, sequence<object>) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, optional StructuredSerializeOptions) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -PASS ServiceWorkerRegistration interface: existence and properties of interface object -PASS ServiceWorkerRegistration interface object length -PASS ServiceWorkerRegistration interface object name -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's @@unscopables property -PASS ServiceWorkerRegistration interface: attribute installing -PASS ServiceWorkerRegistration interface: attribute waiting -PASS ServiceWorkerRegistration interface: attribute active -PASS ServiceWorkerRegistration interface: attribute navigationPreload -PASS ServiceWorkerRegistration interface: attribute scope -PASS ServiceWorkerRegistration interface: attribute updateViaCache -PASS ServiceWorkerRegistration interface: operation update() -PASS ServiceWorkerRegistration interface: operation unregister() -PASS ServiceWorkerRegistration interface: attribute onupdatefound -FAIL ServiceWorkerContainer interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object length assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object name assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute controller assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute ready assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation register(USVString, optional RegistrationOptions) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistration(optional USVString) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistrations() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation startMessages() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute oncontrollerchange assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessage assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessageerror assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer must be primary interface of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL Stringification of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "controller" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "ready" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "register(USVString, optional RegistrationOptions)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling register(USVString, optional RegistrationOptions) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistration(optional USVString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling getRegistration(optional USVString) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistrations()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "startMessages()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "oncontrollerchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessage" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessageerror" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -PASS NavigationPreloadManager interface: existence and properties of interface object -PASS NavigationPreloadManager interface object length -PASS NavigationPreloadManager interface object name -PASS NavigationPreloadManager interface: existence and properties of interface prototype object -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's @@unscopables property -PASS NavigationPreloadManager interface: operation enable() -PASS NavigationPreloadManager interface: operation disable() -PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) -PASS NavigationPreloadManager interface: operation getState() -PASS ServiceWorkerGlobalScope interface: existence and properties of interface object -PASS Client interface: existence and properties of interface object -PASS WindowClient interface: existence and properties of interface object -PASS Clients interface: existence and properties of interface object -PASS ExtendableEvent interface: existence and properties of interface object -PASS FetchEvent interface: existence and properties of interface object -PASS ExtendableMessageEvent interface: existence and properties of interface object -PASS Cache interface: existence and properties of interface object -PASS Cache interface object length -PASS Cache interface object name -PASS Cache interface: existence and properties of interface prototype object -PASS Cache interface: existence and properties of interface prototype object's "constructor" property -PASS Cache interface: existence and properties of interface prototype object's @@unscopables property -PASS Cache interface: operation match(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation matchAll(optional RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation add(RequestInfo) -PASS Cache interface: operation addAll(sequence<RequestInfo>) -PASS Cache interface: operation put(RequestInfo, Response) -PASS Cache interface: operation delete(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation keys(optional RequestInfo, optional CacheQueryOptions) -PASS Cache must be primary interface of self.cacheInstance -PASS Stringification of self.cacheInstance -PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling match(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "matchAll(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling matchAll(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type -PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "addAll(sequence<RequestInfo>)" with the proper type -PASS Cache interface: calling addAll(sequence<RequestInfo>) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type -PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling delete(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "keys(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling keys(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS CacheStorage interface: existence and properties of interface object -PASS CacheStorage interface object length -PASS CacheStorage interface object name -PASS CacheStorage interface: existence and properties of interface prototype object -PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property -PASS CacheStorage interface: existence and properties of interface prototype object's @@unscopables property -PASS CacheStorage interface: operation match(RequestInfo, optional MultiCacheQueryOptions) -PASS CacheStorage interface: operation has(DOMString) -PASS CacheStorage interface: operation open(DOMString) -PASS CacheStorage interface: operation delete(DOMString) -PASS CacheStorage interface: operation keys() -PASS CacheStorage must be primary interface of caches -PASS Stringification of caches -PASS CacheStorage interface: caches must inherit property "match(RequestInfo, optional MultiCacheQueryOptions)" with the proper type -PASS CacheStorage interface: calling match(RequestInfo, optional MultiCacheQueryOptions) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "has(DOMString)" with the proper type -PASS CacheStorage interface: calling has(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "open(DOMString)" with the proper type -PASS CacheStorage interface: calling open(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "delete(DOMString)" with the proper type -PASS CacheStorage interface: calling delete(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "keys()" with the proper type -PASS WorkerGlobalScope interface: attribute caches -FAIL WorkerNavigator interface: attribute serviceWorker assert_true: The prototype object must have a property "serviceWorker" expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt deleted file mode 100644 index 8e68733..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Violations from data:-URL scripts have a sourceFile of 'data' assert_equals: expected 16 but got 17 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/css/css-color-adjust/inheritance-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/css/css-color-adjust/inheritance-expected.txt deleted file mode 100644 index bf66e73..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/css/css-color-adjust/inheritance-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -This is a testharness.js-based test. -PASS Property color-scheme has initial value normal -PASS Property color-scheme inherits -FAIL Property color-adjust has initial value economy assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property color-adjust inherits assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -PASS Property forced-color-adjust has initial value auto -PASS Property forced-color-adjust inherits -FAIL Property print-color-adjust has initial value economy assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property print-color-adjust inherits assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/css/selectors/focus-visible-025-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/css/selectors/focus-visible-025-expected.txt deleted file mode 100644 index dbad1a0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/css/selectors/focus-visible-025-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS ":focus-visible" should be a valid selector -FAIL :focus-visible matches after accesskey on DIV after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -FAIL :focus-visible matches after accesskey on BUTTON after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt deleted file mode 100644 index 249bdd21..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt +++ /dev/null
@@ -1,40 +0,0 @@ -This is a testharness.js-based test. -PASS Test execCommand with selection around select element -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select multiple><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select multiple><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select multiple><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select multiple><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select multiple><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select multiple> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select multiple> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select multiple contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <optgroup contenteditable><option>{abc}</option><option>def</option></optgroup>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <option contenteditable>{abc}</option>: shouldn't modify <option> -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt deleted file mode 100644 index 8b3c576e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL insertParagraph in empty <title style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <title style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <style style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <style style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <script style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <script style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <div style="white-space:pre"> in the <head> should split the <div> promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing only a <br>) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing text) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt deleted file mode 100644 index ee77d34..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL TextTrackCue.endTime, script-created cue Failed to set the 'endTime' property on 'TextTrackCue': The provided double value is non-finite. -PASS TextTrackCue.endTime, parsed cue -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt deleted file mode 100644 index f453bf19e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure should be applied to sent messages promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-ruby-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-ruby-expected.png deleted file mode 100644 index 895bc09..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-ruby-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-vertical-expected.png deleted file mode 100644 index cd31e60..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-vertical-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index 7e04575a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png deleted file mode 100644 index 8e1fd7d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png deleted file mode 100644 index 47b0fb2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/css/css-color-adjust/inheritance-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/css/css-color-adjust/inheritance-expected.txt deleted file mode 100644 index bf66e73..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/css/css-color-adjust/inheritance-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -This is a testharness.js-based test. -PASS Property color-scheme has initial value normal -PASS Property color-scheme inherits -FAIL Property color-adjust has initial value economy assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property color-adjust inherits assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -PASS Property forced-color-adjust has initial value auto -PASS Property forced-color-adjust inherits -FAIL Property print-color-adjust has initial value economy assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property print-color-adjust inherits assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/css/selectors/focus-visible-025-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/css/selectors/focus-visible-025-expected.txt deleted file mode 100644 index dbad1a0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/css/selectors/focus-visible-025-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS ":focus-visible" should be a valid selector -FAIL :focus-visible matches after accesskey on DIV after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -FAIL :focus-visible matches after accesskey on BUTTON after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt deleted file mode 100644 index 249bdd21..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt +++ /dev/null
@@ -1,40 +0,0 @@ -This is a testharness.js-based test. -PASS Test execCommand with selection around select element -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select multiple><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select multiple><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select multiple><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select multiple><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select multiple><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select multiple> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select multiple> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select multiple contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <optgroup contenteditable><option>{abc}</option><option>def</option></optgroup>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <option contenteditable>{abc}</option>: shouldn't modify <option> -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt deleted file mode 100644 index 8b3c576e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL insertParagraph in empty <title style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <title style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <style style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <style style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <script style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <script style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <div style="white-space:pre"> in the <head> should split the <div> promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing only a <br>) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing text) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt deleted file mode 100644 index f453bf19e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure should be applied to sent messages promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/media/track/track-cue-rendering-vertical-expected.png deleted file mode 100644 index cd31e60..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/media/track/track-cue-rendering-vertical-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index 7e04575a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png deleted file mode 100644 index 8e1fd7d..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png deleted file mode 100644 index 47b0fb2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/external/wpt/largest-contentful-paint/repeated-image-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/external/wpt/largest-contentful-paint/repeated-image-expected.txt deleted file mode 100644 index fa7db36..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/external/wpt/largest-contentful-paint/repeated-image-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -PASS Repeated image produces different timestamps. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/mac-mac11/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt deleted file mode 100644 index 8b3c576e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL insertParagraph in empty <title style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <title style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <style style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <style style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <script style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <script style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <div style="white-space:pre"> in the <head> should split the <div> promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing only a <br>) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing text) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac11/media/track/track-cue-rendering-vertical-expected.png deleted file mode 100644 index cd31e60..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/media/track/track-cue-rendering-vertical-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index 7e04575a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt deleted file mode 100644 index 8e68733..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Violations from data:-URL scripts have a sourceFile of 'data' assert_equals: expected 16 but got 17 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/css/css-color-adjust/inheritance-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/css/css-color-adjust/inheritance-expected.txt deleted file mode 100644 index bf66e73..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/css/css-color-adjust/inheritance-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -This is a testharness.js-based test. -PASS Property color-scheme has initial value normal -PASS Property color-scheme inherits -FAIL Property color-adjust has initial value economy assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property color-adjust inherits assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -PASS Property forced-color-adjust has initial value auto -PASS Property forced-color-adjust inherits -FAIL Property print-color-adjust has initial value economy assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property print-color-adjust inherits assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/css/selectors/focus-visible-025-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/css/selectors/focus-visible-025-expected.txt deleted file mode 100644 index dbad1a0..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/css/selectors/focus-visible-025-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS ":focus-visible" should be a valid selector -FAIL :focus-visible matches after accesskey on DIV after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -FAIL :focus-visible matches after accesskey on BUTTON after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt deleted file mode 100644 index 249bdd21..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt +++ /dev/null
@@ -1,40 +0,0 @@ -This is a testharness.js-based test. -PASS Test execCommand with selection around select element -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select multiple><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select multiple><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select multiple><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select multiple><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select multiple><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select multiple> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select multiple> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select multiple contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <optgroup contenteditable><option>{abc}</option><option>def</option></optgroup>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <option contenteditable>{abc}</option>: shouldn't modify <option> -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt deleted file mode 100644 index 8b3c576e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL insertParagraph in empty <title style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <title style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <style style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <style style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <script style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <script style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <div style="white-space:pre"> in the <head> should split the <div> promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing only a <br>) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing text) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt deleted file mode 100644 index ee77d34..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL TextTrackCue.endTime, script-created cue Failed to set the 'endTime' property on 'TextTrackCue': The provided double value is non-finite. -PASS TextTrackCue.endTime, parsed cue -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/service-workers/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/service-workers/idlharness.https.any.worker-expected.txt deleted file mode 100644 index 4feb2445..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/service-workers/idlharness.https.any.worker-expected.txt +++ /dev/null
@@ -1,157 +0,0 @@ -This is a testharness.js-based test. -Found 153 tests; 113 PASS, 40 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS idl_test validation -PASS Partial interface Navigator: original interface defined -PASS Partial interface Navigator: member names are unique -PASS Partial interface WorkerNavigator: original interface defined -PASS Partial interface WorkerNavigator: member names are unique -PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined -PASS Partial interface mixin WindowOrWorkerGlobalScope: member names are unique -PASS Partial interface mixin NavigatorID: member names are unique -PASS Partial interface Window: member names are unique -PASS ServiceWorker includes AbstractWorker: member names are unique -PASS Window includes GlobalEventHandlers: member names are unique -PASS Window includes WindowEventHandlers: member names are unique -PASS Window includes WindowOrWorkerGlobalScope: member names are unique -PASS WorkerGlobalScope includes WindowOrWorkerGlobalScope: member names are unique -PASS Navigator includes NavigatorID: member names are unique -PASS Navigator includes NavigatorLanguage: member names are unique -PASS Navigator includes NavigatorOnLine: member names are unique -PASS Navigator includes NavigatorContentUtils: member names are unique -PASS Navigator includes NavigatorCookies: member names are unique -PASS Navigator includes NavigatorPlugins: member names are unique -PASS Navigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes AnimationFrameProvider: member names are unique -PASS WorkerNavigator includes NavigatorID: member names are unique -PASS WorkerNavigator includes NavigatorLanguage: member names are unique -PASS WorkerNavigator includes NavigatorOnLine: member names are unique -PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes WindowSessionStorage: member names are unique -PASS Window includes WindowLocalStorage: member names are unique -FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, sequence<object>) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, optional StructuredSerializeOptions) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -PASS ServiceWorkerRegistration interface: existence and properties of interface object -PASS ServiceWorkerRegistration interface object length -PASS ServiceWorkerRegistration interface object name -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's @@unscopables property -PASS ServiceWorkerRegistration interface: attribute installing -PASS ServiceWorkerRegistration interface: attribute waiting -PASS ServiceWorkerRegistration interface: attribute active -PASS ServiceWorkerRegistration interface: attribute navigationPreload -PASS ServiceWorkerRegistration interface: attribute scope -PASS ServiceWorkerRegistration interface: attribute updateViaCache -PASS ServiceWorkerRegistration interface: operation update() -PASS ServiceWorkerRegistration interface: operation unregister() -PASS ServiceWorkerRegistration interface: attribute onupdatefound -FAIL ServiceWorkerContainer interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object length assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object name assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute controller assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute ready assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation register(USVString, optional RegistrationOptions) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistration(optional USVString) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistrations() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation startMessages() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute oncontrollerchange assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessage assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessageerror assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer must be primary interface of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL Stringification of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "controller" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "ready" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "register(USVString, optional RegistrationOptions)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling register(USVString, optional RegistrationOptions) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistration(optional USVString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling getRegistration(optional USVString) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistrations()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "startMessages()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "oncontrollerchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessage" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessageerror" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -PASS NavigationPreloadManager interface: existence and properties of interface object -PASS NavigationPreloadManager interface object length -PASS NavigationPreloadManager interface object name -PASS NavigationPreloadManager interface: existence and properties of interface prototype object -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's @@unscopables property -PASS NavigationPreloadManager interface: operation enable() -PASS NavigationPreloadManager interface: operation disable() -PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) -PASS NavigationPreloadManager interface: operation getState() -PASS ServiceWorkerGlobalScope interface: existence and properties of interface object -PASS Client interface: existence and properties of interface object -PASS WindowClient interface: existence and properties of interface object -PASS Clients interface: existence and properties of interface object -PASS ExtendableEvent interface: existence and properties of interface object -PASS FetchEvent interface: existence and properties of interface object -PASS ExtendableMessageEvent interface: existence and properties of interface object -PASS Cache interface: existence and properties of interface object -PASS Cache interface object length -PASS Cache interface object name -PASS Cache interface: existence and properties of interface prototype object -PASS Cache interface: existence and properties of interface prototype object's "constructor" property -PASS Cache interface: existence and properties of interface prototype object's @@unscopables property -PASS Cache interface: operation match(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation matchAll(optional RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation add(RequestInfo) -PASS Cache interface: operation addAll(sequence<RequestInfo>) -PASS Cache interface: operation put(RequestInfo, Response) -PASS Cache interface: operation delete(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation keys(optional RequestInfo, optional CacheQueryOptions) -PASS Cache must be primary interface of self.cacheInstance -PASS Stringification of self.cacheInstance -PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling match(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "matchAll(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling matchAll(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type -PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "addAll(sequence<RequestInfo>)" with the proper type -PASS Cache interface: calling addAll(sequence<RequestInfo>) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type -PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling delete(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "keys(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling keys(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS CacheStorage interface: existence and properties of interface object -PASS CacheStorage interface object length -PASS CacheStorage interface object name -PASS CacheStorage interface: existence and properties of interface prototype object -PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property -PASS CacheStorage interface: existence and properties of interface prototype object's @@unscopables property -PASS CacheStorage interface: operation match(RequestInfo, optional MultiCacheQueryOptions) -PASS CacheStorage interface: operation has(DOMString) -PASS CacheStorage interface: operation open(DOMString) -PASS CacheStorage interface: operation delete(DOMString) -PASS CacheStorage interface: operation keys() -PASS CacheStorage must be primary interface of caches -PASS Stringification of caches -PASS CacheStorage interface: caches must inherit property "match(RequestInfo, optional MultiCacheQueryOptions)" with the proper type -PASS CacheStorage interface: calling match(RequestInfo, optional MultiCacheQueryOptions) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "has(DOMString)" with the proper type -PASS CacheStorage interface: calling has(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "open(DOMString)" with the proper type -PASS CacheStorage interface: calling open(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "delete(DOMString)" with the proper type -PASS CacheStorage interface: calling delete(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "keys()" with the proper type -PASS WorkerGlobalScope interface: attribute caches -FAIL WorkerNavigator interface: attribute serviceWorker assert_true: The prototype object must have a property "serviceWorker" expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/websockets/Create-extensions-empty.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/websockets/Create-extensions-empty.any_wpt_flags=h2-expected.txt deleted file mode 100644 index 668ef1f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/websockets/Create-extensions-empty.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Create WebSocket - wsocket.extensions should be set to '' after connection is established - Connection should be closed assert_true: WebSocket connection should be closed expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt deleted file mode 100644 index f453bf19e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure should be applied to sent messages promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/webvtt/api/VTTCue/constructor-expected.txt b/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/webvtt/api/VTTCue/constructor-expected.txt deleted file mode 100644 index f4033eff..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/external/wpt/webvtt/api/VTTCue/constructor-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -FAIL VTTCue(), initial values assert_equals: expected (string) "start" but got (undefined) undefined -PASS VTTCue(), bad start time -PASS VTTCue(), bad end time -FAIL VTTCue(), unbounded end time Failed to construct 'VTTCue': The provided double value is non-finite. -PASS VTTCue(), text formatting -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/media/track/track-cue-rendering-vertical-expected.png deleted file mode 100644 index cd31e60..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/media/track/track-cue-rendering-vertical-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png deleted file mode 100644 index 2e9bc2ee..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index 7e04575a..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 6b7bf79f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt deleted file mode 100644 index 8b3c576e..0000000 --- a/third_party/blink/web_tests/platform/mac/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL insertParagraph in empty <title style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <title style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <style style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <style style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <script style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <script style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <div style="white-space:pre"> in the <head> should split the <div> promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing only a <br>) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing text) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt deleted file mode 100644 index bf94399..0000000 --- a/third_party/blink/web_tests/platform/mac/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL SPC enrollment in cross-origin iframe assert_equals: expected null but got object "SecurityError: A user activation is required to create a credential in a cross-origin iframe." -PASS SPC enrollment in cross-origin iframe fails without user activation -PASS SPC enrollment in cross-origin iframe without payment permission -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/webvtt/api/VTTCue/constructor-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/webvtt/api/VTTCue/constructor-expected.txt deleted file mode 100644 index f4033eff..0000000 --- a/third_party/blink/web_tests/platform/mac/external/wpt/webvtt/api/VTTCue/constructor-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -FAIL VTTCue(), initial values assert_equals: expected (string) "start" but got (undefined) undefined -PASS VTTCue(), bad start time -PASS VTTCue(), bad end time -FAIL VTTCue(), unbounded end time Failed to construct 'VTTCue': The provided double value is non-finite. -PASS VTTCue(), text formatting -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac/virtual/backface-visibility-interop/paint/invalidation/table/table-overflow-scroll-in-overflow-scroll-scrolled-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/backface-visibility-interop/paint/invalidation/table/table-overflow-scroll-in-overflow-scroll-scrolled-expected.txt deleted file mode 100644 index 62934ca2..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/backface-visibility-interop/paint/invalidation/table/table-overflow-scroll-in-overflow-scroll-scrolled-expected.txt +++ /dev/null
@@ -1,90 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF" - }, - { - "name": "LayoutNGBlockFlow DIV id='outerDiv'", - "bounds": [769, 300], - "drawsContent": false, - "transform": 1 - }, - { - "name": "LayoutNGBlockFlow DIV id='outerDiv'", - "bounds": [769, 700], - "contentsOpaqueForText": true, - "transform": 2 - }, - { - "name": "LayoutNGBlockFlow DIV id='innerDiv'", - "bounds": [754, 400], - "drawsContent": false, - "transform": 3 - }, - { - "name": "LayoutNGBlockFlow DIV id='innerDiv'", - "bounds": [306, 810], - "contentsOpaqueForText": true, - "transform": 4 - }, - { - "name": "VerticalScrollbar", - "position": [754, 0], - "bounds": [15, 400], - "contentsOpaque": true, - "transform": 3 - }, - { - "name": "VerticalScrollbar", - "position": [769, 0], - "bounds": [15, 300], - "contentsOpaque": true, - "transform": 1 - } - ], - "transforms": [ - { - "id": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [8, 8, 0, 1] - ] - }, - { - "id": 2, - "parent": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, -300, 0, 1] - ] - }, - { - "id": 3, - "parent": 2, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, 300, 0, 1] - ] - }, - { - "id": 4, - "parent": 3, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, -406, 0, 1] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index 7e04575a..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/mac/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt deleted file mode 100644 index 8e68733..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Violations from data:-URL scripts have a sourceFile of 'data' assert_equals: expected 16 but got 17 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-color-adjust/inheritance-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-color-adjust/inheritance-expected.txt deleted file mode 100644 index bf66e73..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/css/css-color-adjust/inheritance-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -This is a testharness.js-based test. -PASS Property color-scheme has initial value normal -PASS Property color-scheme inherits -FAIL Property color-adjust has initial value economy assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property color-adjust inherits assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -PASS Property forced-color-adjust has initial value auto -PASS Property forced-color-adjust inherits -FAIL Property print-color-adjust has initial value economy assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property print-color-adjust inherits assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/selectors/focus-visible-025-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/selectors/focus-visible-025-expected.txt deleted file mode 100644 index dbad1a0..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/css/selectors/focus-visible-025-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS ":focus-visible" should be a valid selector -FAIL :focus-visible matches after accesskey on DIV after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -FAIL :focus-visible matches after accesskey on BUTTON after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt deleted file mode 100644 index 249bdd21..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/editing/other/editing-around-select-element.tentative_insertText-expected.txt +++ /dev/null
@@ -1,40 +0,0 @@ -This is a testharness.js-based test. -PASS Test execCommand with selection around select element -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select> assert_equals: expected "<div contenteditable><p>abc</p><select><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>ab[c</p><select multiple><option>d]ef</option></select></div>: shouldn't modify in <option> assert_in_array: value "<div contenteditable><p>abXYZc</p><select multiple><option>def</option></select></div>" not in array ["<div contenteditable><p>abc</p><select multiple><option>def</option></select></div>", "<div contenteditable><p>abXYZ</p><select multiple><option>def</option></select></div>"] -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>d[]ef</option></select></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><select multiple><option>ab[c</option></select><p>d]ef</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{}def</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def{}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def}</option></select><p>ghi</p></div>: shouldn't modify in <option> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>{def</option><option>ghi}</option></select><p>jkl</p></div>: shouldn't join <option>s -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option>}<option>ghi</option></select><p>jkl</p></div>: shouldn't delete <option> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p>XYZ<select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><option>def</option>{<option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option> -FAIL execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple>{<option>def</option><option>ghi</option>}</select><p>jkl</p></div>: shouldn't delete <option>s nor <select multiple> assert_equals: expected "<div contenteditable><p>abc</p><select multiple><option>def</option><option>ghi</option></select><p>jkl</p></div>" but got "<div contenteditable><p>abc</p><p>XYZjkl</p></div>" -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p><select multiple><optgroup>{<option>def</option><option>ghi</option>}</optgroup></select><p>jkl</p></div>: shouldn't delete <option>, <optgroup> nor <select multiple> -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><option>def</option><option>ghi</option></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <div contenteditable><p>abc</p>{<select multiple><optgroup><option>def</option><option>ghi</option></optgroup></select>}<p>jkl</p></div>: <select multiple> element itself should be removable -PASS execCommand(insertText, false, "XYZ") in <select multiple contenteditable>{<option>abc</option><option>def</option>}</select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><option contenteditable>{abc}</option><option>def</option></select>: shouldn't modify <option> -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable>{<option>abc</option><option>def</option>}</optgroup></select>: shouldn't delete <option>s -PASS execCommand(insertText, false, "XYZ") in <select multiple><optgroup contenteditable><option>{abc}</option><option>def</option></optgroup></select>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <optgroup contenteditable><option>{abc}</option><option>def</option></optgroup>: shouldn't delete <option>s nor optgroup -PASS execCommand(insertText, false, "XYZ") in <option contenteditable>{abc}</option>: shouldn't modify <option> -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt deleted file mode 100644 index 8b3c576e..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL insertParagraph in empty <title style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <title style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <style style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <style style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <script style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <script style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <div style="white-space:pre"> in the <head> should split the <div> promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing only a <br>) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing text) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt deleted file mode 100644 index ee77d34..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/html/semantics/embedded-content/media-elements/interfaces/TextTrackCue/endTime-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL TextTrackCue.endTime, script-created cue Failed to set the 'endTime' property on 'TextTrackCue': The provided double value is non-finite. -PASS TextTrackCue.endTime, parsed cue -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt deleted file mode 100644 index bf94399..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/secure-payment-confirmation/enrollment-in-iframe.sub.https-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL SPC enrollment in cross-origin iframe assert_equals: expected null but got object "SecurityError: A user activation is required to create a credential in a cross-origin iframe." -PASS SPC enrollment in cross-origin iframe fails without user activation -PASS SPC enrollment in cross-origin iframe without payment permission -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/service-workers/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/service-workers/idlharness.https.any.worker-expected.txt deleted file mode 100644 index 4feb2445..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/service-workers/idlharness.https.any.worker-expected.txt +++ /dev/null
@@ -1,157 +0,0 @@ -This is a testharness.js-based test. -Found 153 tests; 113 PASS, 40 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS idl_test validation -PASS Partial interface Navigator: original interface defined -PASS Partial interface Navigator: member names are unique -PASS Partial interface WorkerNavigator: original interface defined -PASS Partial interface WorkerNavigator: member names are unique -PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined -PASS Partial interface mixin WindowOrWorkerGlobalScope: member names are unique -PASS Partial interface mixin NavigatorID: member names are unique -PASS Partial interface Window: member names are unique -PASS ServiceWorker includes AbstractWorker: member names are unique -PASS Window includes GlobalEventHandlers: member names are unique -PASS Window includes WindowEventHandlers: member names are unique -PASS Window includes WindowOrWorkerGlobalScope: member names are unique -PASS WorkerGlobalScope includes WindowOrWorkerGlobalScope: member names are unique -PASS Navigator includes NavigatorID: member names are unique -PASS Navigator includes NavigatorLanguage: member names are unique -PASS Navigator includes NavigatorOnLine: member names are unique -PASS Navigator includes NavigatorContentUtils: member names are unique -PASS Navigator includes NavigatorCookies: member names are unique -PASS Navigator includes NavigatorPlugins: member names are unique -PASS Navigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes AnimationFrameProvider: member names are unique -PASS WorkerNavigator includes NavigatorID: member names are unique -PASS WorkerNavigator includes NavigatorLanguage: member names are unique -PASS WorkerNavigator includes NavigatorOnLine: member names are unique -PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique -PASS Window includes WindowSessionStorage: member names are unique -PASS Window includes WindowLocalStorage: member names are unique -FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, sequence<object>) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: operation postMessage(any, optional StructuredSerializeOptions) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing -PASS ServiceWorkerRegistration interface: existence and properties of interface object -PASS ServiceWorkerRegistration interface object length -PASS ServiceWorkerRegistration interface object name -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property -PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's @@unscopables property -PASS ServiceWorkerRegistration interface: attribute installing -PASS ServiceWorkerRegistration interface: attribute waiting -PASS ServiceWorkerRegistration interface: attribute active -PASS ServiceWorkerRegistration interface: attribute navigationPreload -PASS ServiceWorkerRegistration interface: attribute scope -PASS ServiceWorkerRegistration interface: attribute updateViaCache -PASS ServiceWorkerRegistration interface: operation update() -PASS ServiceWorkerRegistration interface: operation unregister() -PASS ServiceWorkerRegistration interface: attribute onupdatefound -FAIL ServiceWorkerContainer interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object length assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface object name assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute controller assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute ready assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation register(USVString, optional RegistrationOptions) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistration(optional USVString) assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation getRegistrations() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: operation startMessages() assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute oncontrollerchange assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessage assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer interface: attribute onmessageerror assert_own_property: self does not have own property "ServiceWorkerContainer" expected property "ServiceWorkerContainer" missing -FAIL ServiceWorkerContainer must be primary interface of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL Stringification of navigator.serviceWorker assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "controller" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "ready" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "register(USVString, optional RegistrationOptions)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling register(USVString, optional RegistrationOptions) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistration(optional USVString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: calling getRegistration(optional USVString) on navigator.serviceWorker with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "getRegistrations()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "startMessages()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "oncontrollerchange" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessage" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -FAIL ServiceWorkerContainer interface: navigator.serviceWorker must inherit property "onmessageerror" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" -PASS NavigationPreloadManager interface: existence and properties of interface object -PASS NavigationPreloadManager interface object length -PASS NavigationPreloadManager interface object name -PASS NavigationPreloadManager interface: existence and properties of interface prototype object -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property -PASS NavigationPreloadManager interface: existence and properties of interface prototype object's @@unscopables property -PASS NavigationPreloadManager interface: operation enable() -PASS NavigationPreloadManager interface: operation disable() -PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString) -PASS NavigationPreloadManager interface: operation getState() -PASS ServiceWorkerGlobalScope interface: existence and properties of interface object -PASS Client interface: existence and properties of interface object -PASS WindowClient interface: existence and properties of interface object -PASS Clients interface: existence and properties of interface object -PASS ExtendableEvent interface: existence and properties of interface object -PASS FetchEvent interface: existence and properties of interface object -PASS ExtendableMessageEvent interface: existence and properties of interface object -PASS Cache interface: existence and properties of interface object -PASS Cache interface object length -PASS Cache interface object name -PASS Cache interface: existence and properties of interface prototype object -PASS Cache interface: existence and properties of interface prototype object's "constructor" property -PASS Cache interface: existence and properties of interface prototype object's @@unscopables property -PASS Cache interface: operation match(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation matchAll(optional RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation add(RequestInfo) -PASS Cache interface: operation addAll(sequence<RequestInfo>) -PASS Cache interface: operation put(RequestInfo, Response) -PASS Cache interface: operation delete(RequestInfo, optional CacheQueryOptions) -PASS Cache interface: operation keys(optional RequestInfo, optional CacheQueryOptions) -PASS Cache must be primary interface of self.cacheInstance -PASS Stringification of self.cacheInstance -PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling match(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "matchAll(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling matchAll(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type -PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "addAll(sequence<RequestInfo>)" with the proper type -PASS Cache interface: calling addAll(sequence<RequestInfo>) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type -PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling delete(RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS Cache interface: self.cacheInstance must inherit property "keys(optional RequestInfo, optional CacheQueryOptions)" with the proper type -PASS Cache interface: calling keys(optional RequestInfo, optional CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError -PASS CacheStorage interface: existence and properties of interface object -PASS CacheStorage interface object length -PASS CacheStorage interface object name -PASS CacheStorage interface: existence and properties of interface prototype object -PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property -PASS CacheStorage interface: existence and properties of interface prototype object's @@unscopables property -PASS CacheStorage interface: operation match(RequestInfo, optional MultiCacheQueryOptions) -PASS CacheStorage interface: operation has(DOMString) -PASS CacheStorage interface: operation open(DOMString) -PASS CacheStorage interface: operation delete(DOMString) -PASS CacheStorage interface: operation keys() -PASS CacheStorage must be primary interface of caches -PASS Stringification of caches -PASS CacheStorage interface: caches must inherit property "match(RequestInfo, optional MultiCacheQueryOptions)" with the proper type -PASS CacheStorage interface: calling match(RequestInfo, optional MultiCacheQueryOptions) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "has(DOMString)" with the proper type -PASS CacheStorage interface: calling has(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "open(DOMString)" with the proper type -PASS CacheStorage interface: calling open(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "delete(DOMString)" with the proper type -PASS CacheStorage interface: calling delete(DOMString) on caches with too few arguments must throw TypeError -PASS CacheStorage interface: caches must inherit property "keys()" with the proper type -PASS WorkerGlobalScope interface: attribute caches -FAIL WorkerNavigator interface: attribute serviceWorker assert_true: The prototype object must have a property "serviceWorker" expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt deleted file mode 100644 index f453bf19e..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/websockets/stream/tentative/backpressure-send.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL backpressure should be applied to sent messages promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webvtt/api/VTTCue/constructor-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webvtt/api/VTTCue/constructor-expected.txt deleted file mode 100644 index f4033eff..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webvtt/api/VTTCue/constructor-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -FAIL VTTCue(), initial values assert_equals: expected (string) "start" but got (undefined) undefined -PASS VTTCue(), bad start time -PASS VTTCue(), bad end time -FAIL VTTCue(), unbounded end time Failed to construct 'VTTCue': The provided double value is non-finite. -PASS VTTCue(), text formatting -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/flexbox/repaint-on-layout-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/flexbox/repaint-on-layout-expected.txt deleted file mode 100644 index 4d28c6c..0000000 --- a/third_party/blink/web_tests/platform/win/paint/invalidation/flexbox/repaint-on-layout-expected.txt +++ /dev/null
@@ -1,32 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [712, 8, 80, 20] - ] - }, - { - "name": "LayoutNGFlexibleBox (positioned) NAV class='nav-bar'", - "bounds": [200, 600], - "contentsOpaque": true, - "backgroundColor": "#008000", - "transform": 1 - } - ], - "transforms": [ - { - "id": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [8, 0, 0, 1] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/win/virtual/backface-visibility-interop/paint/invalidation/selection/selected-replaced-expected.txt b/third_party/blink/web_tests/platform/win/virtual/backface-visibility-interop/paint/invalidation/selection/selected-replaced-expected.txt deleted file mode 100644 index f7dd438..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/backface-visibility-interop/paint/invalidation/selection/selected-replaced-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [8, 52, 214, 232], - [8, 284, 214, 80] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index 7e04575a..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video-expected.txt b/third_party/blink/web_tests/platform/win/virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video-expected.txt deleted file mode 100644 index 0474795..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video-expected.txt +++ /dev/null
@@ -1,35 +0,0 @@ -This is a testharness.js-based test. -PASS sRGB-FF0100, Context srgb, ImageData srgb, cropSource=false -PASS sRGB-FF0100, Context srgb, ImageData srgb, cropSource=true -PASS sRGB-FF0100, Context srgb, ImageData display-p3, cropSource=false -PASS sRGB-FF0100, Context srgb, ImageData display-p3, cropSource=true -PASS sRGB-FF0100, Context display-p3, ImageData srgb, cropSource=false -PASS sRGB-FF0100, Context display-p3, ImageData srgb, cropSource=true -PASS sRGB-FF0100, Context display-p3, ImageData display-p3, cropSource=false -PASS sRGB-FF0100, Context display-p3, ImageData display-p3, cropSource=true -PASS sRGB-BB0000, Context srgb, ImageData srgb, cropSource=false -PASS sRGB-BB0000, Context srgb, ImageData srgb, cropSource=true -PASS sRGB-BB0000, Context srgb, ImageData display-p3, cropSource=false -PASS sRGB-BB0000, Context srgb, ImageData display-p3, cropSource=true -PASS sRGB-BB0000, Context display-p3, ImageData srgb, cropSource=false -PASS sRGB-BB0000, Context display-p3, ImageData srgb, cropSource=true -PASS sRGB-BB0000, Context display-p3, ImageData display-p3, cropSource=false -PASS sRGB-BB0000, Context display-p3, ImageData display-p3, cropSource=true -PASS Rec2020-3FF000000, Context srgb, ImageData srgb, cropSource=false -PASS Rec2020-3FF000000, Context srgb, ImageData srgb, cropSource=true -PASS Rec2020-3FF000000, Context srgb, ImageData display-p3, cropSource=false -PASS Rec2020-3FF000000, Context srgb, ImageData display-p3, cropSource=true -PASS Rec2020-3FF000000, Context display-p3, ImageData srgb, cropSource=false -PASS Rec2020-3FF000000, Context display-p3, ImageData srgb, cropSource=true -FAIL Rec2020-3FF000000, Context display-p3, ImageData display-p3, cropSource=false assert_true: Actual pixel value 233,51,36,255 is approximately equal to 255,0,9,255. expected true got false -FAIL Rec2020-3FF000000, Context display-p3, ImageData display-p3, cropSource=true assert_true: Actual pixel value 233,51,36,255 is approximately equal to 255,0,9,255. expected true got false -FAIL Rec2020-222000000, Context srgb, ImageData srgb, cropSource=false assert_true: Actual pixel value 134,0,2,255 is approximately equal to 186,0,0,255. expected true got false -FAIL Rec2020-222000000, Context srgb, ImageData srgb, cropSource=true assert_true: Actual pixel value 134,0,2,255 is approximately equal to 186,0,0,255. expected true got false -FAIL Rec2020-222000000, Context srgb, ImageData display-p3, cropSource=false assert_true: Actual pixel value 122,22,15,255 is approximately equal to 170,34,23,255. expected true got false -FAIL Rec2020-222000000, Context srgb, ImageData display-p3, cropSource=true assert_true: Actual pixel value 122,22,15,255 is approximately equal to 170,34,23,255. expected true got false -FAIL Rec2020-222000000, Context display-p3, ImageData srgb, cropSource=false assert_true: Actual pixel value 134,1,3,255 is approximately equal to 186,0,0,255. expected true got false -FAIL Rec2020-222000000, Context display-p3, ImageData srgb, cropSource=true assert_true: Actual pixel value 134,1,3,255 is approximately equal to 186,0,0,255. expected true got false -FAIL Rec2020-222000000, Context display-p3, ImageData display-p3, cropSource=false assert_true: Actual pixel value 122,22,15,255 is approximately equal to 169,0,3,255. expected true got false -FAIL Rec2020-222000000, Context display-p3, ImageData display-p3, cropSource=true assert_true: Actual pixel value 122,22,15,255 is approximately equal to 169,0,3,255. expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/virtual/prefer_compositing_to_lcd_text/compositing/overflow/clip-content-under-overflow-controls-expected.png b/third_party/blink/web_tests/platform/win/virtual/prefer_compositing_to_lcd_text/compositing/overflow/clip-content-under-overflow-controls-expected.png deleted file mode 100644 index 797fa6c1..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/prefer_compositing_to_lcd_text/compositing/overflow/clip-content-under-overflow-controls-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt b/third_party/blink/web_tests/platform/win10/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt deleted file mode 100644 index 8b3c576e..0000000 --- a/third_party/blink/web_tests/platform/win10/external/wpt/editing/other/insertparagraph-in-child-of-head.tentative_designMode=off_white-space=pre-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL insertParagraph in empty <title style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <title style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <style style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <style style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <script style="display:block;white-space:pre"> should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <script style="display:block;white-space:pre"> containing text should not split it promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in empty <div style="white-space:pre"> in the <head> should split the <div> promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing only a <br>) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -FAIL insertParagraph in <div style="white-space:pre"> (containing text) in the <head> should split the <div> element promise_test: Unhandled rejection with value: object "Error: can only send actions in top-level window" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/border-expected.png deleted file mode 100644 index 5e9a5f0..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png deleted file mode 100644 index 310db56..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/select-popup-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index e62aa23..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 592c4ea4..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png deleted file mode 100644 index 5e9a5f0..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/border-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/select-popup-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/select-popup-expected.png deleted file mode 100644 index 310db56..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/select-popup-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png deleted file mode 100644 index 7e04575a..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/text-on-backgrounds-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png deleted file mode 100644 index 592c4ea4..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-scroll-js-expose.html b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-scroll-js-expose.html index 1569ed5..e9bc426 100644 --- a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-scroll-js-expose.html +++ b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-scroll-js-expose.html
@@ -68,5 +68,8 @@ assert_equals(rect.y, 100); }, 'Range.getBoundingClientRect() returns the actual rendered location'); -// TODO(crbug.com/1309178): Test Element.offsetTop and Element.offsetLeft +test(() => { + assert_equals(anchored.offsetLeft, 200); + assert_equals(anchored.offsetTop, 100); +}, 'Element.offset* return adjusted offsets'); </script>
diff --git a/third_party/closure_compiler/externs/accessibility_private.js b/third_party/closure_compiler/externs/accessibility_private.js index aa29bf7..8314fc76 100644 --- a/third_party/closure_compiler/externs/accessibility_private.js +++ b/third_party/closure_compiler/externs/accessibility_private.js
@@ -557,6 +557,11 @@ chrome.accessibilityPrivate.updateDictationBubble = function(properties) {}; /** + * Cancels the current and queued speech from ChromeVox. + */ +chrome.accessibilityPrivate.silenceSpokenFeedback = function() {}; + +/** * Fired whenever ChromeVox should output introduction. * @type {!ChromeEvent} */
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index fdc52101..88bdd48 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-12-1-75-g90e1e39f5 -Revision: 90e1e39f50f9431e41fc3fb21b8d8f75fd5b4b9c +Version: VER-2-12-1-76-g7cd3f19f2 +Revision: 7cd3f19f21cc9d600e3b765ef2058474d20233e2 CPEPrefix: cpe:/a:freetype:freetype:2.11.1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium index 435cfe9..91545eb50 100644 --- a/third_party/libaom/README.chromium +++ b/third_party/libaom/README.chromium
@@ -2,8 +2,8 @@ Short Name: libaom URL: https://aomedia.googlesource.com/aom/ Version: 3.4.0 -Date: Monday July 25 2022 -Revision: 60e4e24a410da59c233fbe7dbc4fb8651e0b61d2 +Date: Sunday August 07 2022 +Revision: 121f3851459d5ee2ca1b5b23c6187bda79984eb2 CPEPrefix: cpe:/a:aomedia:aomedia:3.4.0 License: BSD License File: source/libaom/LICENSE
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h index 995c687..bfe1ef6b 100644 --- a/third_party/libaom/source/config/config/aom_version.h +++ b/third_party/libaom/source/config/config/aom_version.h
@@ -12,8 +12,8 @@ #define VERSION_MAJOR 3 #define VERSION_MINOR 4 #define VERSION_PATCH 0 -#define VERSION_EXTRA "179-g60e4e24a4" +#define VERSION_EXTRA "214-g121f38514" #define VERSION_PACKED \ ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH)) -#define VERSION_STRING_NOSP "3.4.0-179-g60e4e24a4" -#define VERSION_STRING " 3.4.0-179-g60e4e24a4" +#define VERSION_STRING_NOSP "3.4.0-214-g121f38514" +#define VERSION_STRING " 3.4.0-214-g121f38514"
diff --git a/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h index 26d9ade1..52a3b22 100644 --- a/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h
@@ -1279,14 +1279,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_neon -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_neon(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -#define aom_hadamard_8x8_dual aom_hadamard_8x8_dual_neon - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1303,6 +1295,14 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_neon +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_neon(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +#define aom_hadamard_lp_8x8_dual aom_hadamard_lp_8x8_dual_neon + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c
diff --git a/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h index 26d9ade1..52a3b22 100644 --- a/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h
@@ -1279,14 +1279,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_neon -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_neon(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -#define aom_hadamard_8x8_dual aom_hadamard_8x8_dual_neon - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1303,6 +1295,14 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_neon +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_neon(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +#define aom_hadamard_lp_8x8_dual aom_hadamard_lp_8x8_dual_neon + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h index eb0bb6a..cfcfc05 100644 --- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h
@@ -1392,16 +1392,6 @@ ptrdiff_t src_stride, tran_low_t* coeff); -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_neon(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -RTCD_EXTERN void (*aom_hadamard_8x8_dual)(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1422,6 +1412,16 @@ ptrdiff_t src_stride, int16_t* coeff); +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_neon(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +RTCD_EXTERN void (*aom_hadamard_lp_8x8_dual)(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c @@ -5847,15 +5847,15 @@ aom_hadamard_8x8 = aom_hadamard_8x8_c; if (flags & HAS_NEON) aom_hadamard_8x8 = aom_hadamard_8x8_neon; - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_c; - if (flags & HAS_NEON) - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_neon; aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_c; if (flags & HAS_NEON) aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_neon; aom_hadamard_lp_8x8 = aom_hadamard_lp_8x8_c; if (flags & HAS_NEON) aom_hadamard_lp_8x8 = aom_hadamard_lp_8x8_neon; + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_c; + if (flags & HAS_NEON) + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_neon; aom_int_pro_col = aom_int_pro_col_c; if (flags & HAS_NEON) aom_int_pro_col = aom_int_pro_col_neon;
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h index 26d9ade1..52a3b22 100644 --- a/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h
@@ -1279,14 +1279,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_neon -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_neon(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -#define aom_hadamard_8x8_dual aom_hadamard_8x8_dual_neon - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1303,6 +1295,14 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_neon +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_neon(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +#define aom_hadamard_lp_8x8_dual aom_hadamard_lp_8x8_dual_neon + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c
diff --git a/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h index 76550cc..2f63355 100644 --- a/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h
@@ -1137,11 +1137,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_c -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -#define aom_hadamard_8x8_dual aom_hadamard_8x8_dual_c - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1152,6 +1147,11 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_c +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +#define aom_hadamard_lp_8x8_dual aom_hadamard_lp_8x8_dual_c + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c
diff --git a/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h index 26d9ade1..52a3b22 100644 --- a/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h
@@ -1279,14 +1279,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_neon -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_neon(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -#define aom_hadamard_8x8_dual aom_hadamard_8x8_dual_neon - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1303,6 +1295,14 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_neon +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_neon(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +#define aom_hadamard_lp_8x8_dual aom_hadamard_lp_8x8_dual_neon + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c
diff --git a/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h index 805930f..4c353fb 100644 --- a/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h
@@ -1137,11 +1137,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_c -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -#define aom_hadamard_8x8_dual aom_hadamard_8x8_dual_c - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1152,6 +1147,11 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_c +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +#define aom_hadamard_lp_8x8_dual aom_hadamard_lp_8x8_dual_c + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c
diff --git a/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h index 42057f31d..c13fd6a 100644 --- a/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h
@@ -2487,19 +2487,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_sse2 -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_sse2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_avx2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -RTCD_EXTERN void (*aom_hadamard_8x8_dual)(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -2521,6 +2508,19 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_sse2 +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +RTCD_EXTERN void (*aom_hadamard_lp_8x8_dual)(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); void aom_ifft16x16_float_sse2(const float* input, float* temp, float* output); void aom_ifft16x16_float_avx2(const float* input, float* temp, float* output); @@ -9387,12 +9387,12 @@ aom_hadamard_32x32 = aom_hadamard_32x32_sse2; if (flags & HAS_AVX2) aom_hadamard_32x32 = aom_hadamard_32x32_avx2; - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_sse2; - if (flags & HAS_AVX2) - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_avx2; aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_sse2; if (flags & HAS_AVX2) aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_avx2; + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_sse2; + if (flags & HAS_AVX2) + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_avx2; aom_ifft16x16_float = aom_ifft16x16_float_sse2; if (flags & HAS_AVX2) aom_ifft16x16_float = aom_ifft16x16_float_avx2;
diff --git a/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h index 6c0f0380..35ac584 100644 --- a/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h
@@ -2490,19 +2490,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_sse2 -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_sse2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_avx2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -RTCD_EXTERN void (*aom_hadamard_8x8_dual)(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -2524,6 +2511,19 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_sse2 +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +RTCD_EXTERN void (*aom_hadamard_lp_8x8_dual)(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); void aom_ifft16x16_float_sse2(const float* input, float* temp, float* output); void aom_ifft16x16_float_avx2(const float* input, float* temp, float* output); @@ -9426,12 +9426,12 @@ aom_hadamard_32x32 = aom_hadamard_32x32_sse2; if (flags & HAS_AVX2) aom_hadamard_32x32 = aom_hadamard_32x32_avx2; - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_sse2; - if (flags & HAS_AVX2) - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_avx2; aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_sse2; if (flags & HAS_AVX2) aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_avx2; + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_sse2; + if (flags & HAS_AVX2) + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_avx2; aom_ifft16x16_float = aom_ifft16x16_float_sse2; if (flags & HAS_AVX2) aom_ifft16x16_float = aom_ifft16x16_float_avx2;
diff --git a/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h index 26d9ade1..52a3b22 100644 --- a/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h
@@ -1279,14 +1279,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_neon -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_neon(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -#define aom_hadamard_8x8_dual aom_hadamard_8x8_dual_neon - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -1303,6 +1295,14 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_neon +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_neon(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +#define aom_hadamard_lp_8x8_dual aom_hadamard_lp_8x8_dual_neon + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); #define aom_ifft16x16_float aom_ifft16x16_float_c
diff --git a/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h index 42057f31d..c13fd6a 100644 --- a/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h
@@ -2487,19 +2487,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_sse2 -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_sse2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_avx2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -RTCD_EXTERN void (*aom_hadamard_8x8_dual)(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -2521,6 +2508,19 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_sse2 +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +RTCD_EXTERN void (*aom_hadamard_lp_8x8_dual)(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); void aom_ifft16x16_float_sse2(const float* input, float* temp, float* output); void aom_ifft16x16_float_avx2(const float* input, float* temp, float* output); @@ -9387,12 +9387,12 @@ aom_hadamard_32x32 = aom_hadamard_32x32_sse2; if (flags & HAS_AVX2) aom_hadamard_32x32 = aom_hadamard_32x32_avx2; - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_sse2; - if (flags & HAS_AVX2) - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_avx2; aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_sse2; if (flags & HAS_AVX2) aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_avx2; + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_sse2; + if (flags & HAS_AVX2) + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_avx2; aom_ifft16x16_float = aom_ifft16x16_float_sse2; if (flags & HAS_AVX2) aom_ifft16x16_float = aom_ifft16x16_float_avx2;
diff --git a/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h index 6c0f0380..35ac584 100644 --- a/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h +++ b/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h
@@ -2490,19 +2490,6 @@ tran_low_t* coeff); #define aom_hadamard_8x8 aom_hadamard_8x8_sse2 -void aom_hadamard_8x8_dual_c(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_sse2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -void aom_hadamard_8x8_dual_avx2(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); -RTCD_EXTERN void (*aom_hadamard_8x8_dual)(const int16_t* src_diff, - ptrdiff_t src_stride, - int16_t* coeff); - void aom_hadamard_lp_16x16_c(const int16_t* src_diff, ptrdiff_t src_stride, int16_t* coeff); @@ -2524,6 +2511,19 @@ int16_t* coeff); #define aom_hadamard_lp_8x8 aom_hadamard_lp_8x8_sse2 +void aom_hadamard_lp_8x8_dual_c(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +void aom_hadamard_lp_8x8_dual_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); +RTCD_EXTERN void (*aom_hadamard_lp_8x8_dual)(const int16_t* src_diff, + ptrdiff_t src_stride, + int16_t* coeff); + void aom_ifft16x16_float_c(const float* input, float* temp, float* output); void aom_ifft16x16_float_sse2(const float* input, float* temp, float* output); void aom_ifft16x16_float_avx2(const float* input, float* temp, float* output); @@ -9426,12 +9426,12 @@ aom_hadamard_32x32 = aom_hadamard_32x32_sse2; if (flags & HAS_AVX2) aom_hadamard_32x32 = aom_hadamard_32x32_avx2; - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_sse2; - if (flags & HAS_AVX2) - aom_hadamard_8x8_dual = aom_hadamard_8x8_dual_avx2; aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_sse2; if (flags & HAS_AVX2) aom_hadamard_lp_16x16 = aom_hadamard_lp_16x16_avx2; + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_sse2; + if (flags & HAS_AVX2) + aom_hadamard_lp_8x8_dual = aom_hadamard_lp_8x8_dual_avx2; aom_ifft16x16_float = aom_ifft16x16_float_sse2; if (flags & HAS_AVX2) aom_ifft16x16_float = aom_ifft16x16_float_avx2;
diff --git a/third_party/tflite_support/README.chromium b/third_party/tflite_support/README.chromium index cfaf220..91f4baf 100644 --- a/third_party/tflite_support/README.chromium +++ b/third_party/tflite_support/README.chromium
@@ -36,6 +36,8 @@ * This patch intentionally does not apply because it was made with `--irreversible-delete` because it is deleting a large .tflite file causing the chromium-presubmit bot to fail. +10) Fix minizip path inclusion. Upstream uses contrib/minizip/, but chromium +uses third_party/zlib/contrib/minizip/. Update Process (internal: http://shortn/_nwz8liqimy): 1) Run these commands:
diff --git a/third_party/tflite_support/patches/0010-Fix-TFLite-build-errors-on-linux-when-using-the-syst.patch b/third_party/tflite_support/patches/0010-Fix-TFLite-build-errors-on-linux-when-using-the-syst.patch new file mode 100644 index 0000000..34acf27 --- /dev/null +++ b/third_party/tflite_support/patches/0010-Fix-TFLite-build-errors-on-linux-when-using-the-syst.patch
@@ -0,0 +1,129 @@ +From 12da2fa8f2d779e2fc14f48de73af79e9040c141 Mon Sep 17 00:00:00 2001 +From: Andres Salomon <dilinger@queued.net> +Date: Sun, 31 Jul 2022 19:07:24 -0400 +Subject: [PATCH] Fix TFLite build errors on linux when using the system zlib + +The commit a3be9805c1601d3fabe1e5adb6b9199c033aa2c5 updated TFLite, +which included the new zip_*_mem_file.* files that include minizip's +ioapi.h. To support that, it also declared that tflite_support depends +on minizip (in third_party/tflite_support/BUILD.gn). However, that's not +enough, and results in a build error when building using the stub linux +zlib build scripts. + +Other places that depend on minizip use a longer path to its header +files. For example, chrome/chrome_cleaner/zip_archiver/'s test_support +depends on minizip, and +chrome/chrome_cleaner/zip_archiver/target/zip_archiver_impl.cc +includes "third_party/zlib/contrib/minizip/ioapi.h". + +The new tensorflow stuff should do the same, instead of just including +"contrib/minizip/ioapi.h". This patch fixes that, as well as other +places where ioapi.h or zip.h/unzip.h are included without a fuller +path. +--- + .../tensorflow_lite_support/metadata/cc/metadata_extractor.cc | 4 ++-- + .../tensorflow_lite_support/metadata/cc/metadata_populator.cc | 4 ++-- + .../metadata/cc/utils/zip_readonly_mem_file.cc | 2 +- + .../metadata/cc/utils/zip_readonly_mem_file.h | 2 +- + .../metadata/cc/utils/zip_writable_mem_file.cc | 2 +- + .../metadata/cc/utils/zip_writable_mem_file.h | 2 +- + 6 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc +index 2a72338741626..62d0910182877 100644 +--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc ++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc +@@ -21,14 +21,14 @@ limitations under the License. + #include "absl/status/status.h" // from @com_google_absl + #include "absl/strings/str_format.h" // from @com_google_absl + #include "absl/strings/string_view.h" // from @com_google_absl +-#include "contrib/minizip/ioapi.h" +-#include "contrib/minizip/unzip.h" + #include "flatbuffers/flatbuffers.h" // from @flatbuffers + #include "tensorflow/lite/schema/schema_generated.h" + #include "tensorflow_lite_support/cc/common.h" + #include "tensorflow_lite_support/cc/port/status_macros.h" + #include "tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h" + #include "tensorflow_lite_support/metadata/metadata_schema_generated.h" ++#include "third_party/zlib/contrib/minizip/ioapi.h" ++#include "third_party/zlib/contrib/minizip/unzip.h" + + namespace tflite { + namespace metadata { +diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc +index 299ade3e95d54..8e13fa63dafbc 100644 +--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc ++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc +@@ -19,8 +19,6 @@ limitations under the License. + #include <cstring> + #include <functional> + +-#include "contrib/minizip/ioapi.h" +-#include "contrib/minizip/zip.h" + #include "flatbuffers/flatbuffers.h" // from @flatbuffers + #include "tensorflow/lite/schema/schema_generated.h" + #include "tensorflow_lite_support/cc/common.h" +@@ -28,6 +26,8 @@ limitations under the License. + #include "tensorflow_lite_support/cc/port/statusor.h" + #include "tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h" + #include "tensorflow_lite_support/metadata/metadata_schema_generated.h" ++#include "third_party/zlib/contrib/minizip/ioapi.h" ++#include "third_party/zlib/contrib/minizip/zip.h" + + namespace tflite { + namespace metadata { +diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc +index 392b6b411fe03..525ae4a2b45bd 100644 +--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc ++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc +@@ -19,7 +19,7 @@ limitations under the License. + #include <cstdio> + + #include "absl/strings/string_view.h" // from @com_google_absl +-#include "contrib/minizip/ioapi.h" ++#include "third_party/zlib/contrib/minizip/ioapi.h" + + namespace tflite { + namespace metadata { +diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h +index a1799ff509de5..72413a0a56252 100644 +--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h ++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h +@@ -19,7 +19,7 @@ limitations under the License. + #include <cstdlib> + + #include "absl/strings/string_view.h" // from @com_google_absl +-#include "contrib/minizip/ioapi.h" ++#include "third_party/zlib/contrib/minizip/ioapi.h" + + namespace tflite { + namespace metadata { +diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc +index 38ad17ad8935c..3ba91b5e22890 100644 +--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc ++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc +@@ -19,7 +19,7 @@ limitations under the License. + #include <cstdio> + + #include "absl/strings/string_view.h" // from @com_google_absl +-#include "contrib/minizip/ioapi.h" ++#include "third_party/zlib/contrib/minizip/ioapi.h" + + namespace tflite { + namespace metadata { +diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h +index 30e42fdb72a31..3d329925df756 100644 +--- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h ++++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h +@@ -19,7 +19,7 @@ limitations under the License. + #include <cstdlib> + + #include "absl/strings/string_view.h" // from @com_google_absl +-#include "contrib/minizip/ioapi.h" ++#include "third_party/zlib/contrib/minizip/ioapi.h" + + namespace tflite { + namespace metadata { +-- +2.30.2 +
diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc index 2a723387..62d0910 100644 --- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc +++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc
@@ -21,14 +21,14 @@ #include "absl/status/status.h" // from @com_google_absl #include "absl/strings/str_format.h" // from @com_google_absl #include "absl/strings/string_view.h" // from @com_google_absl -#include "contrib/minizip/ioapi.h" -#include "contrib/minizip/unzip.h" #include "flatbuffers/flatbuffers.h" // from @flatbuffers #include "tensorflow/lite/schema/schema_generated.h" #include "tensorflow_lite_support/cc/common.h" #include "tensorflow_lite_support/cc/port/status_macros.h" #include "tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h" #include "tensorflow_lite_support/metadata/metadata_schema_generated.h" +#include "third_party/zlib/contrib/minizip/ioapi.h" +#include "third_party/zlib/contrib/minizip/unzip.h" namespace tflite { namespace metadata {
diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc index 299ade3..8e13fa63 100644 --- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc +++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc
@@ -19,8 +19,6 @@ #include <cstring> #include <functional> -#include "contrib/minizip/ioapi.h" -#include "contrib/minizip/zip.h" #include "flatbuffers/flatbuffers.h" // from @flatbuffers #include "tensorflow/lite/schema/schema_generated.h" #include "tensorflow_lite_support/cc/common.h" @@ -28,6 +26,8 @@ #include "tensorflow_lite_support/cc/port/statusor.h" #include "tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h" #include "tensorflow_lite_support/metadata/metadata_schema_generated.h" +#include "third_party/zlib/contrib/minizip/ioapi.h" +#include "third_party/zlib/contrib/minizip/zip.h" namespace tflite { namespace metadata {
diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc index 392b6b4..525ae4a2 100644 --- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc +++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
@@ -19,7 +19,7 @@ #include <cstdio> #include "absl/strings/string_view.h" // from @com_google_absl -#include "contrib/minizip/ioapi.h" +#include "third_party/zlib/contrib/minizip/ioapi.h" namespace tflite { namespace metadata {
diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h index a1799ff..72413a0a 100644 --- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h +++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h
@@ -19,7 +19,7 @@ #include <cstdlib> #include "absl/strings/string_view.h" // from @com_google_absl -#include "contrib/minizip/ioapi.h" +#include "third_party/zlib/contrib/minizip/ioapi.h" namespace tflite { namespace metadata {
diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc index 38ad17a..3ba91b5 100644 --- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc +++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc
@@ -19,7 +19,7 @@ #include <cstdio> #include "absl/strings/string_view.h" // from @com_google_absl -#include "contrib/minizip/ioapi.h" +#include "third_party/zlib/contrib/minizip/ioapi.h" namespace tflite { namespace metadata {
diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h index 30e42fd..3d32992 100644 --- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h +++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h
@@ -19,7 +19,7 @@ #include <cstdlib> #include "absl/strings/string_view.h" // from @com_google_absl -#include "contrib/minizip/ioapi.h" +#include "third_party/zlib/contrib/minizip/ioapi.h" namespace tflite { namespace metadata {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 48c0672..70a50b6b 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -10337,11 +10337,12 @@ <int value="9" label="(09) TAB_MODAL_HANDLER"/> <int value="10" label="(10) TAB_SWITCHER_TO_BROWSING"/> <int value="11" label="(11) CLOSE_WATCHER"/> - <int value="12" label="(13) TOOLBAR_TAB_CONTROLLER"/> - <int value="13" label="(14) TAB_RETURN_TO_CHROME_START_SURFACE"/> - <int value="14" label="(15) SHOW_READING_LIST"/> - <int value="15" label="(16) MINIMIZE_APP_AND_CLOSE_TAB"/> + <int value="12" label="(14) TOOLBAR_TAB_CONTROLLER"/> + <int value="13" label="(15) TAB_RETURN_TO_CHROME_START_SURFACE"/> + <int value="14" label="(16) SHOW_READING_LIST"/> + <int value="15" label="(17) MINIMIZE_APP_AND_CLOSE_TAB"/> <int value="16" label="(12) FIND_TOOLBAR"/> + <int value="17" label="(13) LOCATION_BAR"/> </enum> <enum name="BadMessageReasonAutofill"> @@ -40971,6 +40972,7 @@ <int value="4325" label="V8PendingGetBeacon_SetURL_Method"/> <int value="4326" label="V8PendingPostBeacon_Constructor"/> <int value="4327" label="V8PendingPostBeacon_SetData_Method"/> + <int value="4328" label="ContentVisibilityAutoStateChangedHandlerRegistered"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -54938,6 +54940,11 @@ <int value="1" label="Bubble expanded"/> </enum> +<enum name="LiveCaptionPinBubbleEvent"> + <int value="0" label="Bubble unpinned"/> + <int value="1" label="Bubble pinned"/> +</enum> + <enum name="LiveCaptionSessionEvent"> <int value="0" label="Stream started"/> <int value="1" label="Stream finished"/> @@ -56340,6 +56347,7 @@ label="AutofillEnableUpdateVirtualCardEnrollment:disabled"/> <int value="-1643224308" label="OmniboxMostVisitedTilesTitleWrapAround:disabled"/> + <int value="-1642244779" label="CrosPrivacyHubFuture:disabled"/> <int value="-1641832607" label="DragToPinTabs:enabled"/> <int value="-1641656402" label="RTCDisallowPlanBOutsideDeprecationTrial:disabled"/> @@ -59803,6 +59811,7 @@ <int value="518419320" label="RemoteCopyProgressNotification:disabled"/> <int value="519140642" label="SendWebUIJavaScriptErrorReports:enabled"/> <int value="519623921" label="SafeModeForCachedFlags:enabled"/> + <int value="520270438" label="CrosPrivacyHubFuture:enabled"/> <int value="520738365" label="OmniboxPedalsBatch2NonEnglish:enabled"/> <int value="520982116" label="BuiltInModuleAll:enabled"/> <int value="521992655" label="LauncherPlayStoreSearch:disabled"/>
diff --git a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS index e960c95..10055dfc 100644 --- a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS +++ b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
@@ -16,6 +16,7 @@ cfredric@chromium.org chadduffin@chromium.org changhaohan@chromium.org +ckincaid@chromium.org ckitagawa@chromium.org crisrael@google.com csharrison@chromium.org
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml index d34c161..0b2f0c2 100644 --- a/tools/metrics/histograms/metadata/accessibility/histograms.xml +++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -1206,6 +1206,14 @@ </summary> </histogram> +<histogram name="Accessibility.LiveCaption.LiveCaptionPinBubbleEvent" + enum="LiveCaptionPinBubbleEvent" expires_after="2023-06-13"> + <owner>abigailbklein@google.com</owner> + <owner>evliu@google.com</owner> + <owner>chrome-a11y-core@google.com</owner> + <summary>Records when a user pins or unpins the Live Caption bubble.</summary> +</histogram> + <histogram name="Accessibility.LiveCaption.LoadSodaErrorCode" enum="WinGetLastError" expires_after="2023-06-13"> <owner>abigailbklein@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml index 6bc1d15a..0c9f1d9 100644 --- a/tools/metrics/histograms/metadata/arc/histograms.xml +++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -1392,6 +1392,16 @@ </summary> </histogram> +<histogram name="Arc.Notifications.InlineReplyEnabled" enum="BooleanEnabled" + expires_after="2022-10-07"> + <owner>yaoqq@google.com</owner> + <owner>arc-framework@google.com</owner> + <summary> + Records whether inline reply is enabled or not for an Arc notification when + the notification is created. + </summary> +</histogram> + <histogram name="Arc.Notifications.Style" enum="ArcNotificationStyle" expires_after="2022-09-27"> <owner>yaoqq@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml index 45f10f32..2e9b945 100644 --- a/tools/metrics/histograms/metadata/blink/histograms.xml +++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -231,7 +231,7 @@ </histogram> <histogram name="Blink.Canvas.MaximumInflightResources" - units="canvas resources" expires_after="2022-08-28"> + units="canvas resources" expires_after="2023-08-28"> <owner>aaronhk@chromium.org</owner> <owner>fserb@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index 93b249b..5b11a0fe 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -2461,16 +2461,6 @@ </summary> </histogram> -<histogram name="EnterpriseCheck.IsRunningOnManagedProfileDuration" units="ms" - expires_after="2021-04-04"> - <owner>twellington@google.com</owner> - <owner>tedchcoc@chromium.org</owner> - <summary> - Records the time it takes to calculate whether there is a profile owner app - on the device. Android only. - </summary> -</histogram> - <histogram name="EnterpriseCheck.Mac.IsCurrentUserDomainUser" enum="Boolean" expires_after="2022-12-31"> <owner>pastarmovj@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/holding_space/OWNERS b/tools/metrics/histograms/metadata/holding_space/OWNERS index 59024b0b..e5966356 100644 --- a/tools/metrics/histograms/metadata/holding_space/OWNERS +++ b/tools/metrics/histograms/metadata/holding_space/OWNERS
@@ -2,4 +2,5 @@ # Prefer sending CLs to the owners listed below. # Use chromium-metrics-reviews@google.com as a backup. +ckincaid@chromium.org dmblack@google.com
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml index 48ea72d7..8550b0ee 100644 --- a/tools/metrics/histograms/metadata/omnibox/histograms.xml +++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -155,7 +155,7 @@ </histogram> <histogram name="Omnibox.AssistedQueryStats.Length" units="chars" - expires_after="2022-08-14"> + expires_after="M115"> <owner>mahmadi@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> <summary> @@ -1298,7 +1298,7 @@ </histogram> <histogram name="Omnibox.SearchboxStats.Length" units="chars" - expires_after="2022-08-14"> + expires_after="M115"> <owner>mahmadi@chromium.org</owner> <owner>chrome-omnibox-team@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml index 11dbe20e..11656cc8 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -450,7 +450,7 @@ </histogram> <histogram name="SafeBrowsing.DeepScan.DragAndDrop.Duration" units="ms" - expires_after="2022-09-18"> + expires_after="2023-02-01"> <owner>domfc@chromium.org</owner> <owner>webprotect-team@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml index 244f198..e2d84bc 100644 --- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml +++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -614,7 +614,7 @@ </histogram> <histogram name="WebRTC.Audio.EchoCanceller.Erle{WebRTCEchoCancellerEstimate}" - units="dB" expires_after="2022-09-13"> + units="dB" expires_after="2023-08-08"> <owner>gustaf@chromium.org</owner> <owner>peah@chromium.org</owner> <summary> @@ -630,7 +630,7 @@ </histogram> <histogram name="WebRTC.Audio.EchoCanceller.Erl{WebRTCEchoCancellerEstimate}" - units="dB (shifted)" expires_after="2022-09-13"> + units="dB (shifted)" expires_after="2023-08-08"> <owner>gustaf@chromium.org</owner> <owner>peah@chromium.org</owner> <summary>
diff --git a/tools/rust/update_rust.py b/tools/rust/update_rust.py index 92a3ab8..495a42d 100755 --- a/tools/rust/update_rust.py +++ b/tools/rust/update_rust.py
@@ -27,7 +27,7 @@ os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'clang', 'scripts')) -RUST_REVISION = 'db8086eb' +RUST_REVISION = '55f46419' RUST_SUB_REVISION = 1 # Trunk on 2022-07-14.
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc index 8fc0dc6c..94d8843 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux.cc +++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -919,7 +919,7 @@ return nullptr; const AXLegacyHypertext& ax_hypertext = obj->GetAXHypertext(); - if (index > static_cast<int>(ax_hypertext.hyperlinks.size()) || index < 0) + if (index >= static_cast<int>(ax_hypertext.hyperlinks.size()) || index < 0) return nullptr; int32_t id = ax_hypertext.hyperlinks[index];
diff --git a/ui/base/ime/ash/ime_assistive_window_handler_interface.h b/ui/base/ime/ash/ime_assistive_window_handler_interface.h index c36e960..a035d16 100644 --- a/ui/base/ime/ash/ime_assistive_window_handler_interface.h +++ b/ui/base/ime/ash/ime_assistive_window_handler_interface.h
@@ -30,6 +30,10 @@ gfx::Rect caret; // Position of the autocorrect span, empty if not present. gfx::Rect autocorrect; + + bool operator==(const Bounds& rhs) const { + return caret == rhs.caret && autocorrect == rhs.autocorrect; + } }; // A interface to handle the assistive windows related method call.
diff --git a/ui/gfx/geometry/rect_f.cc b/ui/gfx/geometry/rect_f.cc index 1801ca1..cb4d6847 100644 --- a/ui/gfx/geometry/rect_f.cc +++ b/ui/gfx/geometry/rect_f.cc
@@ -150,15 +150,16 @@ SetRect(rx, ry, rr - rx, rb - ry); - // Due to floating errors, the new rect may not fully contain the original - // rects at the right/bottom side. Expand the rect in the case. + // Due to floating errors and SizeF::clamp(), the new rect may not fully + // contain the original rects at the right/bottom side. Expand the rect in + // the case. constexpr auto kFloatMax = std::numeric_limits<float>::max(); if (UNLIKELY(right() < rr && width() < kFloatMax)) { - set_width(std::nextafter(width(), kFloatMax)); + size_.SetToNextWidth(); DCHECK_GE(right(), rr); } if (UNLIKELY(bottom() < rb && height() < kFloatMax)) { - set_height(std::nextafter(height(), kFloatMax)); + size_.SetToNextHeight(); DCHECK_GE(bottom(), rb); } }
diff --git a/ui/gfx/geometry/rect_f_unittest.cc b/ui/gfx/geometry/rect_f_unittest.cc index b9eb3f5..b6b9f459 100644 --- a/ui/gfx/geometry/rect_f_unittest.cc +++ b/ui/gfx/geometry/rect_f_unittest.cc
@@ -161,15 +161,24 @@ TEST(RectFTest, UnionEnsuresContainWithFloatingError) { for (float f = 0.1f; f < 5; f += 0.1f) { - gfx::RectF r1(1, 2, 3, 4); + RectF r1(1, 2, 3, 4); r1.Scale(f, f + 0.05f); - gfx::RectF r2 = r1 + gfx::Vector2dF(10.f + f, f - 10.f); - gfx::RectF r3 = gfx::UnionRects(r1, r2); + RectF r2 = r1 + Vector2dF(10.f + f, f - 10.f); + RectF r3 = UnionRects(r1, r2); EXPECT_TRUE(r3.Contains(r1)); EXPECT_TRUE(r3.Contains(r2)); } } +TEST(RectFTest, UnionIfEmptyResultTinySize) { + RectF r1(1e-15f, 0, 0, 0); + RectF r2(0, 1e-15f, 0, 0); + RectF r3 = UnionRectsEvenIfEmpty(r1, r2); + EXPECT_FALSE(r3.IsEmpty()); + EXPECT_TRUE(r3.Contains(r1)); + EXPECT_TRUE(r3.Contains(r2)); +} + TEST(RectFTest, UnionMaxRects) { constexpr float kMaxFloat = std::numeric_limits<float>::max(); constexpr float kMinFloat = std::numeric_limits<float>::min();
diff --git a/ui/gfx/geometry/size_f.h b/ui/gfx/geometry/size_f.h index b6acf9e6..de8955b3 100644 --- a/ui/gfx/geometry/size_f.h +++ b/ui/gfx/geometry/size_f.h
@@ -66,6 +66,10 @@ void SetToMin(const SizeF& other); void SetToMax(const SizeF& other); + // Expands width/height to the next representable value. + void SetToNextWidth() { width_ = next(width_); } + void SetToNextHeight() { height_ = next(height_); } + constexpr bool IsEmpty() const { return !width() || !height(); } constexpr bool IsZero() const { return !width() && !height(); } @@ -93,6 +97,11 @@ static constexpr float clamp(float f) { return f > kTrivial ? f : 0.f; } + static float next(float f) { + return std::nextafter(std::max(kTrivial, f), + std::numeric_limits<float>::max()); + } + float width_; float height_; };
diff --git a/ui/gtk/x/gtk_event_loop_x11.cc b/ui/gtk/x/gtk_event_loop_x11.cc index c7a8f91..866be5d8 100644 --- a/ui/gtk/x/gtk_event_loop_x11.cc +++ b/ui/gtk/x/gtk_event_loop_x11.cc
@@ -24,13 +24,17 @@ if (!gtk::GtkCheckVersion(4)) { auto* key = reinterpret_cast<GdkEventKey*>(gdk_event); DCHECK(key->type == GdkKeyPress() || key->type == GdkKeyRelease()); + x11::Window window = x11::Window::None; + if (key->window) + window = static_cast<x11::Window>(gdk_x11_window_get_xid(key->window)); + x11::KeyEvent key_event{ .opcode = key->type == GdkKeyPress() ? x11::KeyEvent::Press : x11::KeyEvent::Release, .detail = static_cast<x11::KeyCode>(key->hardware_keycode), .time = static_cast<x11::Time>(key->time), .root = ui::GetX11RootWindow(), - .event = static_cast<x11::Window>(gdk_x11_window_get_xid(key->window)), + .event = window, .state = BuildXkbStateFromGdkEvent(key->state, key->group), .same_screen = true, };
diff --git a/ui/strings/app_locale_settings.grd b/ui/strings/app_locale_settings.grd index fd74617..27a6a07 100644 --- a/ui/strings/app_locale_settings.grd +++ b/ui/strings/app_locale_settings.grd
@@ -231,7 +231,7 @@ </message> </if> <!-- For ChromeOS --> - <if expr="chromeos_ash or chromeos_lacros"> + <if expr="is_chromeos"> <!-- The font name like: 'Font Name, 12px' --> <message name="IDS_UI_FONT_FAMILY_CROS" use_name_for_id="true"> Roboto, 12px
diff --git a/ui/strings/translations/app_locale_settings_am.xtb b/ui/strings/translations/app_locale_settings_am.xtb index 002db46..2c42c14 100644 --- a/ui/strings/translations/app_locale_settings_am.xtb +++ b/ui/strings/translations/app_locale_settings_am.xtb
@@ -2,7 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="am"> <translation id="IDS_UI_FONT_FAMILY_XP">abyssinica sil</translation> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Ethiopic, sans-serif, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Ethiopic, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_ar.xtb b/ui/strings/translations/app_locale_settings_ar.xtb index fe3bfbd8..e9d44319 100644 --- a/ui/strings/translations/app_locale_settings_ar.xtb +++ b/ui/strings/translations/app_locale_settings_ar.xtb
@@ -2,7 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="ar"> <translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Arabic UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Arabic UI, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_bn.xtb b/ui/strings/translations/app_locale_settings_bn.xtb index 443f9a6e..3a62e6f4 100644 --- a/ui/strings/translations/app_locale_settings_bn.xtb +++ b/ui/strings/translations/app_locale_settings_bn.xtb
@@ -13,7 +13,7 @@ <if expr="is_linux"> <translation id="IDS_WEB_FONT_FAMILY">Lohit Bengali</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Bengali UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Bengali UI, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_he.xtb b/ui/strings/translations/app_locale_settings_he.xtb index 0e06e1d35..982b040 100644 --- a/ui/strings/translations/app_locale_settings_he.xtb +++ b/ui/strings/translations/app_locale_settings_he.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="he"> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Hebrew, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Hebrew, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_hi.xtb b/ui/strings/translations/app_locale_settings_hi.xtb index bc08f96..81fd109 100644 --- a/ui/strings/translations/app_locale_settings_hi.xtb +++ b/ui/strings/translations/app_locale_settings_hi.xtb
@@ -4,7 +4,7 @@ <translation id="IDS_UI_FONT_SIZE_SCALER_XP">140</translation> <translation id="IDS_UI_FONT_SIZE_SCALER">125</translation> <translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Devanagari UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Devanagari UI,sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_ja.xtb b/ui/strings/translations/app_locale_settings_ja.xtb index f42b5750..955331e 100644 --- a/ui/strings/translations/app_locale_settings_ja.xtb +++ b/ui/strings/translations/app_locale_settings_ja.xtb
@@ -15,7 +15,7 @@ <if expr="is_linux"> <translation id="IDS_WEB_FONT_FAMILY">VL PGothic,Sazanami Gothic,Kochi Gothic,sans-serif</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK JP, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK JP, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_kn.xtb b/ui/strings/translations/app_locale_settings_kn.xtb index 398c3647..8529a04 100644 --- a/ui/strings/translations/app_locale_settings_kn.xtb +++ b/ui/strings/translations/app_locale_settings_kn.xtb
@@ -6,7 +6,7 @@ <translation id="IDS_UI_FONT_SIZE_SCALER_XP">142</translation> <translation id="IDS_UI_FONT_SIZE_SCALER">130</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Kannada UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Kannada UI, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_ko.xtb b/ui/strings/translations/app_locale_settings_ko.xtb index c91e06b6..afafa47 100644 --- a/ui/strings/translations/app_locale_settings_ko.xtb +++ b/ui/strings/translations/app_locale_settings_ko.xtb
@@ -15,7 +15,7 @@ <if expr="is_linux"> <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK KR,NanumGothic,UnDotum,Baekmuk Gulim,sans-serif</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK KR, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK KR, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_ml.xtb b/ui/strings/translations/app_locale_settings_ml.xtb index 45f9b86..00521398 100644 --- a/ui/strings/translations/app_locale_settings_ml.xtb +++ b/ui/strings/translations/app_locale_settings_ml.xtb
@@ -12,7 +12,7 @@ <if expr="is_linux"> <translation id="IDS_WEB_FONT_FAMILY">Arial,AnjaliOldLipi,Rachana,Kartika,sans-serif</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Malayalam UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Malayalam UI, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_mr.xtb b/ui/strings/translations/app_locale_settings_mr.xtb index c2a65b8..7be644e2 100644 --- a/ui/strings/translations/app_locale_settings_mr.xtb +++ b/ui/strings/translations/app_locale_settings_mr.xtb
@@ -4,7 +4,7 @@ <translation id="IDS_UI_FONT_SIZE_SCALER_XP">140</translation> <translation id="IDS_UI_FONT_SIZE_SCALER">125</translation> <translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Devanagari UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Devanagari UI,sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_ta.xtb b/ui/strings/translations/app_locale_settings_ta.xtb index 0774a8b..b165e8ec 100644 --- a/ui/strings/translations/app_locale_settings_ta.xtb +++ b/ui/strings/translations/app_locale_settings_ta.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ta"> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Tamil UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Tamil UI,sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_te.xtb b/ui/strings/translations/app_locale_settings_te.xtb index eb83bd8..9d996ca 100644 --- a/ui/strings/translations/app_locale_settings_te.xtb +++ b/ui/strings/translations/app_locale_settings_te.xtb
@@ -6,7 +6,7 @@ <translation id="IDS_UI_FONT_SIZE_SCALER_XP">145</translation> <translation id="IDS_UI_FONT_SIZE_SCALER">130</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Telugu UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Telugu UI, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_th.xtb b/ui/strings/translations/app_locale_settings_th.xtb index e8b98084..a8772ac 100644 --- a/ui/strings/translations/app_locale_settings_th.xtb +++ b/ui/strings/translations/app_locale_settings_th.xtb
@@ -9,7 +9,7 @@ <if expr="is_linux"> <translation id="IDS_WEB_FONT_FAMILY">Norasi,Waree,Garuda,Loma,sans-serif</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Thai UI, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Thai UI,sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_zh-CN.xtb b/ui/strings/translations/app_locale_settings_zh-CN.xtb index 5d6fa0c..a8094f5 100644 --- a/ui/strings/translations/app_locale_settings_zh-CN.xtb +++ b/ui/strings/translations/app_locale_settings_zh-CN.xtb
@@ -15,7 +15,7 @@ <if expr="is_linux"> <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK SC, WenQuanYi Zen Hei, sans-serif</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK SC, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK SC, sans-serif</translation> </if>
diff --git a/ui/strings/translations/app_locale_settings_zh-TW.xtb b/ui/strings/translations/app_locale_settings_zh-TW.xtb index b5d8d81..6a6c73f 100644 --- a/ui/strings/translations/app_locale_settings_zh-TW.xtb +++ b/ui/strings/translations/app_locale_settings_zh-TW.xtb
@@ -15,7 +15,7 @@ <if expr="is_linux"> <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK SC, WenQuanYi Zen Hei, sans-serif</translation> </if> -<if expr="chromeos_ash or chromeos_lacros"> +<if expr="is_chromeos"> <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK TC, 13px</translation> <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK TC, sans-serif</translation> </if>
diff --git a/weblayer/browser/password_manager_driver_factory.cc b/weblayer/browser/password_manager_driver_factory.cc index 0d631d6..e744390 100644 --- a/weblayer/browser/password_manager_driver_factory.cc +++ b/weblayer/browser/password_manager_driver_factory.cc
@@ -37,8 +37,7 @@ void PasswordFormsParsed( const std::vector<autofill::FormData>& raw_forms_data) override {} void PasswordFormsRendered( - const std::vector<autofill::FormData>& raw_visible_forms_data, - bool did_stop_loading) override {} + const std::vector<autofill::FormData>& raw_visible_forms_data) override {} void PasswordFormSubmitted(const autofill::FormData& raw_form_data) override { } void InformAboutUserInput(const autofill::FormData& raw_form_data) override {