diff --git a/.eslintrc.js b/.eslintrc.js index 387c492..7b7bd06 100644 --- a/.eslintrc.js +++ b/.eslintrc.js
@@ -74,6 +74,11 @@ 'semi': 'off', '@typescript-eslint/semi': ['error'], + // https://google.github.io/styleguide/tsguide.html#arrayt-type + '@typescript-eslint/array-type': ['error', { + default: 'array-simple', + }], + // https://google.github.io/styleguide/jsguide.html#naming '@typescript-eslint/naming-convention': [ 'error',
diff --git a/DEPS b/DEPS index 2bcdc7a8..f32b021 100644 --- a/DEPS +++ b/DEPS
@@ -280,19 +280,19 @@ # 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': '6db6110a1089987cb9591b65994842d62ca100a2', + 'skia_revision': '2d6e13210d3030dc5a10308d6aa9c3bd81c1dcb4', # 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': '724dc8eb3b40db5a282f32149e27fc04c68cde25', + 'v8_revision': '803d5313a8ce5bdf5d165d423e1bc15106f694c8', # 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': 'cd1b22eecd83f199bd3f67a579998f2a8922abc8', + 'angle_revision': 'a4e00c64528d21f5fab3ab4900357d31ee3dbdc1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '1d6a1036bdb37072ea2f946df2bcbec367b99c3a', + 'swiftshader_revision': '16e026a959f1bc80ff237aa81b4a63b52517dec1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -351,7 +351,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': '6f2de7bf2ddaa1cdd03241a5de5333f07d33756e', + 'catapult_revision': '6b65e0427dd4018366a81be0f2f9704e0932400c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -359,7 +359,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': 'ec0f408cb1745c663032154329a7ae757601d588', + 'devtools_frontend_revision': '70130c820e36839b359b1843a09875511f14e93b', # 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. @@ -395,7 +395,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'fcceb0ee8005fa73c5cb4155c87201800343e70d', + 'dawn_revision': 'e427a9ba5ec2d2d0b7e4a083cbc26ba465bbc24a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -861,7 +861,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'U3cbYvvMVs4vqc4cLCCaaPZyYi0dFdO2NAn6LeeJe5UC', + 'version': 'qxzLpPnQ0wbBX8Qp0iL8neLcakE9ZnRw0TCY0sLIHvEC', }, ], 'dep_type': 'cipd', @@ -929,7 +929,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': '2PIre0lzgUsBMZAlMGDVj_noHBvi860uvfYkFtl_UQcC', + 'version': 'Wp5QJnaBXtZUKJgQC5gmoQwAjWWDE6cBkjRAoSu8IIoC', }, ], 'condition': 'checkout_android', @@ -1564,7 +1564,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '3c4bdd0f331990d7fae52ae52f56f5762614cc33', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'acc008eff9c38f106b21ee30f6fac8741cb77878', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1734,7 +1734,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'a6bab72c7259ca3131b00a856cd9be23fc15bbd3', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '7b19036b80ef8377f8c479ae4bd0bd499362c218', + Var('webrtc_git') + '/src.git' + '@' + 'cbfdcc535e595dad73249be55b1340bc2561412c', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1807,7 +1807,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f1f2db8e4623c8eb9afae5b2ecd760bdc4974e88', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@46b9d6fc5a491a4c89b9435c16394db178caaab9', 'condition': 'checkout_src_internal', }, @@ -1837,7 +1837,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': '_EmWiRK4YKQYXdIg82dimOKVzBuk0ymxXpMrNUnFp5oC', + 'version': 'OQSGJdsQEXEA4J8QTQ69mqKbuFIpZnOjAGOpsLKEuokC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1848,7 +1848,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'io4VSsaXsNRuxM1tScwumF8LRye8D8XSEkjTlQg5h-sC', + 'version': 'YBHwTryNw4JMZuLtFF07h5f5LLwZiQLche2sGD-DedwC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc b/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc index 76bc1511d..19d937f 100644 --- a/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc +++ b/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc
@@ -24,6 +24,7 @@ #include "base/metrics/histogram_functions.h" #include "chromeos/dbus/power/power_manager_client.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/color_utils.h" namespace ash { @@ -90,8 +91,12 @@ rb.GetImageSkiaNamed(IDR_SETTINGS_RGB_KEYBOARD_RAINBOW_COLOR_48_PNG); button->SetBackgroundImage(*image); } else { - button->SetBackgroundColor( - ConvertBacklightColorToIconBackgroundColor(backlight_color)); + SkColor color = + ConvertBacklightColorToIconBackgroundColor(backlight_color); + button->SetBackgroundColor(color); + button->SetIconColor(color_utils::GetLuma(color) < 125 + ? gfx::kGoogleGrey200 + : gfx::kGoogleGrey900); } button->SetBorder(views::CreateRoundedRectBorder( /*thickness=*/4, /*corner_radius=*/16,
diff --git a/ash/webui/os_feedback_ui/os_feedback_ui.cc b/ash/webui/os_feedback_ui/os_feedback_ui.cc index d63c6473..e8444dd1 100644 --- a/ash/webui/os_feedback_ui/os_feedback_ui.cc +++ b/ash/webui/os_feedback_ui/os_feedback_ui.cc
@@ -61,6 +61,7 @@ {"userEmailLabel", IDS_FEEDBACK_TOOL_USER_EMAIL_LABEL}, {"shareDiagnosticDataLabel", IDS_FEEDBACK_TOOL_SHARE_DIAGNOSTIC_DATA_LABEL}, + {"sharePageUrlLabel", IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL}, {"confirmationTitleOnline", IDS_FEEDBACK_TOOL_PAGE_TITLE_AFTER_SENT}, {"confirmationTitleOffline", IDS_FEEDBACK_TOOL_PAGE_TITLE_SEND_OFFLINE}, {"exploreAppDescription",
diff --git a/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html b/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html index 436ef83..fb6211c 100644 --- a/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html +++ b/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html
@@ -42,6 +42,11 @@ margin-block-end: 0; } + .overflow-text { + overflow: hidden; + text-overflow: ellipsis; + } + h2 { color: var(--cros-text-color-secondary); font-family: var(--feedback-google-sans-font-family);
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.html b/ash/webui/os_feedback_ui/resources/share_data_page.html index 1cd1a485..f781a04 100644 --- a/ash/webui/os_feedback_ui/resources/share_data_page.html +++ b/ash/webui/os_feedback_ui/resources/share_data_page.html
@@ -1,5 +1,7 @@ <style include="os-feedback-shared"> - a[href] { + #legalHelpPageUrl, + #privacyPolicyUrl, + #termsOfServiceUrl { text-decoration: none; } @@ -92,6 +94,16 @@ margin-bottom: 24px; } + #pageUrl { + display: flex; + white-space: nowrap; + } + + #tooltipContent { + white-space: normal; + word-wrap: break-word + } + .disabled-input-text { color: var(--cros-text-color-disabled); } @@ -144,9 +156,13 @@ <div id="pageUrl" class="checkbox-field-container"> <input id="pageUrlCheckbox" type="checkbox" aria-labelledby="pageUrlLabel" checked> - <label id="pageUrlLabel">share url:</label> - <input id="pageUrlText" aria-labelledby="pageUrlLabel" type="text" - value$="[[feedbackContext.pageUrl.url]]" dir="ltr"> + <label id="pageUrlLabel">[[i18n('sharePageUrlLabel')]] </label> + <a href="[[feedbackContext.pageUrl.url]]" class="overflow-text" id="pageUrlText" target="_blank"> + [[feedbackContext.pageUrl.url]] + </a> + <paper-tooltip for="pageUrlText" fitToVisibleBounds> + <div id="tooltipContent">[[feedbackContext.pageUrl.url]]</div> + </paper-tooltip> </div> <!-- System Information --> <div id="sysInfoContainer" class="checkbox-field-container">
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js index 68ebb31..d342f05 100644 --- a/ash/webui/os_feedback_ui/resources/share_data_page.js +++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -6,6 +6,7 @@ import './file_attachment.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; +import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.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'; @@ -198,7 +199,7 @@ if (this.getElement_('#pageUrlCheckbox').checked) { report.feedbackContext.pageUrl = { - url: this.getElement_('#pageUrlText').value + url: this.getElement_('#pageUrlText').textContent.trim() }; }
diff --git a/ash/webui/personalization_app/search/BUILD.gn b/ash/webui/personalization_app/search/BUILD.gn index 9f58d2e4..82a3c47 100644 --- a/ash/webui/personalization_app/search/BUILD.gn +++ b/ash/webui/personalization_app/search/BUILD.gn
@@ -10,4 +10,5 @@ mojom("mojo_bindings") { sources = [ "search.mojom" ] public_deps = [ "//mojo/public/mojom/base" ] + webui_module_path = "/" }
diff --git a/ash/wm/desks/desk_preview_view.cc b/ash/wm/desks/desk_preview_view.cc index 12bcae0..9545134c 100644 --- a/ash/wm/desks/desk_preview_view.cc +++ b/ash/wm/desks/desk_preview_view.cc
@@ -507,7 +507,6 @@ void DeskPreviewView::MaybeActivateHighlightedView() { DesksController::Get()->ActivateDesk(mini_view_->desk(), DesksSwitchSource::kMiniViewButton); - RequestFocus(); } void DeskPreviewView::MaybeCloseHighlightedView(bool primary_action) {
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc index 53afaa0..a664fbfd 100644 --- a/ash/wm/splitview/split_view_controller.cc +++ b/ash/wm/splitview/split_view_controller.cc
@@ -1777,6 +1777,14 @@ // called. In clamshell mode, |OverviewController::CanEndOverview| always // returns true, meaning that overview is guaranteed to end successfully. DCHECK(!InClamshellSplitViewMode()); + + // If the `root_window_`is the root window of the display which is going to + // be removed, there's no need to start overview. + if (GetRootWindowSettings(root_window_)->display_id == + display::kInvalidDisplayId) { + return; + } + // If we are in tablet split view with only one snapped window, make sure we // are in overview (see https://crbug.com/1027179). if (state_ == State::kLeftSnapped || state_ == State::kRightSnapped) {
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc index 1721a0c..550f158 100644 --- a/ash/wm/splitview/split_view_controller_unittest.cc +++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -1003,6 +1003,41 @@ EXPECT_NEAR(window2_width, old_window1_width, 1); } +// Verify that disconnecting a display which has a snapped window in it in +// tablet mode won't lead to a crash. Regression test for +// https://crbug.com/1316230. +TEST_F(SplitViewControllerTest, + DisplayDisconnectionWithSnappedWindowInTabletMode) { + ui::ScopedAnimationDurationScaleMode animation_scale( + ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); + + UpdateDisplay("800x600,800x600"); + + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); + EXPECT_TRUE(EnterOverview()); + + // Turn off the display mirror mode. + Shell::Get()->display_manager()->SetMirrorMode(display::MirrorMode::kOff, + absl::nullopt); + + std::unique_ptr<aura::Window> w1( + CreateTestWindowInShellWithBounds(gfx::Rect(0, 0, 100, 100))); + std::unique_ptr<aura::Window> w2( + CreateTestWindowInShellWithBounds(gfx::Rect(900, 0, 100, 100))); + ASSERT_NE(w1->GetRootWindow(), w2->GetRootWindow()); + + // Snap the window on the second display. + auto* split_view_controller_on_display2 = + SplitViewController::Get(w2->GetRootWindow()); + split_view_controller_on_display2->SnapWindow(w2.get(), + SplitViewController::LEFT); + ASSERT_TRUE(split_view_controller_on_display2->split_view_divider()); + + // Now disconnect the second display, verify there's no crash. + UpdateDisplay("800x600"); + base::RunLoop().RunUntilIdle(); +} + // Tests that the bounds of the snapped windows and divider are adjusted when // the screen display configuration changes. TEST_F(SplitViewControllerTest, DisplayConfigurationChangeTest) {
diff --git a/base/allocator/allocator_interception_mac.mm b/base/allocator/allocator_interception_mac.mm index 9f01527e..dcac0c2 100644 --- a/base/allocator/allocator_interception_mac.mm +++ b/base/allocator/allocator_interception_mac.mm
@@ -236,7 +236,7 @@ bool CanGetContextForCFAllocator() { #if BUILDFLAG(IS_IOS) - return !base::ios::IsRunningOnOrLater(16, 0, 0); + return !base::ios::IsRunningOnOrLater(17, 0, 0); #else return !base::mac::IsOSLaterThan13_DontCallThis(); #endif
diff --git a/base/android/apk_assets.cc b/base/android/apk_assets.cc index b2dfaff..c3ec27f 100644 --- a/base/android/apk_assets.cc +++ b/base/android/apk_assets.cc
@@ -29,7 +29,8 @@ CHECK_EQ(3U, results.size()); int fd = static_cast<int>(results[0]); region->offset = results[1]; - region->size = results[2]; + // Not a checked_cast because open() may return -1. + region->size = static_cast<size_t>(results[2]); return fd; }
diff --git a/base/android/build_info.cc b/base/android/build_info.cc index 319db1e..15ae0c5a 100644 --- a/base/android/build_info.cc +++ b/base/android/build_info.cc
@@ -21,11 +21,11 @@ namespace { // We are leaking these strings. -const char* StrDupParam(const std::vector<std::string>& params, int index) { +const char* StrDupParam(const std::vector<std::string>& params, size_t index) { return strdup(params[index].c_str()); } -int GetIntParam(const std::vector<std::string>& params, int index) { +int GetIntParam(const std::vector<std::string>& params, size_t index) { int ret = 0; bool success = StringToInt(params[index], &ret); DCHECK(success);
diff --git a/base/android/child_process_service.cc b/base/android/child_process_service.cc index 077f7a8d..4808d41a 100644 --- a/base/android/child_process_service.cc +++ b/base/android/child_process_service.cc
@@ -27,7 +27,7 @@ const JavaParamRef<jlongArray>& j_sizes) { std::vector<absl::optional<std::string>> keys; JavaObjectArrayReader<jstring> keys_array(j_keys); - keys.reserve(keys_array.size()); + keys.reserve(checked_cast<size_t>(keys_array.size())); for (auto str : keys_array) { absl::optional<std::string> key; if (str) { @@ -54,7 +54,7 @@ base::MemoryMappedFile::Region region = {offsets.at(i), static_cast<size_t>(sizes.at(i))}; const absl::optional<std::string>& key = keys.at(i); - int id = ids.at(i); + const auto id = static_cast<GlobalDescriptors::Key>(ids.at(i)); int fd = fds.at(i); if (key) { base::FileDescriptorStore::GetInstance().Set(*key, base::ScopedFD(fd),
diff --git a/base/android/cpu_features.cc b/base/android/cpu_features.cc index 526794ab..0af5e60d 100644 --- a/base/android/cpu_features.cc +++ b/base/android/cpu_features.cc
@@ -15,7 +15,7 @@ } jlong JNI_CpuFeatures_GetCpuFeatures(JNIEnv*) { - return android_getCpuFeatures(); + return static_cast<jlong>(android_getCpuFeatures()); } } // namespace android
diff --git a/base/android/early_trace_event_binding.cc b/base/android/early_trace_event_binding.cc index f9e79ef..811bdea8 100644 --- a/base/android/early_trace_event_binding.cc +++ b/base/android/early_trace_event_binding.cc
@@ -106,7 +106,8 @@ std::string name = ConvertJavaStringToUTF8(env, jname); TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP_AND_FLAGS0( - internal::kJavaTraceCategory, name.c_str(), TRACE_ID_LOCAL(id), + internal::kJavaTraceCategory, name.c_str(), + TRACE_ID_LOCAL(static_cast<uint64_t>(id)), TimeTicks::FromJavaNanoTime(time_ns), TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); } @@ -119,7 +120,8 @@ std::string name = ConvertJavaStringToUTF8(env, jname); TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP_AND_FLAGS0( - internal::kJavaTraceCategory, name.c_str(), TRACE_ID_LOCAL(id), + internal::kJavaTraceCategory, name.c_str(), + TRACE_ID_LOCAL(static_cast<uint64_t>(id)), TimeTicks::FromJavaNanoTime(time_ns), TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); }
diff --git a/base/android/jank_metric_uma_recorder.cc b/base/android/jank_metric_uma_recorder.cc index ff09dab..ae09c6f 100644 --- a/base/android/jank_metric_uma_recorder.cc +++ b/base/android/jank_metric_uma_recorder.cc
@@ -23,7 +23,7 @@ void AddFrameToTrace(int64_t timestamp_ns, int64_t durations_ns) { #if BUILDFLAG(ENABLE_BASE_TRACING) - auto t = perfetto::Track(timestamp_ns); + auto t = perfetto::Track(checked_cast<uint64_t>(timestamp_ns)); TRACE_EVENT_BEGIN( "ui", "AndroidFrameVsync", t, [&](perfetto::EventContext ctx) { ctx.event()->set_timestamp_absolute_us(timestamp_ns / 1000); @@ -75,7 +75,7 @@ std::string missed_frames_histogram_name = base::StrCat({"Android.Jank.MissedFrames.", scenario_name}); - for (unsigned i = 0; i < timestamps_ns.size(); ++i) { + for (size_t i = 0; i < timestamps_ns.size(); ++i) { AddFrameToTrace(timestamps_ns[i], durations_ns[i]); }
diff --git a/base/android/java_runtime.cc b/base/android/java_runtime.cc index 61916516..394881c 100644 --- a/base/android/java_runtime.cc +++ b/base/android/java_runtime.cc
@@ -5,16 +5,20 @@ #include "base/android/java_runtime.h" #include "base/android_runtime_jni_headers/Runtime_jni.h" +#include "base/numerics/safe_conversions.h" namespace base { namespace android { -void JavaRuntime::GetMemoryUsage(long* total_memory, long* free_memory) { +void JavaRuntime::GetMemoryUsage(uint64_t* total_memory, + uint64_t* free_memory) { JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef<jobject> runtime = JNI_Runtime::Java_Runtime_getRuntime(env); - *total_memory = JNI_Runtime::Java_Runtime_totalMemory(env, runtime); - *free_memory = JNI_Runtime::Java_Runtime_freeMemory(env, runtime); + *total_memory = checked_cast<uint64_t>( + JNI_Runtime::Java_Runtime_totalMemory(env, runtime)); + *free_memory = checked_cast<uint64_t>( + JNI_Runtime::Java_Runtime_freeMemory(env, runtime)); } } // namespace android
diff --git a/base/android/java_runtime.h b/base/android/java_runtime.h index 2034fb9..2a3aa07 100644 --- a/base/android/java_runtime.h +++ b/base/android/java_runtime.h
@@ -16,7 +16,7 @@ public: // Fills the total memory used and memory allocated for objects by the java // heap in the current process. Returns true on success. - static void GetMemoryUsage(long* total_memory, long* free_memory); + static void GetMemoryUsage(uint64_t* total_memory, uint64_t* free_memory); }; } // namespace android
diff --git a/base/android/jni_array.cc b/base/android/jni_array.cc index 40ea0872..9b80310b 100644 --- a/base/android/jni_array.cc +++ b/base/android/jni_array.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/check_op.h" +#include "base/numerics/safe_conversions.h" namespace base { namespace android { @@ -30,11 +31,12 @@ ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env, const uint8_t* bytes, size_t len) { - jbyteArray byte_array = env->NewByteArray(len); + const jsize len_jsize = checked_cast<jsize>(len); + jbyteArray byte_array = env->NewByteArray(len_jsize); CheckException(env); DCHECK(byte_array); - env->SetByteArrayRegion(byte_array, 0, len, + env->SetByteArrayRegion(byte_array, 0, len_jsize, reinterpret_cast<const jbyte*>(bytes)); CheckException(env); @@ -56,11 +58,12 @@ ScopedJavaLocalRef<jbooleanArray> ToJavaBooleanArray(JNIEnv* env, const bool* bools, size_t len) { - jbooleanArray boolean_array = env->NewBooleanArray(len); + const jsize len_jsize = checked_cast<jsize>(len); + jbooleanArray boolean_array = env->NewBooleanArray(len_jsize); CheckException(env); DCHECK(boolean_array); - env->SetBooleanArrayRegion(boolean_array, 0, len, + env->SetBooleanArrayRegion(boolean_array, 0, len_jsize, reinterpret_cast<const jboolean*>(bools)); CheckException(env); @@ -70,11 +73,12 @@ ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env, const int* ints, size_t len) { - jintArray int_array = env->NewIntArray(len); + const jsize len_jsize = checked_cast<jsize>(len); + jintArray int_array = env->NewIntArray(len_jsize); CheckException(env); DCHECK(int_array); - env->SetIntArrayRegion(int_array, 0, len, + env->SetIntArrayRegion(int_array, 0, len_jsize, reinterpret_cast<const jint*>(ints)); CheckException(env); @@ -89,11 +93,12 @@ ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env, const int64_t* longs, size_t len) { - jlongArray long_array = env->NewLongArray(len); + const jsize len_jsize = checked_cast<jsize>(len); + jlongArray long_array = env->NewLongArray(len_jsize); CheckException(env); DCHECK(long_array); - env->SetLongArrayRegion(long_array, 0, len, + env->SetLongArrayRegion(long_array, 0, len_jsize, reinterpret_cast<const jlong*>(longs)); CheckException(env); @@ -110,11 +115,12 @@ // Returns a new Java float array converted from the given C++ float array. BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(JNIEnv* env, const float* floats, size_t len) { - jfloatArray float_array = env->NewFloatArray(len); + const jsize len_jsize = checked_cast<jsize>(len); + jfloatArray float_array = env->NewFloatArray(len_jsize); CheckException(env); DCHECK(float_array); - env->SetFloatArrayRegion(float_array, 0, len, + env->SetFloatArrayRegion(float_array, 0, len_jsize, reinterpret_cast<const jfloat*>(floats)); CheckException(env); @@ -129,11 +135,12 @@ BASE_EXPORT ScopedJavaLocalRef<jdoubleArray> ToJavaDoubleArray(JNIEnv* env, const double* doubles, size_t len) { - jdoubleArray double_array = env->NewDoubleArray(len); + const jsize len_jsize = checked_cast<jsize>(len); + jdoubleArray double_array = env->NewDoubleArray(len_jsize); CheckException(env); DCHECK(double_array); - env->SetDoubleArrayRegion(double_array, 0, len, + env->SetDoubleArrayRegion(double_array, 0, len_jsize, reinterpret_cast<const jdouble*>(doubles)); CheckException(env); @@ -150,11 +157,12 @@ JNIEnv* env, ScopedJavaLocalRef<jclass> clazz, base::span<const ScopedJavaLocalRef<jobject>> v) { - jobjectArray joa = env->NewObjectArray(v.size(), clazz.obj(), nullptr); + jobjectArray joa = + env->NewObjectArray(checked_cast<jsize>(v.size()), clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { - env->SetObjectArrayElement(joa, i, v[i].obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -170,12 +178,12 @@ base::span<const ScopedJavaGlobalRef<jobject>> v) { ScopedJavaLocalRef<jclass> object_array_clazz = GetClass(env, "java/lang/Object"); - jobjectArray joa = - env->NewObjectArray(v.size(), object_array_clazz.obj(), nullptr); + jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()), + object_array_clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { - env->SetObjectArrayElement(joa, i, v[i].obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -184,11 +192,12 @@ JNIEnv* env, base::span<const ScopedJavaLocalRef<jobject>> v, ScopedJavaLocalRef<jclass> type) { - jobjectArray joa = env->NewObjectArray(v.size(), type.obj(), nullptr); + jobjectArray joa = + env->NewObjectArray(checked_cast<jsize>(v.size()), type.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { - env->SetObjectArrayElement(joa, i, v[i].obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -197,11 +206,12 @@ JNIEnv* env, base::span<const ScopedJavaGlobalRef<jobject>> v, ScopedJavaLocalRef<jclass> type) { - jobjectArray joa = env->NewObjectArray(v.size(), type.obj(), nullptr); + jobjectArray joa = + env->NewObjectArray(checked_cast<jsize>(v.size()), type.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { - env->SetObjectArrayElement(joa, i, v[i].obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -210,14 +220,14 @@ JNIEnv* env, base::span<const std::string> v) { ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B"); - jobjectArray joa = - env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr); + jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()), + byte_array_clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray( env, reinterpret_cast<const uint8_t*>(v[i].data()), v[i].length()); - env->SetObjectArrayElement(joa, i, byte_array.obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -226,14 +236,14 @@ JNIEnv* env, base::span<const std::vector<uint8_t>> v) { ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B"); - jobjectArray joa = - env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr); + jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()), + byte_array_clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env, v[i].data(), v[i].size()); - env->SetObjectArrayElement(joa, i, byte_array.obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -242,12 +252,13 @@ JNIEnv* env, base::span<const std::string> v) { ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String"); - jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr); + jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()), + string_clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]); - env->SetObjectArrayElement(joa, i, item.obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -258,14 +269,14 @@ ScopedJavaLocalRef<jclass> string_array_clazz = GetClass(env, "[Ljava/lang/String;"); - jobjectArray joa = - env->NewObjectArray(vec_outer.size(), string_array_clazz.obj(), nullptr); + jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()), + string_array_clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < vec_outer.size(); ++i) { ScopedJavaLocalRef<jobjectArray> inner = ToJavaArrayOfStrings(env, vec_outer[i]); - env->SetObjectArrayElement(joa, i, inner.obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); @@ -277,14 +288,14 @@ ScopedJavaLocalRef<jclass> string_array_clazz = GetClass(env, "[Ljava/lang/String;"); - jobjectArray joa = - env->NewObjectArray(vec_outer.size(), string_array_clazz.obj(), nullptr); + jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()), + string_array_clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < vec_outer.size(); ++i) { ScopedJavaLocalRef<jobjectArray> inner = ToJavaArrayOfStrings(env, vec_outer[i]); - env->SetObjectArrayElement(joa, i, inner.obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); @@ -294,12 +305,13 @@ JNIEnv* env, base::span<const std::u16string> v) { ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String"); - jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr); + jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()), + string_clazz.obj(), nullptr); CheckException(env); for (size_t i = 0; i < v.size(); ++i) { ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]); - env->SetObjectArrayElement(joa, i, item.obj()); + env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj()); } return ScopedJavaLocalRef<jobjectArray>(env, joa); } @@ -315,7 +327,8 @@ out->resize(back + len); for (size_t i = 0; i < len; ++i) { ScopedJavaLocalRef<jstring> str( - env, static_cast<jstring>(env->GetObjectArrayElement(array.obj(), i))); + env, static_cast<jstring>(env->GetObjectArrayElement( + array.obj(), static_cast<jsize>(i)))); ConvertJavaStringToUTF16(env, str.obj(), out->data() + back + i); } } @@ -331,7 +344,8 @@ out->resize(back + len); for (size_t i = 0; i < len; ++i) { ScopedJavaLocalRef<jstring> str( - env, static_cast<jstring>(env->GetObjectArrayElement(array.obj(), i))); + env, static_cast<jstring>(env->GetObjectArrayElement( + array.obj(), static_cast<jsize>(i)))); ConvertJavaStringToUTF8(env, str.obj(), out->data() + back + i); } } @@ -347,7 +361,7 @@ return; size_t back = out->size(); out->resize(back + len); - env->GetByteArrayRegion(byte_array.obj(), 0, len, + env->GetByteArrayRegion(byte_array.obj(), 0, static_cast<jsize>(len), reinterpret_cast<int8_t*>(out->data() + back)); } @@ -397,7 +411,8 @@ out->resize(len); if (!len) return; - env->GetIntArrayRegion(int_array.obj(), 0, len, out->data()); + env->GetIntArrayRegion(int_array.obj(), 0, static_cast<jsize>(len), + out->data()); } void JavaLongArrayToInt64Vector(JNIEnv* env, @@ -418,7 +433,8 @@ out->resize(len); if (!len) return; - env->GetLongArrayRegion(long_array.obj(), 0, len, out->data()); + env->GetLongArrayRegion(long_array.obj(), 0, static_cast<jsize>(len), + out->data()); } void JavaFloatArrayToFloatVector(JNIEnv* env, @@ -429,7 +445,8 @@ out->resize(len); if (!len) return; - env->GetFloatArrayRegion(float_array.obj(), 0, len, out->data()); + env->GetFloatArrayRegion(float_array.obj(), 0, static_cast<jsize>(len), + out->data()); } void JavaDoubleArrayToDoubleVector(JNIEnv* env, @@ -440,7 +457,8 @@ out->resize(len); if (!len) return; - env->GetDoubleArrayRegion(double_array.obj(), 0, len, out->data()); + env->GetDoubleArrayRegion(double_array.obj(), 0, static_cast<jsize>(len), + out->data()); } void JavaArrayOfByteArrayToStringVector(JNIEnv* env, @@ -451,9 +469,9 @@ out->resize(len); for (size_t i = 0; i < len; ++i) { ScopedJavaLocalRef<jbyteArray> bytes_array( - env, - static_cast<jbyteArray>(env->GetObjectArrayElement(array.obj(), i))); - jsize bytes_len = env->GetArrayLength(bytes_array.obj()); + env, static_cast<jbyteArray>(env->GetObjectArrayElement( + array.obj(), static_cast<jsize>(i)))); + size_t bytes_len = SafeGetArrayLength(env, bytes_array); jbyte* bytes = env->GetByteArrayElements(bytes_array.obj(), nullptr); (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len); env->ReleaseByteArrayElements(bytes_array.obj(), bytes, JNI_ABORT); @@ -468,8 +486,8 @@ out->resize(len); for (size_t i = 0; i < len; ++i) { ScopedJavaLocalRef<jbyteArray> bytes_array( - env, - static_cast<jbyteArray>(env->GetObjectArrayElement(array.obj(), i))); + env, static_cast<jbyteArray>(env->GetObjectArrayElement( + array.obj(), static_cast<jsize>(i)))); JavaByteArrayToByteVector(env, bytes_array, &(*out)[i]); } } @@ -483,8 +501,8 @@ out->resize(len); for (size_t i = 0; i < len; ++i) { ScopedJavaLocalRef<jobjectArray> strings_array( - env, - static_cast<jobjectArray>(env->GetObjectArrayElement(array.obj(), i))); + env, static_cast<jobjectArray>(env->GetObjectArrayElement( + array.obj(), static_cast<jsize>(i)))); out->at(i).clear(); AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i)); @@ -500,8 +518,8 @@ out->resize(len); for (size_t i = 0; i < len; ++i) { ScopedJavaLocalRef<jobjectArray> strings_array( - env, - static_cast<jobjectArray>(env->GetObjectArrayElement(array.obj(), i))); + env, static_cast<jobjectArray>(env->GetObjectArrayElement( + array.obj(), static_cast<jsize>(i)))); out->at(i).clear(); AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i)); @@ -516,8 +534,8 @@ out->resize(len); for (size_t i = 0; i < len; ++i) { ScopedJavaLocalRef<jintArray> int_array( - env, - static_cast<jintArray>(env->GetObjectArrayElement(array.obj(), i))); + env, static_cast<jintArray>(env->GetObjectArrayElement( + array.obj(), static_cast<jsize>(i)))); JavaIntArrayToIntVector(env, int_array, &out->at(i)); } }
diff --git a/base/android/jni_string.cc b/base/android/jni_string.cc index 2d1ec3c..1eadc75 100644 --- a/base/android/jni_string.cc +++ b/base/android/jni_string.cc
@@ -6,6 +6,7 @@ #include "base/android/jni_android.h" #include "base/logging.h" +#include "base/numerics/safe_conversions.h" #include "base/strings/utf_string_conversions.h" namespace { @@ -13,8 +14,8 @@ // Internal version that does not use a scoped local pointer. jstring ConvertUTF16ToJavaStringImpl(JNIEnv* env, const base::StringPiece16& str) { - jstring result = - env->NewString(reinterpret_cast<const jchar*>(str.data()), str.length()); + jstring result = env->NewString(reinterpret_cast<const jchar*>(str.data()), + base::checked_cast<jsize>(str.length())); base::android::CheckException(env); return result; } @@ -32,7 +33,7 @@ return; } const jsize length = env->GetStringLength(str); - if (!length) { + if (length <= 0) { result->clear(); CheckException(env); return; @@ -42,7 +43,8 @@ // function that yields plain (non Java-modified) UTF8. const jchar* chars = env->GetStringChars(str, NULL); DCHECK(chars); - UTF16ToUTF8(reinterpret_cast<const char16_t*>(chars), length, result); + UTF16ToUTF8(reinterpret_cast<const char16_t*>(chars), + static_cast<size_t>(length), result); env->ReleaseStringChars(str, chars); CheckException(env); } @@ -84,7 +86,7 @@ return; } const jsize length = env->GetStringLength(str); - if (!length) { + if (length <= 0) { result->clear(); CheckException(env); return; @@ -93,7 +95,8 @@ DCHECK(chars); // GetStringChars isn't required to NULL-terminate the strings // it returns, so the length must be explicitly checked. - result->assign(reinterpret_cast<const char16_t*>(chars), length); + result->assign(reinterpret_cast<const char16_t*>(chars), + static_cast<size_t>(length)); env->ReleaseStringChars(str, chars); CheckException(env); }
diff --git a/base/android/library_loader/library_prefetcher.cc b/base/android/library_loader/library_prefetcher.cc index 411260e..1ad25a6 100644 --- a/base/android/library_loader/library_prefetcher.cc +++ b/base/android/library_loader/library_prefetcher.cc
@@ -115,8 +115,8 @@ PLOG(ERROR) << "Cannot get the time."; return false; } - uint64_t now = - static_cast<uint64_t>(ts.tv_sec) * 1000 * 1000 * 1000 + ts.tv_nsec; + uint64_t now = static_cast<uint64_t>(ts.tv_sec) * 1000 * 1000 * 1000 + + static_cast<uint64_t>(ts.tv_nsec); std::vector<unsigned char> residency; if (!Mincore(start, end, &residency)) return false; @@ -145,19 +145,20 @@ CHECK_LE(kEndOfText, end); auto start_end = base::StringPrintf("%" PRIuS " %" PRIuS "\n", kStartOfText - start, kEndOfText - start); - file.WriteAtCurrentPos(start_end.c_str(), start_end.size()); + file.WriteAtCurrentPos(start_end.c_str(), static_cast<int>(start_end.size())); for (const auto& data_point : *data) { auto timestamp = base::StringPrintf("%" PRIu64 " ", data_point.timestamp_nanos); - file.WriteAtCurrentPos(timestamp.c_str(), timestamp.size()); + file.WriteAtCurrentPos(timestamp.c_str(), + static_cast<int>(timestamp.size())); std::vector<char> dump; dump.reserve(data_point.residency.size() + 1); for (auto c : data_point.residency) dump.push_back(c ? '1' : '0'); dump[dump.size() - 1] = '\n'; - file.WriteAtCurrentPos(&dump[0], dump.size()); + file.WriteAtCurrentPos(&dump[0], checked_cast<int>(dump.size())); } } @@ -284,8 +285,9 @@ if (!ok) return -1; total_pages += residency.size(); - resident_pages += std::count_if(residency.begin(), residency.end(), - [](unsigned char x) { return x & 1; }); + resident_pages += + static_cast<size_t>(std::count_if(residency.begin(), residency.end(), + [](unsigned char x) { return x & 1; })); if (total_pages == 0) return -1; return static_cast<int>((100 * resident_pages) / total_pages);
diff --git a/base/android/reached_code_profiler.cc b/base/android/reached_code_profiler.cc index 2c2c8b6..a69221d 100644 --- a/base/android/reached_code_profiler.cc +++ b/base/android/reached_code_profiler.cc
@@ -166,7 +166,8 @@ // Start the interval timer. struct itimerspec its; memset(&its, 0, sizeof(its)); - its.it_interval.tv_nsec = sampling_interval.InNanoseconds(); + its.it_interval.tv_nsec = + checked_cast<long>(sampling_interval.InNanoseconds()); its.it_value = its.it_interval; ret = timer_settime(timerid, 0, &its, nullptr); if (ret) {
diff --git a/base/android/task_scheduler/task_runner_android.cc b/base/android/task_scheduler/task_runner_android.cc index b69b484..9fbed8d 100644 --- a/base/android/task_scheduler/task_runner_android.cc +++ b/base/android/task_scheduler/task_runner_android.cc
@@ -33,9 +33,10 @@ jboolean may_block, jbyte extension_id, const base::android::JavaParamRef<jbyteArray>& extension_data) { - return TaskTraits(static_cast<TaskPriority>(priority), may_block, - TaskTraitsExtensionStorage( - extension_id, GetExtensionData(env, extension_data))); + return TaskTraits( + static_cast<TaskPriority>(priority), may_block, + TaskTraitsExtensionStorage(static_cast<uint8_t>(extension_id), + GetExtensionData(env, extension_data))); } private:
diff --git a/base/android/thread_instruction_count.h b/base/android/thread_instruction_count.h index 845d7bd2..fe5e2d7 100644 --- a/base/android/thread_instruction_count.h +++ b/base/android/thread_instruction_count.h
@@ -40,21 +40,21 @@ static bool IsSupported(); // Returns the number of retired instructions relative to some epoch count, - // or -1 if getting the current instruction count failed / is disabled. + // or 0 if getting the current instruction count failed / is disabled. static ThreadInstructionCount Now(); - constexpr ThreadInstructionCount() : value_(-1) {} - explicit constexpr ThreadInstructionCount(int64_t value) : value_(value) {} + explicit constexpr ThreadInstructionCount(uint64_t value = 0) + : value_(value) {} constexpr ThreadInstructionDelta operator-( ThreadInstructionCount other) const { - return ThreadInstructionDelta(value_ - other.value_); + return ThreadInstructionDelta(static_cast<int64_t>(value_ - other.value_)); } - constexpr int64_t ToInternalValue() const { return value_; } + constexpr uint64_t ToInternalValue() const { return value_; } private: - int64_t value_; + uint64_t value_; }; } // namespace android
diff --git a/base/android/trace_event_binding.cc b/base/android/trace_event_binding.cc index 2c248bf..f562d985 100644 --- a/base/android/trace_event_binding.cc +++ b/base/android/trace_event_binding.cc
@@ -282,7 +282,8 @@ jlong jid) { TraceEventDataConverter converter(env, jname, nullptr); TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_FLAGS0( - internal::kJavaTraceCategory, converter.name(), TRACE_ID_LOCAL(jid), + internal::kJavaTraceCategory, converter.name(), + TRACE_ID_LOCAL(static_cast<uint64_t>(jid)), TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); } @@ -291,7 +292,8 @@ jlong jid) { TraceEventDataConverter converter(env, jname, nullptr); TRACE_EVENT_NESTABLE_ASYNC_END_WITH_FLAGS0( - internal::kJavaTraceCategory, converter.name(), TRACE_ID_LOCAL(jid), + internal::kJavaTraceCategory, converter.name(), + TRACE_ID_LOCAL(static_cast<uint64_t>(jid)), TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); }
diff --git a/base/android/unguessable_token_android.cc b/base/android/unguessable_token_android.cc index 429f7f6..413bbf5 100644 --- a/base/android/unguessable_token_android.cc +++ b/base/android/unguessable_token_android.cc
@@ -16,15 +16,17 @@ const uint64_t low = token.GetLowForSerialization(); DCHECK(high); DCHECK(low); - return Java_UnguessableToken_create(env, high, low); + return Java_UnguessableToken_create(env, static_cast<jlong>(high), + static_cast<jlong>(low)); } base::UnguessableToken UnguessableTokenAndroid::FromJavaUnguessableToken( JNIEnv* env, const JavaRef<jobject>& token) { - const uint64_t high = - Java_UnguessableToken_getHighForSerialization(env, token); - const uint64_t low = Java_UnguessableToken_getLowForSerialization(env, token); + const uint64_t high = static_cast<uint64_t>( + Java_UnguessableToken_getHighForSerialization(env, token)); + const uint64_t low = static_cast<uint64_t>( + Java_UnguessableToken_getLowForSerialization(env, token)); DCHECK(high); DCHECK(low); return base::UnguessableToken::Deserialize(high, low);
diff --git a/base/check.cc b/base/check.cc index 7ea731e..89b7ad74 100644 --- a/base/check.cc +++ b/base/check.cc
@@ -36,8 +36,8 @@ // reporting and at most report once per thread. static std::atomic<bool> has_dumped = false; if (!has_dumped.load(std::memory_order_relaxed)) { - const std::string str = log_message->str(); - // Copy the LogMessage string to stack memory to make sure it can be + const std::string str = log_message->GetMessageWithoutPrefix(); + // Copy the LogMessage message to stack memory to make sure it can be // recovered in crash dumps. // TODO(pbos): Surface DCHECK_MESSAGE well in crash reporting to make this // redundant, then remove it.
diff --git a/base/logging.cc b/base/logging.cc index 9173128..e69a5b2 100644 --- a/base/logging.cc +++ b/base/logging.cc
@@ -911,6 +911,10 @@ } } +std::string LogMessage::GetMessageWithoutPrefix() const { + return str().substr(message_start_); +} + // writes the common header info to the stream void LogMessage::Init(const char* file, int line) { base::StringPiece filename(file);
diff --git a/base/logging.h b/base/logging.h index dba8d3e..48d1eb2 100644 --- a/base/logging.h +++ b/base/logging.h
@@ -646,8 +646,11 @@ std::ostream& stream() { return stream_; } - LogSeverity severity() { return severity_; } - std::string str() { return stream_.str(); } + LogSeverity severity() const { return severity_; } + std::string str() const { return stream_.str(); } + + // Gets the log message (w/o prefix). + std::string GetMessageWithoutPrefix() const; private: void Init(const char* file, int line);
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc index 69a8ada..feba067 100644 --- a/base/logging_unittest.cc +++ b/base/logging_unittest.cc
@@ -905,6 +905,14 @@ } } +TEST_F(LoggingTest, GetMessageWithoutPrefixStripsPrefix) { + EXPECT_EQ("", LogMessage("", 0, LOGGING_ERROR).GetMessageWithoutPrefix()); + + LogMessage msg("", 0, LOGGING_ERROR); + msg.stream() << "Hello"; + EXPECT_EQ("Hello", msg.GetMessageWithoutPrefix()); +} + #if !BUILDFLAG(USE_RUNTIME_VLOG) TEST_F(LoggingTest, BuildTimeVLOG) { // Use a static because only captureless lambdas can be converted to a
diff --git a/base/process/internal_linux.cc b/base/process/internal_linux.cc index 17c5cdd..bcd8b57 100644 --- a/base/process/internal_linux.cc +++ b/base/process/internal_linux.cc
@@ -212,7 +212,7 @@ if (!StringToUint64(cpu[0], &user) || !StringToUint64(cpu[1], &nice)) return TimeDelta(); - return ClockTicksToTimeDelta(user + nice); + return ClockTicksToTimeDelta(checked_cast<int64_t>(user + nice)); } TimeDelta ClockTicksToTimeDelta(int64_t clock_ticks) { @@ -224,7 +224,7 @@ // 0000040 17 100 3 134512692 // which means the answer is 100. // It may be the case that this value is always 100. - static const int kHertz = sysconf(_SC_CLK_TCK); + static const long kHertz = sysconf(_SC_CLK_TCK); return Microseconds(Time::kMicrosecondsPerSecond * clock_ticks / kHertz); }
diff --git a/base/process/launch.h b/base/process/launch.h index eb2e6904..05aae30 100644 --- a/base/process/launch.h +++ b/base/process/launch.h
@@ -434,7 +434,7 @@ // // It is unsafe to use any pthread APIs after ForkWithFlags(). // However, performing an exec() will lift this restriction. -BASE_EXPORT pid_t ForkWithFlags(unsigned long flags, pid_t* ptid, pid_t* ctid); +BASE_EXPORT pid_t ForkWithFlags(int flags, pid_t* ptid, pid_t* ctid); #endif namespace internal {
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc index be8f024..9196ad28 100644 --- a/base/process/launch_posix.cc +++ b/base/process/launch_posix.cc
@@ -138,8 +138,9 @@ // glibc's sigaction() will prevent access to sa_restorer, so we need to roll // our own. -int sys_rt_sigaction(int sig, const struct kernel_sigaction* act, - struct kernel_sigaction* oact) { +long sys_rt_sigaction(int sig, + const struct kernel_sigaction* act, + struct kernel_sigaction* oact) { return syscall(SYS_rt_sigaction, sig, act, oact, sizeof(kernel_sigset_t)); } @@ -151,7 +152,7 @@ void ResetChildSignalHandlersToDefaults(void) { for (int signum = 1; ; ++signum) { struct kernel_sigaction act = {nullptr}; - int sigaction_get_ret = sys_rt_sigaction(signum, nullptr, &act); + long sigaction_get_ret = sys_rt_sigaction(signum, nullptr, &act); if (sigaction_get_ret && errno == EINVAL) { #if !defined(NDEBUG) // Linux supports 32 real-time signals from 33 to 64. @@ -250,8 +251,10 @@ char *endptr; errno = 0; const long int fd = strtol(fd_dir.name(), &endptr, 10); - if (fd_dir.name()[0] == 0 || *endptr || fd < 0 || errno) + if (fd_dir.name()[0] == 0 || *endptr || fd < 0 || errno || + !IsValueInRangeForNumericType<int>(fd)) { continue; + } if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) continue; // Cannot use STL iterators here, since debug iterators use locks. @@ -265,7 +268,7 @@ if (fd == dir_fd) continue; - int ret = IGNORE_EINTR(close(fd)); + int ret = IGNORE_EINTR(close(static_cast<int>(fd))); DPCHECK(ret == 0); } } @@ -620,7 +623,7 @@ HANDLE_EINTR(read(pipe_fd[0], buffer, sizeof(buffer))); if (bytes_read <= 0) break; - output->append(buffer, bytes_read); + output->append(buffer, static_cast<size_t>(bytes_read)); } close(pipe_fd[0]); @@ -697,10 +700,8 @@ // new stack pointers and print a warning that may confuse the user. __attribute__((no_sanitize_address)) #endif -NOINLINE pid_t CloneAndLongjmpInChild(unsigned long flags, - pid_t* ptid, - pid_t* ctid, - jmp_buf* env) { +NOINLINE pid_t +CloneAndLongjmpInChild(int flags, pid_t* ptid, pid_t* ctid, jmp_buf* env) { // We use the libc clone wrapper instead of making the syscall // directly because making the syscall may fail to update the libc's // internal pid cache. The libc interface unfortunately requires @@ -720,7 +721,7 @@ } // anonymous namespace -pid_t ForkWithFlags(unsigned long flags, pid_t* ptid, pid_t* ctid) { +pid_t ForkWithFlags(int flags, pid_t* ptid, pid_t* ctid) { const bool clone_tls_used = flags & CLONE_SETTLS; const bool invalid_ctid = (flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) && !ctid;
diff --git a/base/process/process_handle_linux.cc b/base/process/process_handle_linux.cc index b31e018..33c4f166 100644 --- a/base/process/process_handle_linux.cc +++ b/base/process/process_handle_linux.cc
@@ -5,6 +5,7 @@ #include "base/process/process_handle.h" #include "base/files/file_util.h" +#include "base/numerics/safe_conversions.h" #include "base/process/internal_linux.h" #include "build/build_config.h" #if BUILDFLAG(IS_AIX) @@ -19,7 +20,8 @@ internalAIX::ReadProcStatsAndGetFieldAsInt64(process, internalAIX::VM_PPID); #else - internal::ReadProcStatsAndGetFieldAsInt64(process, internal::VM_PPID); + checked_cast<ProcessId>(internal::ReadProcStatsAndGetFieldAsInt64( + process, internal::VM_PPID)); #endif // TODO(zijiehe): Returns 0 if |process| does not have a parent process. if (pid)
diff --git a/base/process/process_iterator_linux.cc b/base/process/process_iterator_linux.cc index fd1821a2..f69f95f 100644 --- a/base/process/process_iterator_linux.cc +++ b/base/process/process_iterator_linux.cc
@@ -9,6 +9,7 @@ #include "base/files/file_util.h" #include "base/logging.h" #include "base/notreached.h" +#include "base/numerics/safe_conversions.h" #include "base/process/internal_linux.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -136,8 +137,10 @@ } entry_.pid_ = pid; - entry_.ppid_ = GetProcStatsFieldAsInt64(proc_stats, internal::VM_PPID); - entry_.gid_ = GetProcStatsFieldAsInt64(proc_stats, internal::VM_PGRP); + entry_.ppid_ = checked_cast<ProcessId>( + GetProcStatsFieldAsInt64(proc_stats, internal::VM_PPID)); + entry_.gid_ = checked_cast<ProcessId>( + GetProcStatsFieldAsInt64(proc_stats, internal::VM_PGRP)); entry_.cmd_line_args_.assign(cmd_line_args.begin(), cmd_line_args.end()); entry_.exe_file_ = GetProcessExecutablePath(pid).BaseName().value(); return true;
diff --git a/base/process/process_linux.cc b/base/process/process_linux.cc index eae3a21..4fd2586 100644 --- a/base/process/process_linux.cc +++ b/base/process/process_linux.cc
@@ -225,7 +225,7 @@ return false; int priority = background ? kBackgroundPriority : kForegroundPriority; - int result = setpriority(PRIO_PROCESS, process_, priority); + int result = setpriority(PRIO_PROCESS, static_cast<id_t>(process_), priority); DPCHECK(result == 0); return result == 0; }
diff --git a/base/process/process_metrics.h b/base/process/process_metrics.h index f897b204..6000d9a 100644 --- a/base/process/process_metrics.h +++ b/base/process/process_metrics.h
@@ -271,7 +271,7 @@ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \ BUILDFLAG(IS_AIX) - CPU::CoreType GetCoreType(int core_index); + CPU::CoreType GetCoreType(uint32_t core_index); #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX) @@ -434,7 +434,7 @@ // This should be used with care as no synchronization with running threads is // done. This is mostly useful to guarantee being single-threaded. // Returns 0 on failure. -BASE_EXPORT int GetNumberOfThreads(ProcessHandle process); +BASE_EXPORT int64_t GetNumberOfThreads(ProcessHandle process); // /proc/self/exe refers to the current executable. BASE_EXPORT extern const char kProcSelfExe[];
diff --git a/base/process/process_metrics_linux.cc b/base/process/process_metrics_linux.cc index 9ba7a86e..c3289d7 100644 --- a/base/process/process_metrics_linux.cc +++ b/base/process/process_metrics_linux.cc
@@ -22,6 +22,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/notreached.h" +#include "base/numerics/safe_conversions.h" #include "base/process/internal_linux.h" #include "base/process/process_metrics_iocounters.h" #include "base/strings/string_number_conversions.h" @@ -173,7 +174,7 @@ size_t ProcessMetrics::GetResidentSetSize() const { return internal::ReadProcStatsAndGetFieldAsSizeT(process_, internal::VM_RSS) * - getpagesize(); + checked_cast<size_t>(getpagesize()); } TimeDelta ProcessMetrics::GetCumulativeCPUUsage() { @@ -340,7 +341,8 @@ SystemMemoryInfoKB meminfo; if (!GetSystemMemoryInfo(&meminfo)) return 0; - return meminfo.total - meminfo.free - meminfo.buffers - meminfo.cached; + return checked_cast<size_t>(meminfo.total - meminfo.free - meminfo.buffers - + meminfo.cached); } int ParseProcStatCPU(StringPiece input) { @@ -375,7 +377,7 @@ return -1; } -int GetNumberOfThreads(ProcessHandle process) { +int64_t GetNumberOfThreads(ProcessHandle process) { return internal::ReadProcStatsAndGetFieldAsInt64(process, internal::VM_NUMTHREADS); } @@ -431,7 +433,7 @@ if (time > 0) { time_in_state_per_thread.push_back( {tid, current_core_type, current_core_index, frequency, - internal::ClockTicksToTimeDelta(time)}); + internal::ClockTicksToTimeDelta(checked_cast<int64_t>(time))}); } } else { // Data without a header is not supported. @@ -440,17 +442,17 @@ // Advance line. DCHECK_GT(num_chars, 0); - pos += num_chars; + pos += static_cast<size_t>(num_chars); } return true; } -CPU::CoreType ProcessMetrics::GetCoreType(int core_index) { +CPU::CoreType ProcessMetrics::GetCoreType(uint32_t core_index) { const std::vector<CPU::CoreType>& core_types = CPU::GetGuessedCoreTypes(); - if (static_cast<size_t>(core_index) >= core_types.size()) + if (core_index >= core_types.size()) return CPU::CoreType::kUnknown; - return core_types[static_cast<size_t>(core_index)]; + return core_types[core_index]; } const char kProcSelfExe[] = "/proc/self/exe"; @@ -680,9 +682,11 @@ Value VmStatInfo::ToValue() const { Value res(Value::Type::DICTIONARY); - res.SetIntKey("pswpin", pswpin); - res.SetIntKey("pswpout", pswpout); - res.SetIntKey("pgmajfault", pgmajfault); + // TODO(crbug.com/1334256): Make base::Value able to hold unsigned long and + // remove casts below. + res.SetIntKey("pswpin", static_cast<int>(pswpin)); + res.SetIntKey("pswpout", static_cast<int>(pswpout)); + res.SetIntKey("pgmajfault", static_cast<int>(pgmajfault)); return res; }
diff --git a/base/process/process_metrics_posix.cc b/base/process/process_metrics_posix.cc index ae6d3a6..5926815 100644 --- a/base/process/process_metrics_posix.cc +++ b/base/process/process_metrics_posix.cc
@@ -26,6 +26,8 @@ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) #include <features.h> + +#include "base/numerics/safe_conversions.h" #endif namespace base { @@ -88,7 +90,7 @@ void IncreaseFdLimitTo(unsigned int max_descriptors) { struct rlimit limits; if (getrlimit(RLIMIT_NOFILE, &limits) == 0) { - unsigned int new_limit = max_descriptors; + rlim_t new_limit = max_descriptors; if (max_descriptors <= limits.rlim_cur) return; if (limits.rlim_max > 0 && limits.rlim_max < max_descriptors) { @@ -119,7 +121,7 @@ struct mallinfo minfo = mallinfo(); #endif #undef MALLINFO2_FOUND_IN_LIBC - return minfo.hblkhd + minfo.arena; + return checked_cast<size_t>(minfo.hblkhd + minfo.arena); } } // namespace
diff --git a/base/process/process_metrics_unittest.cc b/base/process/process_metrics_unittest.cc index eceae04..8ab3e9b1 100644 --- a/base/process/process_metrics_unittest.cc +++ b/base/process/process_metrics_unittest.cc
@@ -601,7 +601,7 @@ // http://crbug.com/396455 TEST(ProcessMetricsTest, DISABLED_GetNumberOfThreads) { const ProcessHandle current = GetCurrentProcessHandle(); - const int initial_threads = GetNumberOfThreads(current); + const int64_t initial_threads = GetNumberOfThreads(current); ASSERT_GT(initial_threads, 0); const int kNumAdditionalThreads = 10; {
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc index bddae2a..83501156e 100644 --- a/base/process/process_posix.cc +++ b/base/process/process_posix.cc
@@ -67,9 +67,9 @@ } pid_t ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG)); - static const int64_t kMaxSleepInMicroseconds = 1 << 18; // ~256 milliseconds. - int64_t max_sleep_time_usecs = 1 << 10; // ~1 milliseconds. - int64_t double_sleep_time = 0; + static const uint32_t kMaxSleepInMicroseconds = 1 << 18; // ~256 ms. + uint32_t max_sleep_time_usecs = 1 << 10; // ~1 ms. + int double_sleep_time = 0; // If the process hasn't exited yet, then sleep and try again. base::TimeTicks wakeup_time = base::TimeTicks::Now() + wait; @@ -77,12 +77,10 @@ base::TimeTicks now = base::TimeTicks::Now(); if (now > wakeup_time) break; - // Guaranteed to be non-negative! - int64_t sleep_time_usecs = (wakeup_time - now).InMicroseconds(); - // Sleep for a bit while we wait for the process to finish. - if (sleep_time_usecs > max_sleep_time_usecs) - sleep_time_usecs = max_sleep_time_usecs; + const uint32_t sleep_time_usecs = static_cast<uint32_t>( + std::min(static_cast<uint64_t>((wakeup_time - now).InMicroseconds()), + uint64_t{max_sleep_time_usecs})); // usleep() will return 0 and set errno to EINTR on receipt of a signal // such as SIGCHLD. usleep(sleep_time_usecs); @@ -394,7 +392,7 @@ int Process::GetPriority() const { DCHECK(IsValid()); - return getpriority(PRIO_PROCESS, process_); + return getpriority(PRIO_PROCESS, static_cast<id_t>(process_)); } } // namespace base
diff --git a/base/trace_event/java_heap_dump_provider_android.cc b/base/trace_event/java_heap_dump_provider_android.cc index 624f743..3e4881e 100644 --- a/base/trace_event/java_heap_dump_provider_android.cc +++ b/base/trace_event/java_heap_dump_provider_android.cc
@@ -21,8 +21,8 @@ bool JavaHeapDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, ProcessMemoryDump* pmd) { // These numbers come from java.lang.Runtime stats. - long total_heap_size = 0; - long free_heap_size = 0; + uint64_t total_heap_size = 0; + uint64_t free_heap_size = 0; android::JavaRuntime::GetMemoryUsage(&total_heap_size, &free_heap_size); MemoryAllocatorDump* outer_dump = pmd->CreateAllocatorDump("java_heap");
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 233de40f..b9a75572 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -8.20220707.1.1 +8.20220707.2.1
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 58e8de92..2198b2a2 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
@@ -389,6 +389,7 @@ @Test @SmallTest @DisableIf.Device(type = {UiDisableIf.TABLET}) // see crbug.com/1177417 + @DisabledTest(message = "https://crbug.com/1311737") public void testTypeBeforeDeferredInitialization() throws Exception { // Start the Activity. It should pause and assume that a promo dialog has appeared. mTestDelegate.shouldDelayDeferredInitialization = true;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java index 87cab2c..692ac20 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
@@ -21,6 +21,7 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; import androidx.test.core.app.ActivityScenario; import com.google.android.material.tabs.TabLayout; @@ -60,6 +61,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -175,9 +177,11 @@ private Intent mHistoryActivityIntent = new Intent(); private Intent mOpenUrlIntent = new Intent(); private Activity mActivity; - private Promise mPromise = new Promise(); + private Promise<HistoryClustersResult> mPromise = new Promise(); private ClusterVisit mVisit1; private ClusterVisit mVisit2; + private HistoryCluster mCluster; + private HistoryClustersResult mClusterResult; private TestHistoryClustersDelegate mHistoryClustersDelegate = new TestHistoryClustersDelegate(); private List<ClusterVisit> mVisitsForRemoval = new ArrayList<>(); @@ -195,6 +199,9 @@ new ArrayList<>(), mGurl1, 123L, new ArrayList<>()); mVisit2 = new ClusterVisit(1.0F, mGurl2, "Title 2", "bar.com", new ArrayList<>(), new ArrayList<>(), mGurl2, 123L, new ArrayList<>()); + mCluster = new HistoryCluster(Arrays.asList(mVisit1, mVisit2), "\"label\"", "label", + Collections.emptyList(), 123L, Arrays.asList("pugs", "terriers")); + mClusterResult = new HistoryClustersResult(Arrays.asList(mCluster), "dogs", false, false); mActivityScenario = ActivityScenario.launch(ChromeTabbedActivity.class).onActivity(activity -> { @@ -345,6 +352,46 @@ assertThat(mVisitsForRemoval, Matchers.containsInAnyOrder(mVisit1, mVisit2)); } + @Test + public void testSetQueryState() { + mHistoryClustersCoordinator.inflateActivityView(); + mHistoryClustersCoordinator.setQueryState(QueryState.forQuery("dogs")); + fulfillPromise(mPromise, mClusterResult); + + RecyclerView recyclerView = mHistoryClustersCoordinator.getRecyclerViewFortesting(); + recyclerView.measure(0, 0); + recyclerView.layout(0, 0, 600, 1000); + + assertHasViewWithClass(recyclerView, HistoryClustersRelatedSearchesChipLayout.class); + assertHasViewWithClass(recyclerView, HistoryClustersItemView.class); + assertHasViewWithClass(recyclerView, HistoryClusterView.class); + } + + @Test + public void testDestroy() { + mHistoryClustersCoordinator.inflateActivityView(); + mHistoryClustersCoordinator.setQueryState(QueryState.forQuery("dogs")); + mHistoryClustersCoordinator.destroy(); + + // Fulfilling the promise post-destroy shouldn't crash or do anything else for that matter. + fulfillPromise(mPromise, mClusterResult); + } + + private <T> void fulfillPromise(Promise<T> promise, T result) { + promise.fulfill(result); + ShadowLooper.idleMainLooper(); + } + + private void assertHasViewWithClass(RecyclerView recyclerView, Class clazz) { + for (int i = 0; i < recyclerView.getAdapter().getItemCount(); i++) { + RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(i); + if (clazz.equals(viewHolder.itemView.getClass())) { + return; + } + } + assertFalse(true); + } + private static void resetStaticState() { DisplayAndroidManager.resetInstanceForTesting(); TabWindowManagerSingleton.resetTabModelSelectorFactoryForTesting();
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 51fa151..99e6869 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1057,8 +1057,6 @@ "password_manager/password_reuse_manager_factory.h", "password_manager/password_scripts_fetcher_factory.cc", "password_manager/password_scripts_fetcher_factory.h", - "password_manager/password_store_backend_sync_delegate_impl.cc", - "password_manager/password_store_backend_sync_delegate_impl.h", "password_manager/password_store_factory.cc", "password_manager/password_store_factory.h", "password_manager/password_store_utils.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 4beea75..2e9fc611 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -8178,6 +8178,16 @@ FEATURE_VALUE_TYPE(features::kDelegatedCompositing)}, #endif +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_CHROMEOS_ASH) + {"document-picture-in-picture-api", + flag_descriptions::kDocumentPictureInPictureApiName, + flag_descriptions::kDocumentPictureInPictureApiDescription, + kOsMac | kOsWin | kOsLinux | kOsCrOS, + FEATURE_VALUE_TYPE(features::kPictureInPictureV2)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_CHROMEOS_ASH) + {"web-midi", flag_descriptions::kWebMidiName, flag_descriptions::kWebMidiDescription, kOsAll, FEATURE_VALUE_TYPE(features::kWebMidi)},
diff --git a/chrome/browser/ash/crosapi/test_controller_ash.cc b/chrome/browser/ash/crosapi/test_controller_ash.cc index 366fe177..f3f48b0 100644 --- a/chrome/browser/ash/crosapi/test_controller_ash.cc +++ b/chrome/browser/ash/crosapi/test_controller_ash.cc
@@ -32,6 +32,8 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/views/tabs/tab_scrubber_chromeos.h" +#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h" +#include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/dbus/shill/shill_profile_client.h" #include "chromeos/dbus/shill/shill_third_party_vpn_driver_client.h" #include "components/version_info/version_info.h" @@ -514,6 +516,38 @@ #endif // defined(USE_CUPS) } +void TestControllerAsh::BindShillClientTestInterface( + mojo::PendingReceiver<crosapi::mojom::ShillClientTestInterface> receiver, + BindShillClientTestInterfaceCallback callback) { + mojo::MakeSelfOwnedReceiver<crosapi::mojom::ShillClientTestInterface>( + std::make_unique<crosapi::ShillClientTestInterfaceAsh>(), + std::move(receiver)); + std::move(callback).Run(); +} + +void TestControllerAsh::GetSanitizedActiveUsername( + GetSanitizedActiveUsernameCallback callback) { + user_manager::UserManager* user_manager = user_manager::UserManager::Get(); + user_manager::User* user = user_manager->GetActiveUser(); + CHECK(user); + + ::user_data_auth::GetSanitizedUsernameRequest request; + + request.set_username( + cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId()) + .account_id()); + ash::CryptohomeMiscClient::Get()->GetSanitizedUsername( + request, + base::BindOnce( + [](GetSanitizedActiveUsernameCallback callback, + absl::optional<::user_data_auth::GetSanitizedUsernameReply> + result) { + CHECK(result.has_value()); + std::move(callback).Run(result->sanitized_username()); + }, + std::move(callback))); +} + // This class waits for overview mode to either enter or exit and fires a // callback. This class will fire the callback at most once. class TestControllerAsh::OverviewWaiter : public ash::OverviewObserver { @@ -605,4 +639,100 @@ client->OnPlatformMessage(shill_key, message); } +//////////// +// ShillClientTestInterfaceAsh + +ShillClientTestInterfaceAsh::ShillClientTestInterfaceAsh() = default; +ShillClientTestInterfaceAsh::~ShillClientTestInterfaceAsh() = default; + +void ShillClientTestInterfaceAsh::AddDevice(const std::string& device_path, + const std::string& type, + const std::string& name, + AddDeviceCallback callback) { + auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface(); + device_test->AddDevice(device_path, type, name); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::ClearDevices(ClearDevicesCallback callback) { + auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface(); + device_test->ClearDevices(); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::SetDeviceProperty( + const std::string& device_path, + const std::string& name, + ::base::Value value, + bool notify_changed, + SetDevicePropertyCallback callback) { + auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface(); + device_test->SetDeviceProperty(device_path, name, value, notify_changed); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::SetSimLocked(const std::string& device_path, + bool enabled, + SetSimLockedCallback callback) { + auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface(); + device_test->SetSimLocked(device_path, enabled); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::AddService( + const std::string& service_path, + const std::string& guid, + const std::string& name, + const std::string& type, + const std::string& state, + bool visible, + SetDevicePropertyCallback callback) { + auto* service_test = chromeos::ShillServiceClient::Get()->GetTestInterface(); + service_test->AddService(service_path, guid, name, type, state, visible); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::ClearServices( + ClearServicesCallback callback) { + auto* service_test = chromeos::ShillServiceClient::Get()->GetTestInterface(); + service_test->ClearServices(); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::SetServiceProperty( + const std::string& service_path, + const std::string& property, + base::Value value, + SetServicePropertyCallback callback) { + auto* service_test = chromeos::ShillServiceClient::Get()->GetTestInterface(); + service_test->SetServiceProperty(service_path, property, value); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::AddProfile(const std::string& profile_path, + const std::string& userhash, + AddProfileCallback callback) { + auto* profile_test = chromeos::ShillProfileClient::Get()->GetTestInterface(); + profile_test->AddProfile(profile_path, userhash); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::AddServiceToProfile( + const std::string& profile_path, + const std::string& service_path, + AddServiceToProfileCallback callback) { + auto* profile_test = chromeos::ShillProfileClient::Get()->GetTestInterface(); + profile_test->AddService(profile_path, service_path); + std::move(callback).Run(); +} + +void ShillClientTestInterfaceAsh::AddIPConfig(const std::string& ip_config_path, + ::base::Value properties, + AddIPConfigCallback callback) { + auto* ip_config_test = + chromeos::ShillIPConfigClient::Get()->GetTestInterface(); + ip_config_test->AddIPConfig(ip_config_path, properties); + std::move(callback).Run(); +} + } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/test_controller_ash.h b/chrome/browser/ash/crosapi/test_controller_ash.h index 9c36a59..3faae57 100644 --- a/chrome/browser/ash/crosapi/test_controller_ash.h +++ b/chrome/browser/ash/crosapi/test_controller_ash.h
@@ -85,6 +85,13 @@ const std::string& job_title, CreateAndCancelPrintJobCallback callback) override; + void BindShillClientTestInterface( + mojo::PendingReceiver<crosapi::mojom::ShillClientTestInterface> receiver, + BindShillClientTestInterfaceCallback callback) override; + + void GetSanitizedActiveUsername( + GetSanitizedActiveUsernameCallback callback) override; + mojo::Remote<mojom::StandaloneBrowserTestController>& GetStandaloneBrowserTestController() { DCHECK(standalone_browser_test_controller_.is_bound()); @@ -141,6 +148,51 @@ uint32_t message) override; }; +class ShillClientTestInterfaceAsh + : public crosapi::mojom::ShillClientTestInterface { + public: + ShillClientTestInterfaceAsh(); + ~ShillClientTestInterfaceAsh() override; + + void AddDevice(const std::string& device_path, + const std::string& type, + const std::string& name, + AddDeviceCallback callback) override; + void ClearDevices(ClearDevicesCallback callback) override; + void SetDeviceProperty(const std::string& device_path, + const std::string& name, + ::base::Value value, + bool notify_changed, + SetDevicePropertyCallback callback) override; + void SetSimLocked(const std::string& device_path, + bool enabled, + SetSimLockedCallback callback) override; + + void AddService(const std::string& service_path, + const std::string& guid, + const std::string& name, + const std::string& type, + const std::string& state, + bool visible, + AddServiceCallback callback) override; + void ClearServices(ClearServicesCallback callback) override; + void SetServiceProperty(const std::string& service_path, + const std::string& property, + base::Value value, + SetServicePropertyCallback callback) override; + + void AddProfile(const std::string& profile_path, + const std::string& userhash, + AddProfileCallback callback) override; + void AddServiceToProfile(const std::string& profile_path, + const std::string& service_path, + AddServiceToProfileCallback callback) override; + + void AddIPConfig(const std::string& ip_config_path, + ::base::Value properties, + AddIPConfigCallback callback) override; +}; + } // namespace crosapi #endif // CHROME_BROWSER_ASH_CROSAPI_TEST_CONTROLLER_ASH_H_
diff --git a/chrome/browser/ash/network_change_manager_client_browsertest.cc b/chrome/browser/ash/network_change_manager_client_browsertest.cc index 691d0f6..a79892b 100644 --- a/chrome/browser/ash/network_change_manager_client_browsertest.cc +++ b/chrome/browser/ash/network_change_manager_client_browsertest.cc
@@ -138,7 +138,7 @@ // Tests that network changes from shill are received by both the // NetworkChangeNotifier and NetworkConnectionTracker. IN_PROC_BROWSER_TEST_F(NetworkChangeManagerClientBrowserTest, - ReceiveNotifications) { + DISABLED_ReceiveNotifications) { // TODO(b/229673213): Remove log once flakiness is fixed. LOG(INFO) << "ReceiveNotifications test start"; NetObserver net_observer;
diff --git a/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc b/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc index 4bad2e8..27c841c 100644 --- a/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc +++ b/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc
@@ -157,6 +157,7 @@ #endif } +#if BUILDFLAG(IS_WIN) void SetUseIeSitelist(bool use_ie_sitelist) { policy::PolicyMap policies; EnableBrowserSwitcher(&policies); @@ -165,6 +166,7 @@ provider_.UpdateChromePolicy(policies); base::RunLoop().RunUntilIdle(); } +#endif void SetExternalUrl(const std::string& url) { policy::PolicyMap policies;
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc index 964609a..6e32a44 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
@@ -89,17 +89,12 @@ ->set_test_mode(true); } - bool RunAutotestPrivateExtensionTest(const std::string& test_suite) { - return RunAutotestPrivateExtensionTest( - test_suite, - /*suite_args=*/std::vector<base::Value>()); - } - - bool RunAutotestPrivateExtensionTest(const std::string& test_suite, - std::vector<base::Value> suite_args) { - base::DictionaryValue custom_args; - custom_args.SetKey("testSuite", base::Value(test_suite)); - custom_args.SetKey("args", base::Value(suite_args)); + bool RunAutotestPrivateExtensionTest( + const std::string& test_suite, + base::Value::List suite_args = base::Value::List()) { + base::Value::Dict custom_args; + custom_args.Set("testSuite", test_suite); + custom_args.Set("args", std::move(suite_args)); std::string json; if (!base::JSONWriter::Write(custom_args, &json)) { @@ -219,10 +214,10 @@ const bool mark_time_of_first_add = GetParam(); - base::DictionaryValue options; - options.SetBoolKey("markTimeOfFirstAdd", mark_time_of_first_add); - std::vector<base::Value> suite_args; - suite_args.emplace_back(std::move(options)); + base::Value::Dict options; + options.Set("markTimeOfFirstAdd", mark_time_of_first_add); + base::Value::List suite_args; + suite_args.Append(std::move(options)); ASSERT_TRUE( RunAutotestPrivateExtensionTest("holdingSpace", std::move(suite_args)))
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index 15e5cb3..58aa0931 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -288,12 +288,12 @@ *params->change_info.arc_removable_media_access_enabled); } if (params->change_info.folder_shortcuts) { - std::vector<base::Value> folder_shortcuts; + base::Value::List folder_shortcuts; for (auto& shortcut : *params->change_info.folder_shortcuts) { - folder_shortcuts.push_back(base::Value(shortcut)); + folder_shortcuts.Append(shortcut); } - service->Set(ash::prefs::kFilesAppFolderShortcuts, - base::Value(std::move(folder_shortcuts))); + service->SetList(ash::prefs::kFilesAppFolderShortcuts, + std::move(folder_shortcuts)); } return RespondNow(NoArguments());
diff --git a/chrome/browser/device_reauth/android/biometric_authenticator_android.cc b/chrome/browser/device_reauth/android/biometric_authenticator_android.cc index 9fcbc92..e7de6eb 100644 --- a/chrome/browser/device_reauth/android/biometric_authenticator_android.cc +++ b/chrome/browser/device_reauth/android/biometric_authenticator_android.cc
@@ -14,6 +14,7 @@ #include "base/location.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/notreached.h" #include "base/time/time.h" #include "chrome/browser/device_reauth/android/biometric_authenticator_bridge_impl.h" #include "components/autofill/core/common/autofill_features.h" @@ -27,7 +28,6 @@ #include "ui/android/view_android.h" using content::WebContents; -using device_reauth::BiometricAuthFinalResult; using device_reauth::BiometricAuthUIResult; using device_reauth::BiometricsAvailability; using password_manager::UiCredential; @@ -141,6 +141,13 @@ base::Unretained(this))); } +void BiometricAuthenticatorAndroid::AuthenticateWithMessage( + device_reauth::BiometricAuthRequester requester, + const std::u16string message, + AuthenticateCallback callback) { + NOTIMPLEMENTED(); +} + void BiometricAuthenticatorAndroid::Cancel( device_reauth::BiometricAuthRequester requester) { // The object cancelling the auth is not the same as the one to which
diff --git a/chrome/browser/device_reauth/android/biometric_authenticator_android.h b/chrome/browser/device_reauth/android/biometric_authenticator_android.h index e446c46..322598b 100644 --- a/chrome/browser/device_reauth/android/biometric_authenticator_android.h +++ b/chrome/browser/device_reauth/android/biometric_authenticator_android.h
@@ -13,6 +13,37 @@ #include "components/password_manager/core/browser/origin_credential_store.h" #include "third_party/abseil-cpp/absl/types/optional.h" +// The result of the biometric authentication. +// +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class BiometricAuthFinalResult { + // This value is used for when we don't know the exact auth method used. This + // can be the case on Android versions under 11. + kSuccessWithUnknownMethod = 0, + kSuccessWithBiometrics = 1, + kSuccessWithDeviceLock = 2, + kCanceledByUser = 3, + kFailed = 4, + + // Deprecated in favour of kCanceledByChrome. Recorded when the auth succeeds + // after Chrome cancelled it. + // kSuccessButCanceled = 5, + + // Deprecated in favour of kCanceledByChrome. Recorded when the auth fails + // after Chrome cancelled it. + // kFailedAndCanceled = 6, + + // Recorded if an authentication was requested within 60s of the previous + // successful authentication. + kAuthStillValid = 7, + + // Recorded when the authentication flow is cancelled by Chrome. + kCanceledByChrome = 8, + + kMaxValue = kCanceledByChrome, +}; + // Android implementation of the BiometricAuthenticator interface. class BiometricAuthenticatorAndroid : public device_reauth::BiometricAuthenticator { @@ -28,6 +59,13 @@ void Authenticate(device_reauth::BiometricAuthRequester requester, AuthenticateCallback callback) override; + // Trigges an authentication flow based on biometrics, with the + // screen lock as fallback. Displays `message` in the authentication UI. + // Note: this only supports one authentication request at a time. + void AuthenticateWithMessage(device_reauth::BiometricAuthRequester requester, + const std::u16string message, + AuthenticateCallback callback) override; + // Should be called by the object using the authenticator if the purpose // for which the auth was requested becomes obsolete or the object is // destroyed.
diff --git a/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc b/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc index 0e8c30c..5091a49d 100644 --- a/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc +++ b/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc
@@ -25,7 +25,6 @@ using base::Bucket; using base::test::RunOnceCallback; using device_reauth::BiometricAuthenticator; -using device_reauth::BiometricAuthFinalResult; using device_reauth::BiometricAuthRequester; using device_reauth::BiometricAuthUIResult; using device_reauth::BiometricsAvailability;
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc index bae6384..52562af 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -5,8 +5,6 @@ #include <memory> #include <utility> -#include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" @@ -20,23 +18,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.h" #include "chrome/browser/extensions/extension_apitest.h" -#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h" -#include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" -#include "chromeos/ash/components/network/cellular_metrics_logger.h" -#include "chromeos/ash/components/network/managed_network_configuration_handler.h" -#include "chromeos/ash/components/network/network_certificate_handler.h" -#include "chromeos/ash/components/network/network_handler_test_helper.h" -#include "chromeos/ash/components/network/onc/network_onc_utils.h" -#include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/shill/shill_device_client.h" -#include "chromeos/dbus/shill/shill_ipconfig_client.h" -#include "chromeos/dbus/shill/shill_manager_client.h" -#include "chromeos/dbus/shill/shill_profile_client.h" -#include "chromeos/dbus/shill/shill_service_client.h" -#include "chromeos/network/network_handler.h" -#include "chromeos/network/network_state.h" -#include "chromeos/network/network_state_handler.h" -#include "chromeos/network/network_type_pattern.h" #include "components/onc/onc_constants.h" #include "components/onc/onc_pref_names.h" #include "components/policy/core/browser/browser_policy_connector.h" @@ -55,16 +36,44 @@ #include "components/user_manager/user_names.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_utils.h" -#include "dbus/object_path.h" #include "extensions/browser/api/networking_private/networking_private_chromeos.h" #include "extensions/browser/api/networking_private/networking_private_delegate_factory.h" #include "extensions/common/switches.h" #include "extensions/common/value_builder.h" #include "extensions/test/extension_test_message_listener.h" #include "testing/gmock/include/gmock/gmock.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/cros_system_api/dbus/service_constants.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/components/cryptohome/cryptohome_parameters.h" +#include "ash/constants/ash_switches.h" +#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h" +#include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" +#include "chromeos/ash/components/network/cellular_metrics_logger.h" +#include "chromeos/ash/components/network/managed_network_configuration_handler.h" +#include "chromeos/ash/components/network/network_certificate_handler.h" +#include "chromeos/ash/components/network/network_handler_test_helper.h" +#include "chromeos/ash/components/network/onc/network_onc_utils.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/shill/shill_device_client.h" +#include "chromeos/dbus/shill/shill_ipconfig_client.h" +#include "chromeos/dbus/shill/shill_manager_client.h" +#include "chromeos/dbus/shill/shill_profile_client.h" +#include "chromeos/dbus/shill/shill_service_client.h" +#include "chromeos/network/network_handler.h" +#include "chromeos/network/network_state.h" +#include "chromeos/network/network_state_handler.h" +#include "chromeos/network/network_type_pattern.h" +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h" +#include "chromeos/crosapi/mojom/test_controller.mojom.h" +#include "chromeos/lacros/lacros_service.h" + +using crosapi::mojom::ShillClientTestInterfaceAsyncWaiter; +#endif + // This tests the Chrome OS implementation of the networkingPrivate API // (NetworkingPrivateChromeOS). Note: The test expectations for chromeos, and // win/mac (NetworkingPrivateServiceClient) are different to reflect the @@ -73,6 +82,7 @@ using testing::Return; using testing::_; +#if BUILDFLAG(IS_CHROMEOS_ASH) using ash::UserDataAuthClient; using chromeos::ShillDeviceClient; using chromeos::ShillIPConfigClient; @@ -83,41 +93,30 @@ using extensions::NetworkingPrivateDelegate; using extensions::NetworkingPrivateDelegateFactory; using extensions::NetworkingPrivateChromeOS; +#endif namespace { -const char kUser1ProfilePath[] = "/profile/user1/shill"; -const char kEthernetDevicePath[] = "/device/stub_ethernet_device"; -const char kWifiDevicePath[] = "/device/stub_wifi_device1"; +const char kCellular1ServicePath[] = "stub_cellular1"; const char kCellularDevicePath[] = "/device/stub_cellular_device1"; +const char kEthernetDevicePath[] = "/device/stub_ethernet_device"; const char kIPConfigPath[] = "/ipconfig/ipconfig1"; - +const char kUser1ProfilePath[] = "/profile/user1/shill"; const char kWifi1ServicePath[] = "stub_wifi1"; const char kWifi2ServicePath[] = "stub_wifi2"; -const char kCellular1ServicePath[] = "stub_cellular1"; +const char kWifiDevicePath[] = "/device/stub_wifi_device1"; -class UIDelegateStub : public NetworkingPrivateDelegate::UIDelegate { +class NetworkingPrivateChromeOSApiTestBase + : public extensions::ExtensionApiTest { public: - static int s_show_account_details_called_; - - private: - // UIDelegate - void ShowAccountDetails(const std::string& guid) const override { - ++s_show_account_details_called_; + // From extensions::ExtensionApiTest + void SetUpCommandLine(base::CommandLine* command_line) override { + extensions::ExtensionApiTest::SetUpCommandLine(command_line); + // Allowlist the extension ID of the test extension. + command_line->AppendSwitchASCII( + extensions::switches::kAllowlistedExtensionID, + "epcifkihnkjgphfkloaaleeakhpmgdmn"); } -}; - -// static -int UIDelegateStub::s_show_account_details_called_ = 0; - -class NetworkingPrivateChromeOSApiTest : public extensions::ExtensionApiTest { - public: - NetworkingPrivateChromeOSApiTest() {} - - NetworkingPrivateChromeOSApiTest(const NetworkingPrivateChromeOSApiTest&) = - delete; - NetworkingPrivateChromeOSApiTest& operator=( - const NetworkingPrivateChromeOSApiTest&) = delete; bool RunNetworkingSubtest(const std::string& test) { const std::string arg = @@ -127,62 +126,107 @@ {.custom_arg = arg.c_str(), .launch_as_platform_app = true}); } - void SetUpInProcessBrowserTestFixture() override { - provider_.SetDefaultReturns( - /*is_initialization_complete_return=*/true, - /*is_first_policy_load_complete_return=*/true); - policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); + void ConfigFakeNetwork() { + ClearDevices(); + ClearServices(); - extensions::ExtensionApiTest::SetUpInProcessBrowserTestFixture(); + std::string userhash = GetSanitizedActiveUsername(); + + // Sends a notification about the added profile. + AddProfile(kUser1ProfilePath, userhash); + + // Add IPConfigs + base::DictionaryValue ipconfig; + ipconfig.SetKey(shill::kAddressProperty, base::Value("0.0.0.0")); + ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.1")); + ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(0)); + ipconfig.SetKey(shill::kMethodProperty, base::Value(shill::kTypeIPv4)); + AddIPConfig(kIPConfigPath, ipconfig); + + // Add Devices + AddDevice(kEthernetDevicePath, shill::kTypeEthernet, + "stub_ethernet_device1"); + + AddDevice(kWifiDevicePath, shill::kTypeWifi, "stub_wifi_device1"); + base::ListValue wifi_ip_configs; + wifi_ip_configs.Append(kIPConfigPath); + SetDeviceProperty(kWifiDevicePath, shill::kIPConfigsProperty, + wifi_ip_configs); + SetDeviceProperty(kWifiDevicePath, shill::kAddressProperty, + base::Value("001122aabbcc")); + + // Add Services + AddService("stub_ethernet", "eth0", shill::kTypeEthernet, + shill::kStateOnline); + SetServiceProperty("stub_ethernet", shill::kProfileProperty, + base::Value(GetSharedProfilePath())); + AddServiceToProfile(GetSharedProfilePath(), "stub_ethernet"); + + AddService(kWifi1ServicePath, "wifi1", shill::kTypeWifi, + shill::kStateOnline); + SetServiceProperty(kWifi1ServicePath, shill::kSecurityClassProperty, + base::Value(shill::kSecurityWep)); + SetServiceProperty(kWifi1ServicePath, shill::kWifiBSsid, + base::Value("00:01:02:03:04:05")); + SetServiceProperty(kWifi1ServicePath, shill::kSignalStrengthProperty, + base::Value(40)); + SetServiceProperty(kWifi1ServicePath, shill::kProfileProperty, + base::Value(kUser1ProfilePath)); + SetServiceProperty(kWifi1ServicePath, shill::kConnectableProperty, + base::Value(true)); + SetServiceProperty(kWifi1ServicePath, shill::kDeviceProperty, + base::Value(kWifiDevicePath)); + base::DictionaryValue static_ipconfig; + static_ipconfig.SetKey(shill::kAddressProperty, base::Value("1.2.3.4")); + static_ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.0")); + static_ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(1)); + SetServiceProperty(kWifi1ServicePath, shill::kStaticIPConfigProperty, + static_ipconfig); + base::ListValue frequencies1; + frequencies1.Append(2400); + SetServiceProperty(kWifi1ServicePath, shill::kWifiFrequencyListProperty, + frequencies1); + SetServiceProperty(kWifi1ServicePath, shill::kWifiFrequency, + base::Value(2400)); + AddServiceToProfile(kUser1ProfilePath, kWifi1ServicePath); + + AddService(kWifi2ServicePath, "wifi2_PSK", shill::kTypeWifi, + shill::kStateIdle); + SetServiceProperty(kWifi2ServicePath, shill::kSecurityClassProperty, + base::Value(shill::kSecurityPsk)); + SetServiceProperty(kWifi2ServicePath, shill::kSignalStrengthProperty, + base::Value(80)); + SetServiceProperty(kWifi2ServicePath, shill::kConnectableProperty, + base::Value(true)); + + base::ListValue frequencies2; + frequencies2.Append(2400); + frequencies2.Append(5000); + SetServiceProperty(kWifi2ServicePath, shill::kWifiFrequencyListProperty, + frequencies2); + SetServiceProperty(kWifi2ServicePath, shill::kWifiFrequency, + base::Value(5000)); + SetServiceProperty(kWifi2ServicePath, shill::kProfileProperty, + base::Value(kUser1ProfilePath)); + AddServiceToProfile(kUser1ProfilePath, kWifi2ServicePath); + + AddService("stub_vpn1", "vpn1", shill::kTypeVPN, shill::kStateOnline); + SetServiceProperty("stub_vpn1", shill::kProviderTypeProperty, + base::Value(shill::kProviderOpenVpn)); + AddServiceToProfile(kUser1ProfilePath, "stub_vpn1"); + + AddService("stub_vpn2", "vpn2", shill::kTypeVPN, shill::kStateOffline); + SetServiceProperty("stub_vpn2", shill::kProviderTypeProperty, + base::Value(shill::kProviderThirdPartyVpn)); + SetServiceProperty("stub_vpn2", shill::kProviderHostProperty, + base::Value("third_party_provider_extension_id")); + AddServiceToProfile(kUser1ProfilePath, "stub_vpn2"); } - void SetUpCommandLine(base::CommandLine* command_line) override { - extensions::ExtensionApiTest::SetUpCommandLine(command_line); - // Allowlist the extension ID of the test extension. - command_line->AppendSwitchASCII( - extensions::switches::kAllowlistedExtensionID, - "epcifkihnkjgphfkloaaleeakhpmgdmn"); - - // TODO(pneubeck): Remove the following hack, once the NetworkingPrivateAPI - // uses the ProfileHelper to obtain the userhash crbug/238623. - cryptohome::AccountIdentifier login_user; - login_user.set_account_id(user_manager::CanonicalizeUserID( - command_line->GetSwitchValueNative(ash::switches::kLoginUser))); - const std::string sanitized_user = - UserDataAuthClient::GetStubSanitizedUsername(login_user); - command_line->AppendSwitchASCII(ash::switches::kLoginProfile, - sanitized_user); - } - - void InitializeSanitizedUsername() { - user_manager::UserManager* user_manager = user_manager::UserManager::Get(); - user_manager::User* user = user_manager->GetActiveUser(); - CHECK(user); - std::string userhash; - ::user_data_auth::GetSanitizedUsernameRequest request; - request.set_username( - cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId()) - .account_id()); - ash::CryptohomeMiscClient::Get()->GetSanitizedUsername( - request, - base::BindOnce( - [](std::string* out, - absl::optional<::user_data_auth::GetSanitizedUsernameReply> - result) { - CHECK(result.has_value()); - *out = result->sanitized_username(); - }, - &userhash_)); - content::RunAllPendingInMessageLoop(); - CHECK(!userhash_.empty()); - } - - void SetupCellular() { - UIDelegateStub::s_show_account_details_called_ = 0; - + virtual void SetupCellular() { // Add a Cellular GSM Device. - device_test()->AddDevice(kCellularDevicePath, shill::kTypeCellular, - "stub_cellular_device1"); + AddDevice(kCellularDevicePath, shill::kTypeCellular, + "stub_cellular_device1"); base::DictionaryValue home_provider; home_provider.SetStringKey("name", "Cellular1_Provider"); home_provider.SetStringKey("code", "000000"); @@ -205,31 +249,89 @@ base::Value("test_min")); SetDeviceProperty(kCellularDevicePath, shill::kModelIdProperty, base::Value("test_model_id")); - device_test()->SetSimLocked(kCellularDevicePath, false); + SetSimLocked(kCellularDevicePath, false); // Add the Cellular Service. AddService(kCellular1ServicePath, "cellular1", shill::kTypeCellular, shill::kStateIdle); - service_test()->SetServiceProperty(kCellular1ServicePath, - shill::kCellularAllowRoamingProperty, - base::Value(false)); - service_test()->SetServiceProperty( - kCellular1ServicePath, shill::kAutoConnectProperty, base::Value(true)); - service_test()->SetServiceProperty(kCellular1ServicePath, - shill::kIccidProperty, - base::Value("test_iccid")); - service_test()->SetServiceProperty( - kCellular1ServicePath, shill::kNetworkTechnologyProperty, - base::Value(shill::kNetworkTechnologyGsm)); - service_test()->SetServiceProperty( - kCellular1ServicePath, shill::kActivationStateProperty, - base::Value(shill::kActivationStateNotActivated)); - service_test()->SetServiceProperty(kCellular1ServicePath, - shill::kRoamingStateProperty, - base::Value(shill::kRoamingStateHome)); + SetServiceProperty(kCellular1ServicePath, + shill::kCellularAllowRoamingProperty, + base::Value(false)); + SetServiceProperty(kCellular1ServicePath, shill::kAutoConnectProperty, + base::Value(true)); + SetServiceProperty(kCellular1ServicePath, shill::kIccidProperty, + base::Value("test_iccid")); + SetServiceProperty(kCellular1ServicePath, shill::kNetworkTechnologyProperty, + base::Value(shill::kNetworkTechnologyGsm)); + SetServiceProperty(kCellular1ServicePath, shill::kActivationStateProperty, + base::Value(shill::kActivationStateNotActivated)); + SetServiceProperty(kCellular1ServicePath, shill::kRoamingStateProperty, + base::Value(shill::kRoamingStateHome)); - profile_test()->AddService(kUser1ProfilePath, kCellular1ServicePath); - content::RunAllPendingInMessageLoop(); + AddServiceToProfile(kUser1ProfilePath, kCellular1ServicePath); + } + + virtual std::string GetSanitizedActiveUsername() = 0; + + virtual void AddDevice(const std::string& device_path, + const std::string& type, + const std::string& name) = 0; + virtual void SetDeviceProperty(const std::string& device_path, + const std::string& name, + const base::Value& value) = 0; + virtual void SetSimLocked(const std::string& device_path, bool enabled) = 0; + virtual void ClearDevices() = 0; + virtual void AddService(const std::string& service_path, + const std::string& name, + const std::string& type, + const std::string& state) = 0; + virtual void ClearServices() = 0; + virtual void SetServiceProperty(const std::string& service_path, + const std::string& property, + const base::Value& value) = 0; + virtual void AddProfile(const std::string& profile_path, + const std::string& userhash) = 0; + + virtual void AddServiceToProfile(const std::string& profile_path, + const std::string& service_path) = 0; + virtual std::string GetSharedProfilePath() = 0; + virtual void AddIPConfig(const std::string& ip_config_path, + const base::Value& properties) = 0; +}; + +#if BUILDFLAG(IS_CHROMEOS_ASH) +class UIDelegateStub : public NetworkingPrivateDelegate::UIDelegate { + public: + static int s_show_account_details_called_; + + private: + // UIDelegate + void ShowAccountDetails(const std::string& guid) const override { + ++s_show_account_details_called_; + } +}; + +// static +int UIDelegateStub::s_show_account_details_called_ = 0; + +class NetworkingPrivateChromeOSApiTestAsh + : public NetworkingPrivateChromeOSApiTestBase { + public: + NetworkingPrivateChromeOSApiTestAsh() = default; + + NetworkingPrivateChromeOSApiTestAsh( + const NetworkingPrivateChromeOSApiTestAsh&) = delete; + NetworkingPrivateChromeOSApiTestAsh& operator=( + const NetworkingPrivateChromeOSApiTestAsh&) = delete; + + static std::unique_ptr<KeyedService> CreateNetworkingPrivateDelegate( + content::BrowserContext* context) { + std::unique_ptr<NetworkingPrivateDelegate> result( + new NetworkingPrivateChromeOS(context)); + std::unique_ptr<NetworkingPrivateDelegate::UIDelegate> ui_delegate( + new UIDelegateStub); + result->set_ui_delegate(std::move(ui_delegate)); + return result; } void SetupTether() { @@ -247,159 +349,6 @@ false /* has_connected_to_host */); } - void AddService(const std::string& service_path, - const std::string& name, - const std::string& type, - const std::string& state) { - service_test()->AddService(service_path, service_path + "_guid", name, type, - state, true /* add_to_visible */); - } - - void SetDeviceProperty(const std::string& device_path, - const std::string& name, - const base::Value& value) { - device_test()->SetDeviceProperty(device_path, name, value, - /*notify_changed=*/true); - } - - static std::unique_ptr<KeyedService> CreateNetworkingPrivateDelegate( - content::BrowserContext* context) { - std::unique_ptr<NetworkingPrivateDelegate> result( - new NetworkingPrivateChromeOS(context)); - std::unique_ptr<NetworkingPrivateDelegate::UIDelegate> ui_delegate( - new UIDelegateStub); - result->set_ui_delegate(std::move(ui_delegate)); - return result; - } - - void SetUpOnMainThread() override { - extensions::ExtensionApiTest::SetUpOnMainThread(); - content::RunAllPendingInMessageLoop(); - - NetworkingPrivateDelegateFactory::GetInstance()->SetTestingFactory( - profile(), base::BindRepeating(&CreateNetworkingPrivateDelegate)); - - InitializeSanitizedUsername(); - - network_handler_test_helper_ = - std::make_unique<chromeos::NetworkHandlerTestHelper>(); - device_test()->ClearDevices(); - service_test()->ClearServices(); - - // Sends a notification about the added profile. - profile_test()->AddProfile(kUser1ProfilePath, userhash_); - - // Add IPConfigs - base::DictionaryValue ipconfig; - ipconfig.SetKey(shill::kAddressProperty, base::Value("0.0.0.0")); - ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.1")); - ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(0)); - ipconfig.SetKey(shill::kMethodProperty, base::Value(shill::kTypeIPv4)); - network_handler_test_helper_->ip_config_test()->AddIPConfig(kIPConfigPath, - ipconfig); - - // Add Devices - device_test()->AddDevice(kEthernetDevicePath, shill::kTypeEthernet, - "stub_ethernet_device1"); - - device_test()->AddDevice(kWifiDevicePath, shill::kTypeWifi, - "stub_wifi_device1"); - base::ListValue wifi_ip_configs; - wifi_ip_configs.Append(kIPConfigPath); - SetDeviceProperty(kWifiDevicePath, shill::kIPConfigsProperty, - wifi_ip_configs); - SetDeviceProperty(kWifiDevicePath, shill::kAddressProperty, - base::Value("001122aabbcc")); - - // Add Services - AddService("stub_ethernet", "eth0", shill::kTypeEthernet, - shill::kStateOnline); - service_test()->SetServiceProperty( - "stub_ethernet", shill::kProfileProperty, - base::Value(ShillProfileClient::GetSharedProfilePath())); - profile_test()->AddService(ShillProfileClient::GetSharedProfilePath(), - "stub_ethernet"); - - AddService(kWifi1ServicePath, "wifi1", shill::kTypeWifi, - shill::kStateOnline); - service_test()->SetServiceProperty(kWifi1ServicePath, - shill::kSecurityClassProperty, - base::Value(shill::kSecurityWep)); - service_test()->SetServiceProperty(kWifi1ServicePath, shill::kWifiBSsid, - base::Value("00:01:02:03:04:05")); - service_test()->SetServiceProperty( - kWifi1ServicePath, shill::kSignalStrengthProperty, base::Value(40)); - service_test()->SetServiceProperty(kWifi1ServicePath, - shill::kProfileProperty, - base::Value(kUser1ProfilePath)); - service_test()->SetServiceProperty( - kWifi1ServicePath, shill::kConnectableProperty, base::Value(true)); - service_test()->SetServiceProperty(kWifi1ServicePath, - shill::kDeviceProperty, - base::Value(kWifiDevicePath)); - base::DictionaryValue static_ipconfig; - static_ipconfig.SetKey(shill::kAddressProperty, base::Value("1.2.3.4")); - static_ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.0")); - static_ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(1)); - service_test()->SetServiceProperty( - kWifi1ServicePath, shill::kStaticIPConfigProperty, static_ipconfig); - base::ListValue frequencies1; - frequencies1.Append(2400); - service_test()->SetServiceProperty( - kWifi1ServicePath, shill::kWifiFrequencyListProperty, frequencies1); - service_test()->SetServiceProperty(kWifi1ServicePath, shill::kWifiFrequency, - base::Value(2400)); - profile_test()->AddService(kUser1ProfilePath, kWifi1ServicePath); - - AddService(kWifi2ServicePath, "wifi2_PSK", shill::kTypeWifi, - shill::kStateIdle); - service_test()->SetServiceProperty(kWifi2ServicePath, - shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); - service_test()->SetServiceProperty( - kWifi2ServicePath, shill::kSignalStrengthProperty, base::Value(80)); - service_test()->SetServiceProperty( - kWifi2ServicePath, shill::kConnectableProperty, base::Value(true)); - - base::ListValue frequencies2; - frequencies2.Append(2400); - frequencies2.Append(5000); - service_test()->SetServiceProperty( - kWifi2ServicePath, shill::kWifiFrequencyListProperty, frequencies2); - service_test()->SetServiceProperty(kWifi2ServicePath, shill::kWifiFrequency, - base::Value(5000)); - service_test()->SetServiceProperty(kWifi2ServicePath, - shill::kProfileProperty, - base::Value(kUser1ProfilePath)); - profile_test()->AddService(kUser1ProfilePath, kWifi2ServicePath); - - AddService("stub_vpn1", "vpn1", shill::kTypeVPN, shill::kStateOnline); - service_test()->SetServiceProperty("stub_vpn1", - shill::kProviderTypeProperty, - base::Value(shill::kProviderOpenVpn)); - profile_test()->AddService(kUser1ProfilePath, "stub_vpn1"); - - AddService("stub_vpn2", "vpn2", shill::kTypeVPN, shill::kStateOffline); - service_test()->SetServiceProperty( - "stub_vpn2", shill::kProviderTypeProperty, - base::Value(shill::kProviderThirdPartyVpn)); - service_test()->SetServiceProperty( - "stub_vpn2", shill::kProviderHostProperty, - base::Value("third_party_provider_extension_id")); - profile_test()->AddService(kUser1ProfilePath, "stub_vpn2"); - - PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry()); - PrefProxyConfigTrackerImpl::RegisterPrefs(local_state_.registry()); - network_handler_test_helper_->RegisterPrefs(user_prefs_.registry(), - local_state_.registry()); - - network_handler_test_helper_->InitializePrefs(&user_prefs_, &local_state_); - - content::RunAllPendingInMessageLoop(); - } - - void TearDownOnMainThread() { network_handler_test_helper_.reset(); } - ShillServiceClient::TestInterface* service_test() { return network_handler_test_helper_->service_test(); } @@ -413,69 +362,374 @@ return network_handler_test_helper_->manager_test(); } + // extensions::ExtensionApiTest overrides: + + void SetUpInProcessBrowserTestFixture() override { + provider_.SetDefaultReturns( + /*is_initialization_complete_return=*/true, + /*is_first_policy_load_complete_return=*/true); + policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); + + extensions::ExtensionApiTest::SetUpInProcessBrowserTestFixture(); + } + + void SetUpOnMainThread() override { + extensions::ExtensionApiTest::SetUpOnMainThread(); + content::RunAllPendingInMessageLoop(); + + NetworkingPrivateDelegateFactory::GetInstance()->SetTestingFactory( + profile(), base::BindRepeating(&CreateNetworkingPrivateDelegate)); + + network_handler_test_helper_ = + std::make_unique<chromeos::NetworkHandlerTestHelper>(); + + ConfigFakeNetwork(); + + PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry()); + PrefProxyConfigTrackerImpl::RegisterPrefs(local_state_.registry()); + network_handler_test_helper_->RegisterPrefs(user_prefs_.registry(), + local_state_.registry()); + + network_handler_test_helper_->InitializePrefs(&user_prefs_, &local_state_); + + base::RunLoop().RunUntilIdle(); + } + + void TearDownOnMainThread() override { network_handler_test_helper_.reset(); } + + // NetworkingPrivateChromeOSApiTestBase overrides: + + void SetUpCommandLine(base::CommandLine* command_line) override { + NetworkingPrivateChromeOSApiTestBase::SetUpCommandLine(command_line); + + // TODO(pneubeck): Remove the following hack, once the NetworkingPrivateAPI + // uses the ProfileHelper to obtain the userhash crbug/238623. + cryptohome::AccountIdentifier login_user; + login_user.set_account_id(user_manager::CanonicalizeUserID( + command_line->GetSwitchValueNative(ash::switches::kLoginUser))); + const std::string sanitized_user = + UserDataAuthClient::GetStubSanitizedUsername(login_user); + command_line->AppendSwitchASCII(ash::switches::kLoginProfile, + sanitized_user); + } + + std::string GetSanitizedActiveUsername() override { + user_manager::UserManager* user_manager = user_manager::UserManager::Get(); + user_manager::User* user = user_manager->GetActiveUser(); + CHECK(user); + std::string userhash; + ::user_data_auth::GetSanitizedUsernameRequest request; + request.set_username( + cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId()) + .account_id()); + ash::CryptohomeMiscClient::Get()->GetSanitizedUsername( + request, + base::BindOnce( + [](std::string* out, + absl::optional<::user_data_auth::GetSanitizedUsernameReply> + result) { + CHECK(result.has_value()); + *out = result->sanitized_username(); + }, + &userhash)); + base::RunLoop().RunUntilIdle(); + CHECK(!userhash.empty()); + return userhash; + } + + void SetupCellular() override { + UIDelegateStub::s_show_account_details_called_ = 0; + NetworkingPrivateChromeOSApiTestBase::SetupCellular(); + base::RunLoop().RunUntilIdle(); + } + + void AddDevice(const std::string& device_path, + const std::string& type, + const std::string& name) override { + device_test()->AddDevice(device_path, type, name); + } + + void ClearDevices() override { device_test()->ClearDevices(); } + + void SetDeviceProperty(const std::string& device_path, + const std::string& name, + const base::Value& value) override { + device_test()->SetDeviceProperty(device_path, name, value, + /*notify_changed=*/true); + } + + void SetSimLocked(const std::string& device_path, bool enabled) override { + device_test()->SetSimLocked(device_path, enabled); + } + + void AddService(const std::string& service_path, + const std::string& name, + const std::string& type, + const std::string& state) override { + service_test()->AddService(service_path, service_path + "_guid", name, type, + state, true /* add_to_visible */); + } + + void ClearServices() override { service_test()->ClearServices(); } + + void SetServiceProperty(const std::string& service_path, + const std::string& property, + const base::Value& value) override { + service_test()->SetServiceProperty(service_path, property, value); + } + + void AddIPConfig(const std::string& ip_config_path, + const base::Value& properties) override { + network_handler_test_helper_->ip_config_test()->AddIPConfig(ip_config_path, + properties); + } + + void AddProfile(const std::string& profile_path, + const std::string& userhash) override { + profile_test()->AddProfile(profile_path, userhash); + } + + void AddServiceToProfile(const std::string& profile_path, + const std::string& service_path) override { + profile_test()->AddService(profile_path, service_path); + } + + std::string GetSharedProfilePath() override { + return ShillProfileClient::GetSharedProfilePath(); + } + protected: std::unique_ptr<chromeos::NetworkHandlerTestHelper> network_handler_test_helper_; testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_; sync_preferences::TestingPrefServiceSyncable user_prefs_; TestingPrefServiceSimple local_state_; - std::string userhash_; }; +#else +class NetworkingPrivateChromeOSApiTestLacros + : public NetworkingPrivateChromeOSApiTestBase { + public: + NetworkingPrivateChromeOSApiTestLacros() {} + + NetworkingPrivateChromeOSApiTestLacros( + const NetworkingPrivateChromeOSApiTestLacros&) = delete; + NetworkingPrivateChromeOSApiTestLacros& operator=( + const NetworkingPrivateChromeOSApiTestLacros&) = delete; + + bool SetUpAsh() { + auto* service = chromeos::LacrosService::Get(); + if (!service->IsAvailable<crosapi::mojom::TestController>() || + service->GetInterfaceVersion(crosapi::mojom::TestController::Uuid_) < + static_cast<int>(crosapi::mojom::TestController::MethodMinVersions:: + kBindShillClientTestInterfaceMinVersion)) { + LOG(ERROR) << "Unsupported ash version."; + return false; + } + crosapi::mojom::TestControllerAsyncWaiter test_controller_waiter{ + service->GetRemote<crosapi::mojom::TestController>().get()}; + + test_controller_waiter.BindShillClientTestInterface( + shill_test_.BindNewPipeAndPassReceiver()); + + ConfigFakeNetwork(); + + return true; + } + + // NetworkingPrivateChromeOSApiTestBase overrides + + std::string GetSanitizedActiveUsername() override { + auto* service = chromeos::LacrosService::Get(); + if (!service->IsAvailable<crosapi::mojom::TestController>() || + service->GetInterfaceVersion(crosapi::mojom::TestController::Uuid_) < + static_cast<int>(crosapi::mojom::TestController::MethodMinVersions:: + kGetSanitizedActiveUsernameMinVersion)) { + LOG(ERROR) << "Unsupported ash version."; + return ""; + } + + crosapi::mojom::TestControllerAsyncWaiter test_controller_waiter{ + service->GetRemote<crosapi::mojom::TestController>().get()}; + + std::string userhash; + test_controller_waiter.GetSanitizedActiveUsername(&userhash); + return userhash; + } + + void AddDevice(const std::string& device_path, + const std::string& type, + const std::string& name) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .AddDevice(device_path, type, name); + } + + void SetDeviceProperty(const std::string& device_path, + const std::string& name, + const base::Value& value) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .SetDeviceProperty(device_path, name, value.Clone(), + /*notify_changed=*/true); + } + + void SetSimLocked(const std::string& device_path, bool enabled) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .SetSimLocked(device_path, enabled); + } + + void ClearDevices() override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()).ClearDevices(); + } + + void AddService(const std::string& service_path, + const std::string& name, + const std::string& type, + const std::string& state) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .AddService(service_path, service_path + "_guid", name, type, state, + true /* add_to_visible */); + } + + void ClearServices() override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()).ClearServices(); + } + + void SetServiceProperty(const std::string& service_path, + const std::string& property, + const base::Value& value) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .SetServiceProperty(service_path, property, value.Clone()); + } + + void AddIPConfig(const std::string& ip_config_path, + const base::Value& properties) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .AddIPConfig(ip_config_path, properties.Clone()); + } + + void AddProfile(const std::string& profile_path, + const std::string& userhash) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .AddProfile(profile_path, userhash); + } + + void AddServiceToProfile(const std::string& profile_path, + const std::string& service_path) override { + ShillClientTestInterfaceAsyncWaiter(shill_test_.get()) + .AddServiceToProfile(profile_path, service_path); + } + + std::string GetSharedProfilePath() override { + // TODO(crbug.com/): get this information from Ash + const char kSharedProfilePath[] = "/profile/default"; + return kSharedProfilePath; + } + + protected: + mojo::Remote<crosapi::mojom::ShillClientTestInterface> shill_test_; +}; +#endif + +#if BUILDFLAG(IS_CHROMEOS_LACROS) +using NetworkingPrivateChromeOSApiTest = NetworkingPrivateChromeOSApiTestLacros; +#else +using NetworkingPrivateChromeOSApiTest = NetworkingPrivateChromeOSApiTestAsh; +#endif // Place each subtest into a separate browser test so that the stub networking // library state is reset for each subtest run. This way they won't affect each // other. IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartConnect) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("startConnect")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartDisconnect) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("startDisconnect")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartActivate) { SetupCellular(); EXPECT_TRUE(RunNetworkingSubtest("startActivate")) << message_; EXPECT_EQ(1, UIDelegateStub::s_show_account_details_called_); } +#endif IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartConnectNonexistent) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("startConnectNonexistent")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartDisconnectNonexistent) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("startDisconnectNonexistent")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartGetPropertiesNonexistent) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("startGetPropertiesNonexistent")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetNetworks) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif // Hide stub_wifi2. - service_test()->SetServiceProperty(kWifi2ServicePath, shill::kVisibleProperty, - base::Value(false)); + SetServiceProperty(kWifi2ServicePath, shill::kVisibleProperty, + base::Value(false)); // Add a couple of additional networks that are not configured (saved). AddService("stub_wifi3", "wifi3", shill::kTypeWifi, shill::kStateIdle); AddService("stub_wifi4", "wifi4", shill::kTypeWifi, shill::kStateIdle); content::RunAllPendingInMessageLoop(); + EXPECT_TRUE(RunNetworkingSubtest("getNetworks")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetVisibleNetworks) { EXPECT_TRUE(RunNetworkingSubtest("getVisibleNetworks")) << message_; } +#endif IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetVisibleNetworksWifi) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("getVisibleNetworksWifi")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, EnabledNetworkTypes) { EXPECT_TRUE(RunNetworkingSubtest("enabledNetworkTypesDisable")) << message_; EXPECT_TRUE(RunNetworkingSubtest("enabledNetworkTypesEnable")) << message_; @@ -488,13 +742,24 @@ manager_test()->SetTechnologyInitializing("cellular", true); EXPECT_TRUE(RunNetworkingSubtest("getDeviceStates")) << message_; } +#endif IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, RequestNetworkScan) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("requestNetworkScan")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, RequestNetworkScanCellular) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif SetupCellular(); EXPECT_TRUE(RunNetworkingSubtest("requestNetworkScanCellular")) << message_; } @@ -502,23 +767,41 @@ // Properties are filtered and translated through // ShillToONCTranslator::TranslateWiFiWithState IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetProperties) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("getProperties")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetCellularProperties) { SetupCellular(); EXPECT_TRUE(RunNetworkingSubtest("getPropertiesCellular")) << message_; } +#endif IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetState) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("getState")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetStateNonExistent) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("getStateNonExistent")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, SetCellularProperties) { SetupCellular(); @@ -567,11 +850,18 @@ EXPECT_TRUE(RunNetworkingSubtest("createNetworkForPolicyControlledNetwork")); } +#endif IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, ForgetNetwork) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("forgetNetwork")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, ForgetPolicyControlledNetwork) { constexpr char kUserPolicyBlob[] = @@ -657,36 +947,63 @@ kWifi1ServicePath, "TestErrorState"); EXPECT_TRUE(RunNetworkingSubtest("getErrorState")) << message_; } +#endif IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, OnNetworksChangedEventConnect) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("onNetworksChangedEventConnect")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, OnNetworksChangedEventDisconnect) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("onNetworksChangedEventDisconnect")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, OnNetworkListChangedEvent) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("onNetworkListChangedEvent")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, OnDeviceStateListChangedEvent) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif EXPECT_TRUE(RunNetworkingSubtest("onDeviceStateListChangedEvent")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, OnDeviceScanningChangedEvent) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif SetupCellular(); EXPECT_TRUE(RunNetworkingSubtest("onDeviceScanningChangedEvent")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, OnCertificateListsChangedEvent) { ExtensionTestMessageListener listener("eventListenerReady"); @@ -703,10 +1020,10 @@ GetCaptivePortalStatus) { // Ethernet defaults to online. Set wifi1 to idle -> 'Offline', and wifi2 to // redirect-found -> 'Portal'. - service_test()->SetServiceProperty(kWifi1ServicePath, shill::kStateProperty, - base::Value(shill::kStateIdle)); - service_test()->SetServiceProperty(kWifi2ServicePath, shill::kStateProperty, - base::Value(shill::kStateRedirectFound)); + SetServiceProperty(kWifi1ServicePath, shill::kStateProperty, + base::Value(shill::kStateIdle)); + SetServiceProperty(kWifi2ServicePath, shill::kStateProperty, + base::Value(shill::kStateRedirectFound)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(RunNetworkingSubtest("getCaptivePortalStatus")) << message_; @@ -722,28 +1039,43 @@ ExtensionTestMessageListener listener("notifyPortalDetectorObservers"); listener.SetOnSatisfied( base::BindLambdaForTesting([&](const std::string& message) { - service_test()->SetServiceProperty( - kWifi1ServicePath, shill::kStateProperty, - base::Value(shill::kStateRedirectFound)); + SetServiceProperty(kWifi1ServicePath, shill::kStateProperty, + base::Value(shill::kStateRedirectFound)); })); EXPECT_TRUE(RunNetworkingSubtest("captivePortalNotification")) << message_; } +#endif IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, UnlockCellularSim) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif SetupCellular(); // Lock the SIM - device_test()->SetSimLocked(kCellularDevicePath, true); + SetSimLocked(kCellularDevicePath, true); EXPECT_TRUE(RunNetworkingSubtest("unlockCellularSim")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, SetCellularSimState) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif SetupCellular(); EXPECT_TRUE(RunNetworkingSubtest("setCellularSimState")) << message_; } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, SelectCellularMobileNetwork) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif SetupCellular(); // Create fake list of found networks. std::unique_ptr<base::ListValue> found_networks = @@ -765,12 +1097,18 @@ } IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, CellularSimPuk) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (!SetUpAsh()) { + GTEST_SKIP() << "Unsupported ash version."; + } +#endif SetupCellular(); // Lock the SIM - device_test()->SetSimLocked(kCellularDevicePath, true); + SetSimLocked(kCellularDevicePath, true); EXPECT_TRUE(RunNetworkingSubtest("cellularSimPuk")) << message_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetGlobalPolicy) { base::DictionaryValue global_config; global_config.SetKey( @@ -831,5 +1169,6 @@ {.launch_as_platform_app = true})) << message_; } +#endif } // namespace
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 f470fa7..77762d4 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
@@ -71,6 +71,7 @@ using password_manager::LeakCheckCredential; using password_manager::PasswordChangeSuccessTracker; using password_manager::PasswordForm; +using password_manager::PasswordScriptsFetcher; using password_manager::metrics_util::PasswordCheckScriptsCacheState; using ui::TimeFormat; @@ -397,6 +398,15 @@ } } +void PasswordCheckDelegate::RefreshScriptsIfNecessary( + RefreshScriptsIfNecessaryCallback callback) { + if (PasswordScriptsFetcher* fetcher = GetPasswordScriptsFetcher()) { + fetcher->RefreshScriptsIfNecessary(std::move(callback)); + return; + } + std::move(callback).Run(); +} + void PasswordCheckDelegate::StartPasswordCheck( StartPasswordCheckCallback callback) { // If the delegate isn't initialized yet, enqueue the callback and return @@ -719,8 +729,8 @@ GetForBrowserContext(profile_); } -password_manager::PasswordScriptsFetcher* -PasswordCheckDelegate::GetPasswordScriptsFetcher() const { +PasswordScriptsFetcher* PasswordCheckDelegate::GetPasswordScriptsFetcher() + const { return PasswordScriptsFetcherFactory::GetForBrowserContext(profile_); }
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 b0c44f517..649fad5 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.h +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
@@ -46,6 +46,8 @@ public: using StartPasswordCheckCallback = PasswordsPrivateDelegate::StartPasswordCheckCallback; + using RefreshScriptsIfNecessaryCallback = + PasswordsPrivateDelegate::RefreshScriptsIfNecessaryCallback; PasswordCheckDelegate(Profile* profile, password_manager::SavedPasswordsPresenter* presenter); @@ -96,6 +98,10 @@ const api::passwords_private::InsecureCredential& credential, bool is_manual_flow); + // Refreshes the cache for automatic password change scripts if that is stale + // and runs `callback` once that is complete. + void RefreshScriptsIfNecessary(RefreshScriptsIfNecessaryCallback callback); + // Checks that all preconditions for running a password check are fulfilled // and, once that is the case, launches the password check. Invokes `callback` // once a check is running or the request was stopped via
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc index 81c749c..af9af55 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -119,6 +119,8 @@ using MockStartPasswordCheckCallback = base::MockCallback<PasswordCheckDelegate::StartPasswordCheckCallback>; +using MockRefreshScriptsIfNecessaryCallback = base::MockCallback< + PasswordsPrivateDelegate::RefreshScriptsIfNecessaryCallback>; PasswordsPrivateEventRouter* CreateAndUsePasswordsPrivateEventRouter( Profile* profile) { @@ -974,6 +976,18 @@ /*is_manual_flow=*/false); } +TEST_F(PasswordCheckDelegateTest, RefreshScriptsIfNecessary) { + base::OnceClosure refresh_callback = base::DoNothing(); + EXPECT_CALL(password_scripts_fetcher(), RefreshScriptsIfNecessary) + .WillOnce(MoveArg<0>(&refresh_callback)); + + MockRefreshScriptsIfNecessaryCallback callback; + delegate().RefreshScriptsIfNecessary(callback.Get()); + + EXPECT_CALL(callback, Run); + std::move(refresh_callback).Run(); +} + TEST_F(PasswordCheckDelegateTest, RecordChangePasswordFlowStartedForAppWithWebRealm) { // Create an insecure credential.
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc index 9cf94fe..cf921c25 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -22,6 +22,7 @@ #include "components/sync/driver/sync_service.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/extension_function_registry.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace extensions { @@ -52,15 +53,17 @@ api::passwords_private::ChangeSavedPassword::Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(parameters); - if (!GetDelegate(browser_context()) - ->ChangeSavedPassword(parameters->ids, parameters->params)) { - return RespondNow(Error( - "Could not change the password. Either the password is empty, the user " - "is not authenticated, vector of ids is empty or no matching password " - "could be found at least for one of the ids.")); + auto new_ids = GetDelegate(browser_context()) + ->ChangeSavedPassword(parameters->ids, parameters->params); + if (new_ids.has_value()) { + return RespondNow(ArgumentList( + api::passwords_private::ChangeSavedPassword::Results::Create( + new_ids.value()))); } - - return RespondNow(NoArguments()); + return RespondNow(Error( + "Could not change the password. Either the password is empty, the user " + "is not authenticated, vector of ids is empty or no matching password " + "could be found at least for one of the ids.")); } // PasswordsPrivateRemoveSavedPasswordFunction @@ -405,6 +408,24 @@ return RespondNow(NoArguments()); } +// PasswordsPrivateRefreshScriptsIfNecessaryFunction: +PasswordsPrivateRefreshScriptsIfNecessaryFunction:: + ~PasswordsPrivateRefreshScriptsIfNecessaryFunction() = default; + +ResponseAction PasswordsPrivateRefreshScriptsIfNecessaryFunction::Run() { + GetDelegate(browser_context()) + ->RefreshScriptsIfNecessary(base::BindOnce( + &PasswordsPrivateRefreshScriptsIfNecessaryFunction::OnRefreshed, + base::RetainedRef(this))); + + // OnRefreshed() might respond before we reach this point. + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void PasswordsPrivateRefreshScriptsIfNecessaryFunction::OnRefreshed() { + Respond(NoArguments()); +} + // PasswordsPrivateStartPasswordCheckFunction: PasswordsPrivateStartPasswordCheckFunction:: ~PasswordsPrivateStartPasswordCheckFunction() = default;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h index 4217839..319ca3e 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -353,6 +353,22 @@ ResponseAction Run() override; }; +class PasswordsPrivateRefreshScriptsIfNecessaryFunction + : public ExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("passwordsPrivate.refreshScriptsIfNecessary", + PASSWORDSPRIVATE_REFRESHSCRIPTSIFNECESSARY) + + protected: + ~PasswordsPrivateRefreshScriptsIfNecessaryFunction() override; + + // ExtensionFunction overrides. + ResponseAction Run() override; + + private: + void OnRefreshed(); +}; + class PasswordsPrivateStartPasswordCheckFunction : public ExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("passwordsPrivate.startPasswordCheck",
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc index d059774..a87932a 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -367,6 +367,10 @@ EXPECT_EQ(last_change_flow_url(), ""); } +IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, RefreshScriptsIfNecessary) { + EXPECT_TRUE(RunPasswordsSubtest("refreshScriptsIfNecessary")) << message_; +} + IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, StartPasswordCheck) { set_start_password_check_state( password_manager::BulkLeakCheckService::State::kRunning);
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h index 4ec0917f..be8983a 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
@@ -34,6 +34,8 @@ using PlaintextPasswordCallback = base::OnceCallback<void(absl::optional<std::u16string>)>; + using RefreshScriptsIfNecessaryCallback = base::OnceClosure; + using StartPasswordCheckCallback = base::OnceCallback<void(password_manager::BulkLeakCheckService::State)>; @@ -86,7 +88,10 @@ // Changes the username and password corresponding to |ids|. // |ids|: The ids for the password entries being updated. // |params|: The struct which holds the new username, password and note. - virtual bool ChangeSavedPassword( + // Returns the ids if the change was successful (can be the same ids if the + // username and the password didn't change), nullopt otherwise. + virtual absl::optional<api::passwords_private::CredentialIds> + ChangeSavedPassword( const std::vector<int>& ids, const api::passwords_private::ChangeSavedPasswordParams& params) = 0; @@ -198,6 +203,11 @@ const api::passwords_private::InsecureCredential& credential, bool is_manual_flow) = 0; + // Refreshes the cache for automatic password change scripts if that is stale + // and runs `callback` once that is complete. + virtual void RefreshScriptsIfNecessary( + RefreshScriptsIfNecessaryCallback callback) = 0; + // Requests to start a check for insecure passwords. Invokes |callback| // once a check is running or the request was stopped via StopPasswordCheck(). virtual void StartPasswordCheck(StartPasswordCheckCallback callback) = 0;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index fd168dc3..27ebe3d 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -41,6 +41,7 @@ #include "components/url_formatter/elide_url.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/base/l10n/l10n_util.h" #include "url/gurl.h" @@ -235,7 +236,8 @@ return success; } -bool PasswordsPrivateDelegateImpl::ChangeSavedPassword( +absl::optional<api::passwords_private::CredentialIds> +PasswordsPrivateDelegateImpl::ChangeSavedPassword( const std::vector<int>& ids, const api::passwords_private::ChangeSavedPasswordParams& params) { DCHECK(!ids.empty()); @@ -245,7 +247,7 @@ // |saved_passwords_presenter_| will update both of them anyway. const CredentialUIEntry* entry = credential_id_generator_.TryGetKey(ids[0]); if (!entry) - return false; + return absl::nullopt; CredentialUIEntry to_edit = *entry; to_edit.username = base::UTF8ToUTF16(params.username); @@ -254,7 +256,32 @@ to_edit.note = password_manager::PasswordNote( base::UTF8ToUTF16(*params.note), base::Time::Now()); } - return saved_passwords_presenter_.EditSavedCredentials(to_edit); + // Collect the credentials that will be edited before executing the edit + // process. + auto forms_to_edit = + saved_passwords_presenter_.GetCorrespondingPasswordForms(entry->key()); + bool success = saved_passwords_presenter_.EditSavedCredentials(to_edit); + if (!success) { + return absl::nullopt; + } + + api::passwords_private::CredentialIds new_ids; + for (auto& form : forms_to_edit) { + // Calculate the new IDs using the new username and password. + form.username_value = to_edit.username; + form.password_value = to_edit.password; + + auto new_id = std::make_unique<int>( + credential_id_generator_.GenerateId(CredentialUIEntry(form))); + + if (form.IsUsingProfileStore()) { + new_ids.device_id = std::move(new_id); + } + if (form.IsUsingAccountStore()) { + new_ids.account_id = std::move(new_id); + } + } + return new_ids; } void PasswordsPrivateDelegateImpl::RemoveSavedPasswords( @@ -571,6 +598,11 @@ is_manual_flow); } +void PasswordsPrivateDelegateImpl::RefreshScriptsIfNecessary( + RefreshScriptsIfNecessaryCallback callback) { + password_check_delegate_.RefreshScriptsIfNecessary(std::move(callback)); +} + void PasswordsPrivateDelegateImpl::StartPasswordCheck( StartPasswordCheckCallback callback) { password_check_delegate_.StartPasswordCheck(std::move(callback));
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h index 0b1e3be..41c082cc8 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -63,7 +63,7 @@ const std::u16string& note, bool use_account_store, content::WebContents* web_contents) override; - bool ChangeSavedPassword( + absl::optional<api::passwords_private::CredentialIds> ChangeSavedPassword( const std::vector<int>& ids, const api::passwords_private::ChangeSavedPasswordParams& params) override; void RemoveSavedPasswords(const std::vector<int>& ids) override; @@ -107,6 +107,8 @@ void RecordChangePasswordFlowStarted( const api::passwords_private::InsecureCredential& credential, bool is_manual_flow) override; + void RefreshScriptsIfNecessary( + RefreshScriptsIfNecessaryCallback callback) override; void StartPasswordCheck(StartPasswordCheckCallback callback) override; void StopPasswordCheck() override; api::passwords_private::PasswordCheckStatus GetPasswordCheckStatus() override;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc index 92e561b..24e7fcf 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -54,7 +54,9 @@ using password_manager::TestPasswordStore; using ::testing::_; using ::testing::Eq; +using ::testing::IsNull; using ::testing::Ne; +using ::testing::Pointee; using ::testing::Return; using ::testing::SizeIs; using ::testing::StrictMock; @@ -464,7 +466,15 @@ api::passwords_private::ChangeSavedPasswordParams params; params.password = "new_pass"; params.username = "new_user"; - EXPECT_TRUE(delegate.ChangeSavedPassword({sample_form_id}, params)); + + sample_form.username_value = u"new_user"; + sample_form.password_value = u"new_pass"; + int new_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(sample_form)); + + auto result = delegate.ChangeSavedPassword({sample_form_id}, params); + EXPECT_THAT(result->account_id, IsNull()); + EXPECT_THAT(result->device_id, Pointee(new_form_id)); // Spin the loop to allow PasswordStore tasks posted when changing the // password to be completed. @@ -511,7 +521,15 @@ params.password = "new_pass"; params.username = "new_user"; params.note = std::make_unique<std::string>("new note"); - EXPECT_TRUE(delegate.ChangeSavedPassword({sample_form_id}, params)); + + sample_form.password_value = u"new_pass"; + sample_form.username_value = u"new_user"; + int new_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(sample_form)); + + auto result = delegate.ChangeSavedPassword({sample_form_id}, params); + EXPECT_THAT(result->account_id, IsNull()); + EXPECT_THAT(result->device_id, Pointee(new_form_id)); // Spin the loop to allow PasswordStore tasks posted when changing the // password to be completed. @@ -526,6 +544,70 @@ delegate.GetSavedPasswordsList(callback.Get()); } +TEST_F(PasswordsPrivateDelegateImplTest, ChangeSavedPasswordInBothStores) { + password_manager::PasswordForm profile_form = CreateSampleForm(); + password_manager::PasswordForm account_form = profile_form; + account_form.in_store = password_manager::PasswordForm::Store::kAccountStore; + SetUpPasswordStores({profile_form, account_form}); + + PasswordsPrivateDelegateImpl delegate(&profile_); + // Spin the loop to allow PasswordStore tasks posted on the creation of + // |delegate| to be completed. + base::RunLoop().RunUntilIdle(); + + int profile_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(profile_form)); + int account_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(account_form)); + + api::passwords_private::ChangeSavedPasswordParams params; + params.password = "new_pass"; + params.username = "new_user"; + + profile_form.username_value = u"new_user"; + profile_form.password_value = u"new_pass"; + int new_profile_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(profile_form)); + account_form.username_value = u"new_user"; + account_form.password_value = u"new_pass"; + int new_account_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(account_form)); + + auto result = + delegate.ChangeSavedPassword({profile_form_id, account_form_id}, params); + EXPECT_THAT(result->account_id, Pointee(new_account_form_id)); + EXPECT_THAT(result->device_id, Pointee(new_profile_form_id)); +} + +TEST_F(PasswordsPrivateDelegateImplTest, ChangeSavedPasswordInAccountStore) { + password_manager::PasswordForm profile_form = CreateSampleForm(); + profile_form.password_value = u"different_pass"; + password_manager::PasswordForm account_form = CreateSampleForm(); + account_form.in_store = password_manager::PasswordForm::Store::kAccountStore; + SetUpPasswordStores({profile_form, account_form}); + + PasswordsPrivateDelegateImpl delegate(&profile_); + // Spin the loop to allow PasswordStore tasks posted on the creation of + // |delegate| to be completed. + base::RunLoop().RunUntilIdle(); + + int account_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(account_form)); + + api::passwords_private::ChangeSavedPasswordParams params; + params.password = "new_pass"; + params.username = "new_user"; + + account_form.username_value = u"new_user"; + account_form.password_value = u"new_pass"; + int new_account_form_id = delegate.GetIdForCredential( + password_manager::CredentialUIEntry(account_form)); + + auto result = delegate.ChangeSavedPassword({account_form_id}, params); + EXPECT_THAT(result->account_id, Pointee(new_account_form_id)); + EXPECT_THAT(result->device_id, IsNull()); +} + // Checking callback result of RequestPlaintextPassword with reason Copy. // By implementation for Copy, callback will receive empty string. TEST_F(PasswordsPrivateDelegateImplTest, TestCopyPasswordCallbackResult) {
diff --git a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc index d67a5fa..095799bf1 100644 --- a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc +++ b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
@@ -89,15 +89,27 @@ return !url.empty() && !password.empty(); } -bool TestPasswordsPrivateDelegate::ChangeSavedPassword( +absl::optional<api::passwords_private::CredentialIds> +TestPasswordsPrivateDelegate::ChangeSavedPassword( const std::vector<int>& ids, const api::passwords_private::ChangeSavedPasswordParams& params) { + constexpr int kDeviceIdIndex = 0; + constexpr int kAccountIdIndex = 1; + for (int id : ids) { if (static_cast<size_t>(id) >= current_entries_.size()) { - return false; + return absl::nullopt; } } - return !params.password.empty() && !ids.empty(); + + if (params.password.empty() || ids.empty()) + return absl::nullopt; + + api::passwords_private::CredentialIds newIds; + newIds.device_id = std::make_unique<int>(ids[kDeviceIdIndex]); + newIds.account_id = + ids.size() == 2 ? std::make_unique<int>(ids[kAccountIdIndex]) : nullptr; + return newIds; } void TestPasswordsPrivateDelegate::RemoveSavedPasswords( @@ -298,6 +310,11 @@ credential.change_password_url ? *credential.change_password_url : ""; } +void TestPasswordsPrivateDelegate::RefreshScriptsIfNecessary( + RefreshScriptsIfNecessaryCallback callback) { + std::move(callback).Run(); +} + void TestPasswordsPrivateDelegate::StartPasswordCheck( StartPasswordCheckCallback callback) { start_password_check_triggered_ = true;
diff --git a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h index 93bf92d..6428380d 100644 --- a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h +++ b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
@@ -24,14 +24,15 @@ // PasswordsPrivateDelegate implementation. void GetSavedPasswordsList(UiEntriesCallback callback) override; void GetPasswordExceptionsList(ExceptionEntriesCallback callback) override; - // Fake implementation of GetUrlCollection. This returns value if |url| is + // Fake implementation of `GetUrlCollection`. This returns a value if `url` is // not empty. absl::optional<api::passwords_private::UrlCollection> GetUrlCollection( const std::string& url) override; - // Fake implementation. This returns value set by SetIsAccountStoreDefault. + // Fake implementation. This returns the value set by + // `SetIsAccountStoreDefault`. bool IsAccountStoreDefault(content::WebContents* web_contents) override; - // Fake implementation of AddPassword. This returns true if |url| and - // |password| aren't empty. + // Fake implementation of AddPassword. This returns true if `url` and + // `password` aren't empty. bool AddPassword(const std::string& url, const std::u16string& username, const std::u16string& password, @@ -41,7 +42,7 @@ // Fake implementation of ChangeSavedPassword. This succeeds if the current // list of entries has each of the ids, vector of ids isn't empty and if the // new password isn't empty. - bool ChangeSavedPassword( + absl::optional<api::passwords_private::CredentialIds> ChangeSavedPassword( const std::vector<int>& ids, const api::passwords_private::ChangeSavedPasswordParams& params) override; void RemoveSavedPasswords(const std::vector<int>& id) override; @@ -72,28 +73,32 @@ api::passwords_private::PlaintextReason reason, content::WebContents* web_contents, PlaintextInsecurePasswordCallback callback) override; - // Fake implementation of ChangeInsecureCredential. This succeeds if the + // Fake implementation of `ChangeInsecureCredential`. This succeeds if the // delegate knows of a insecure credential with the same id. bool ChangeInsecureCredential( const api::passwords_private::InsecureCredential& credential, base::StringPiece new_password) override; - // Fake implementation of RemoveInsecureCredential. This succeeds if the + // Fake implementation of `RemoveInsecureCredential`. This succeeds if the // delegate knows of a insecure credential with the same id. bool RemoveInsecureCredential( const api::passwords_private::InsecureCredential& credential) override; - // Fake implementation of MuteInsecureCredential. This succeeds if the + // Fake implementation of `MuteInsecureCredential`. This succeeds if the // delegate knows of a insecure credential with the same id. bool MuteInsecureCredential( const api::passwords_private::InsecureCredential& credential) override; - // Fake implementation of UnmuteInsecureCredential. This succeeds if the + // Fake implementation of `UnmuteInsecureCredential`. This succeeds if the // delegate knows of a insecure credential with the same id. bool UnmuteInsecureCredential( const api::passwords_private::InsecureCredential& credential) override; - // Fake implementation of RecordChangePasswordFlowStarted. Sets the url - // returned by |last_change_flow_url()|. + // Fake implementation of `RecordChangePasswordFlowStarted`. Sets the url + // returned by `last_change_flow_url()`. void RecordChangePasswordFlowStarted( const api::passwords_private::InsecureCredential& credential, bool is_manual_flow) override; + // Fake implementation of `RefreshScriptsIfNecessary` that directly calls + // `callback`. + void RefreshScriptsIfNecessary( + RefreshScriptsIfNecessaryCallback callback) override; void StartPasswordCheck(StartPasswordCheckCallback callback) override; void StopPasswordCheck() override; api::passwords_private::PasswordCheckStatus GetPasswordCheckStatus() override;
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc index f8e99cb..444eb575 100644 --- a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc +++ b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc
@@ -92,52 +92,52 @@ } base::Value ToValue(const device::PublicKeyCredentialRpEntity& relying_party) { - base::Value value(base::Value::Type::DICTIONARY); - value.SetStringKey("id", relying_party.id); + base::Value::Dict value; + value.Set("id", relying_party.id); // `PublicKeyCredentialEntity.name` is required in the IDL but optional on the // mojo struct. - value.SetKey("name", base::Value(relying_party.name.value_or(""))); - return value; + value.Set("name", relying_party.name.value_or("")); + return base::Value(std::move(value)); } base::Value ToValue(const device::PublicKeyCredentialUserEntity& user) { - base::Value value(base::Value::Type::DICTIONARY); - value.SetStringKey("id", Base64UrlEncode(user.id)); + base::Value::Dict value; + value.Set("id", Base64UrlEncode(user.id)); // `PublicKeyCredentialEntity.name` is required in the IDL but optional on the // mojo struct. - value.SetKey("name", base::Value(user.name.value_or(""))); + value.Set("name", user.name.value_or("")); if (user.display_name) { - value.SetKey("displayName", base::Value(*user.display_name)); + value.Set("displayName", *user.display_name); } - return value; + return base::Value(std::move(value)); } base::Value ToValue( const device::PublicKeyCredentialParams::CredentialInfo& params) { - base::Value value(base::Value::Type::DICTIONARY); + base::Value::Dict value; switch (params.type) { case device::CredentialType::kPublicKey: - value.SetKey("type", base::Value(device::kPublicKey)); + value.Set("type", device::kPublicKey); } - value.SetIntKey("alg", params.algorithm); - return value; + value.Set("alg", params.algorithm); + return base::Value(std::move(value)); } base::Value ToValue(const device::PublicKeyCredentialDescriptor& descriptor) { - base::Value value(base::Value::Type::DICTIONARY); + base::Value::Dict value; switch (descriptor.credential_type) { case device::CredentialType::kPublicKey: - value.SetKey("type", base::Value(device::kPublicKey)); + value.Set("type", device::kPublicKey); } - value.SetStringKey("id", Base64UrlEncode(descriptor.id)); - std::vector<base::Value> transports; + value.Set("id", Base64UrlEncode(descriptor.id)); + base::Value::List transports; for (const device::FidoTransportProtocol& transport : descriptor.transports) { - transports.emplace_back(base::Value(ToString(transport))); + transports.Append(ToString(transport)); } if (!transports.empty()) { - value.SetKey("transports", base::Value(std::move(transports))); + value.Set("transports", std::move(transports)); } - return value; + return base::Value(std::move(value)); } base::Value ToValue( @@ -180,17 +180,17 @@ base::Value ToValue( const device::AuthenticatorSelectionCriteria& authenticator_selection) { - base::Value value(base::Value::Type::DICTIONARY); + base::Value::Dict value; absl::optional<std::string> attachment; if (authenticator_selection.authenticator_attachment != device::AuthenticatorAttachment::kAny) { - value.SetKey("authenticatorAttachment", - ToValue(authenticator_selection.authenticator_attachment)); + value.Set("authenticatorAttachment", + ToValue(authenticator_selection.authenticator_attachment)); } - value.SetKey("residentKey", ToValue(authenticator_selection.resident_key)); - value.SetKey("userVerification", - ToValue(authenticator_selection.user_verification_requirement)); - return value; + value.Set("residentKey", ToValue(authenticator_selection.resident_key)); + value.Set("userVerification", + ToValue(authenticator_selection.user_verification_requirement)); + return base::Value(std::move(value)); } base::Value ToValue(const device::AttestationConveyancePreference& @@ -211,12 +211,11 @@ base::Value ToValue(const blink::mojom::RemoteDesktopClientOverride& remote_desktop_client_override) { - base::Value value(base::Value::Type::DICTIONARY); - value.SetStringKey("origin", - remote_desktop_client_override.origin.Serialize()); - value.SetBoolKey("sameOriginWithAncestors", - remote_desktop_client_override.same_origin_with_ancestors); - return value; + base::Value::Dict value; + value.Set("origin", remote_desktop_client_override.origin.Serialize()); + value.Set("sameOriginWithAncestors", + remote_desktop_client_override.same_origin_with_ancestors); + return base::Value(std::move(value)); } base::Value ToValue(const blink::mojom::ProtectionPolicy policy) { @@ -246,35 +245,30 @@ } base::Value ToValue(const device::CableDiscoveryData& cable_authentication) { - base::Value value(base::Value::Type::DICTIONARY); + base::Value::Dict value; switch (cable_authentication.version) { case device::CableDiscoveryData::Version::INVALID: NOTREACHED(); break; case device::CableDiscoveryData::Version::V1: - value.SetKey("version", base::Value(1)); - value.SetKey( - "clientEid", - base::Value(Base64UrlEncode(cable_authentication.v1->client_eid))); - value.SetKey("authenticatorEid", - base::Value(Base64UrlEncode( - cable_authentication.v1->authenticator_eid))); - value.SetKey("sessionPreKey", - base::Value(Base64UrlEncode( - cable_authentication.v1->session_pre_key))); + value.Set("version", 1); + value.Set("clientEid", + Base64UrlEncode(cable_authentication.v1->client_eid)); + value.Set("authenticatorEid", + Base64UrlEncode(cable_authentication.v1->authenticator_eid)); + value.Set("sessionPreKey", + Base64UrlEncode(cable_authentication.v1->session_pre_key)); break; case device::CableDiscoveryData::Version::V2: - value.SetKey("version", base::Value(2)); - value.SetKey( - "clientEid", - base::Value(Base64UrlEncode(cable_authentication.v2->experiments))); - value.SetKey("authenticatorEid", base::Value("")); - value.SetKey("sessionPreKey", - base::Value(Base64UrlEncode( - cable_authentication.v2->server_link_data))); + value.Set("version", 2); + value.Set("clientEid", + Base64UrlEncode(cable_authentication.v2->experiments)); + value.Set("authenticatorEid", ""); + value.Set("sessionPreKey", + Base64UrlEncode(cable_authentication.v2->server_link_data)); break; } - return value; + return base::Value(std::move(value)); } absl::optional<device::FidoTransportProtocol> FidoTransportProtocolFromValue( @@ -308,32 +302,30 @@ base::Value ToValue( const blink::mojom::PublicKeyCredentialCreationOptionsPtr& options) { - base::Value value(base::Value::Type::DICTIONARY); - value.SetKey("rp", ToValue(options->relying_party)); - value.SetKey("user", ToValue(options->user)); - value.SetStringKey("challenge", Base64UrlEncode(options->challenge)); - std::vector<base::Value> public_key_parameters; + base::Value::Dict value; + value.Set("rp", ToValue(options->relying_party)); + value.Set("user", ToValue(options->user)); + value.Set("challenge", Base64UrlEncode(options->challenge)); + base::Value::List public_key_parameters; for (const device::PublicKeyCredentialParams::CredentialInfo& params : options->public_key_parameters) { - public_key_parameters.push_back(ToValue(params)); + public_key_parameters.Append(ToValue(params)); } - value.SetKey("pubKeyCredParams", - base::Value(std::move(public_key_parameters))); - std::vector<base::Value> exclude_credentials; + value.Set("pubKeyCredParams", std::move(public_key_parameters)); + base::Value::List exclude_credentials; for (const device::PublicKeyCredentialDescriptor& descriptor : options->exclude_credentials) { - exclude_credentials.push_back(ToValue(descriptor)); + exclude_credentials.Append(ToValue(descriptor)); } - value.SetKey("excludeCredentials", - base::Value(std::move(exclude_credentials))); + value.Set("excludeCredentials", std::move(exclude_credentials)); if (options->authenticator_selection) { - value.SetKey("authenticatorSelection", - ToValue(*options->authenticator_selection)); + value.Set("authenticatorSelection", + ToValue(*options->authenticator_selection)); } - value.SetKey("attestation", ToValue(options->attestation)); + value.Set("attestation", ToValue(options->attestation)); base::Value::Dict& extensions = - value.GetDict().Set("extensions", base::Value::Dict())->GetDict(); + value.Set("extensions", base::Value::Dict())->GetDict(); if (options->hmac_create_secret) { extensions.Set("hmacCreateSecret", true); @@ -344,21 +336,20 @@ extensions.Set("credentialProtectionPolicy", ToValue(options->protection_policy)); extensions.Set("enforceCredentialProtectionPolicy", - base::Value(options->enforce_protection_policy)); + options->enforce_protection_policy); } if (options->appid_exclude) { - extensions.Set("appIdExclude", base::Value(*options->appid_exclude)); + extensions.Set("appIdExclude", *options->appid_exclude); } if (options->cred_props) { - extensions.Set("credProps", base::Value(true)); + extensions.Set("credProps", true); } if (options->large_blob_enable != device::LargeBlobSupport::kNotRequested) { - base::Value large_blob_value(base::Value::Type::DICTIONARY); - large_blob_value.GetDict().Set("support", - ToValue(options->large_blob_enable)); + base::Value::Dict large_blob_value; + large_blob_value.Set("support", ToValue(options->large_blob_enable)); extensions.Set("largeBlob", std::move(large_blob_value)); } @@ -369,11 +360,11 @@ } if (options->google_legacy_app_id_support) { - extensions.Set("googleLegacyAppidSupport", base::Value(true)); + extensions.Set("googleLegacyAppidSupport", true); } if (options->min_pin_length_requested) { - extensions.Set("minPinLength", base::Value(true)); + extensions.Set("minPinLength", true); } if (options->remote_desktop_client_override) { @@ -383,39 +374,38 @@ DCHECK(!options->prf_enable); - return value; + return base::Value(std::move(value)); } base::Value ToValue( const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options) { - base::Value value(base::Value::Type::DICTIONARY); - value.SetStringKey("challenge", Base64UrlEncode(options->challenge)); - value.SetStringKey("rpId", options->relying_party_id); + base::Value::Dict value; + value.Set("challenge", Base64UrlEncode(options->challenge)); + value.Set("rpId", options->relying_party_id); - std::vector<base::Value> allow_credentials; + base::Value::List allow_credentials; for (const device::PublicKeyCredentialDescriptor& descriptor : options->allow_credentials) { - allow_credentials.push_back(ToValue(descriptor)); + allow_credentials.Append(ToValue(descriptor)); } - value.SetKey("allowCredentials", base::Value(std::move(allow_credentials))); + value.Set("allowCredentials", std::move(allow_credentials)); - value.SetKey("userVerification", ToValue(options->user_verification)); + value.Set("userVerification", ToValue(options->user_verification)); base::Value::Dict& extensions = - value.GetDict().Set("extensions", base::Value::Dict())->GetDict(); + value.Set("extensions", base::Value::Dict())->GetDict(); if (options->appid) { - extensions.Set("appid", base::Value(*options->appid)); + extensions.Set("appid", *options->appid); } - std::vector<base::Value> cable_authentication_data; + base::Value::List cable_authentication_data; for (const device::CableDiscoveryData& cable : options->cable_authentication_data) { - cable_authentication_data.push_back(ToValue(cable)); + cable_authentication_data.Append(ToValue(cable)); } if (!cable_authentication_data.empty()) { - extensions.Set("cableAuthentication", - base::Value(std::move(cable_authentication_data))); + extensions.Set("cableAuthentication", std::move(cable_authentication_data)); } if (options->get_cred_blob) { @@ -423,13 +413,13 @@ } if (options->large_blob_read || options->large_blob_write) { - base::Value large_blob_value(base::Value::Type::DICTIONARY); + base::Value::Dict large_blob_value; if (options->large_blob_read) { - large_blob_value.GetDict().Set({"read"}, base::Value(true)); + large_blob_value.Set("read", true); } if (options->large_blob_write) { - large_blob_value.GetDict().Set( - {"write"}, base::Value(Base64UrlEncode(*options->large_blob_write))); + large_blob_value.Set("write", + Base64UrlEncode(*options->large_blob_write)); } extensions.Set("largeBlob", std::move(large_blob_value)); } @@ -441,7 +431,7 @@ DCHECK(!options->prf); - return value; + return base::Value(std::move(value)); } std::pair<blink::mojom::MakeCredentialAuthenticatorResponsePtr, std::string>
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc index 5d314d2..e2af634 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.cc +++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -76,6 +76,7 @@ #include "extensions/browser/url_request_util.h" #include "extensions/common/extension_urls.h" #include "extensions/common/features/feature_channel.h" +#include "extensions/common/permissions/permission_set.h" #include "third_party/abseil-cpp/absl/types/optional.h" #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -713,4 +714,39 @@ Profile::FromBrowserContext(browser_context), extension); } +std::unique_ptr<const PermissionSet> +ChromeExtensionsBrowserClient::AddAdditionalAllowedHosts( + const PermissionSet& desired_permissions, + const PermissionSet& granted_permissions) const { + auto get_new_host_patterns = [](const URLPatternSet& desired_patterns, + const URLPatternSet& granted_patterns) { + URLPatternSet new_patterns = granted_patterns.Clone(); + for (const URLPattern& pattern : desired_patterns) { + // The chrome://favicon permission is special. It is requested by + // extensions to access stored favicons, but is not a traditional + // host permission. Since it cannot be reasonably runtime-granted + // while the user is on the site (i.e., the user never visits + // chrome://favicon/), we auto-grant it and treat it like an API + // permission. + bool is_chrome_favicon = pattern.scheme() == content::kChromeUIScheme && + pattern.host() == chrome::kChromeUIFaviconHost; + if (is_chrome_favicon) + new_patterns.AddPattern(pattern); + } + return new_patterns; + }; + + URLPatternSet new_explicit_hosts = + get_new_host_patterns(desired_permissions.explicit_hosts(), + granted_permissions.explicit_hosts()); + URLPatternSet new_scriptable_hosts = + get_new_host_patterns(desired_permissions.scriptable_hosts(), + granted_permissions.scriptable_hosts()); + + return std::make_unique<PermissionSet>( + granted_permissions.apis().Clone(), + granted_permissions.manifest_permissions().Clone(), + std::move(new_explicit_hosts), std::move(new_scriptable_hosts)); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h index e774232..88df9d8 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.h +++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -193,6 +193,9 @@ std::vector<content::BrowserContext*> GetRelatedContextsForExtension( content::BrowserContext* browser_context, const Extension& extension) const override; + std::unique_ptr<const PermissionSet> AddAdditionalAllowedHosts( + const PermissionSet& desired_permissions, + const PermissionSet& granted_permissions) const override; private: friend struct base::LazyInstanceTraitsBase<ChromeExtensionsBrowserClient>;
diff --git a/chrome/browser/extensions/permissions_manager_unittest.cc b/chrome/browser/extensions/permissions_manager_unittest.cc new file mode 100644 index 0000000..648807b --- /dev/null +++ b/chrome/browser/extensions/permissions_manager_unittest.cc
@@ -0,0 +1,65 @@ +// 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 "extensions/browser/permissions_manager.h" + +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_service_test_with_install.h" +#include "chrome/browser/extensions/scripting_permissions_modifier.h" +#include "extensions/browser/extension_registry.h" +#include "extensions/common/extension.h" +#include "extensions/common/extension_id.h" +#include "extensions/common/extension_set.h" +#include "extensions/common/permissions/permissions_data.h" +#include "extensions/common/url_pattern.h" +#include "extensions/test/test_extension_dir.h" + +namespace extensions { + +using PermissionsManagerUnitTest = ExtensionServiceTestWithInstall; + +TEST_F(PermissionsManagerUnitTest, FaviconPermissionsAreNotWithheld) { + constexpr char kManifest[] = + R"({ + "name": "<all urls> extension", + "manifest_version": 2, + "version": "0.1", + "permissions": ["<all_urls>"] + })"; + + TestExtensionDir test_dir; + test_dir.WriteManifest(kManifest); + + InitializeEmptyExtensionService(); + const Extension* extension = + PackAndInstallCRX(test_dir.UnpackedPath(), INSTALL_NEW); + ASSERT_TRUE(extension); + + URLPattern chrome_favicon_pattern(Extension::kValidHostPermissionSchemes, + "chrome://favicon/"); + EXPECT_TRUE(extension->permissions_data() + ->active_permissions() + .explicit_hosts() + .ContainsPattern(chrome_favicon_pattern)); + + ScriptingPermissionsModifier(profile(), extension) + .SetWithholdHostPermissions(true); + EXPECT_TRUE(extension->permissions_data() + ->active_permissions() + .explicit_hosts() + .ContainsPattern(chrome_favicon_pattern)); + + { + const ExtensionId id = extension->id(); + service()->ReloadExtensionsForTest(); + extension = registry()->enabled_extensions().GetByID(id); + ASSERT_TRUE(extension); + } + EXPECT_TRUE(extension->permissions_data() + ->active_permissions() + .explicit_hosts() + .ContainsPattern(chrome_favicon_pattern)); +} + +} // namespace extensions
diff --git a/chrome/browser/extensions/permissions_updater.cc b/chrome/browser/extensions/permissions_updater.cc index 09aec5cf..5cfe0d8 100644 --- a/chrome/browser/extensions/permissions_updater.cc +++ b/chrome/browser/extensions/permissions_updater.cc
@@ -37,6 +37,7 @@ #include "extensions/browser/extension_util.h" #include "extensions/browser/network_permissions_updater.h" #include "extensions/browser/notification_types.h" +#include "extensions/browser/permissions_manager.h" #include "extensions/browser/renderer_startup_helper.h" #include "extensions/common/cors_util.h" #include "extensions/common/extension.h" @@ -56,41 +57,6 @@ namespace { -// Returns a PermissionSet that has the active permissions of the extension, -// bounded to its current manifest. -std::unique_ptr<const PermissionSet> GetBoundedActivePermissions( - const Extension* extension, - const PermissionSet* active_permissions) { - // If the extension has used the optional permissions API, it will have a - // custom set of active permissions defined in the extension prefs. Here, - // we update the extension's active permissions based on the prefs. - if (!active_permissions) - return extension->permissions_data()->active_permissions().Clone(); - - const PermissionSet& required_permissions = - PermissionsParser::GetRequiredPermissions(extension); - - // We restrict the active permissions to be within the bounds defined in the - // extension's manifest. - // a) active permissions must be a subset of optional + default permissions - // b) active permissions must contains all default permissions - std::unique_ptr<const PermissionSet> total_permissions = - PermissionSet::CreateUnion( - required_permissions, - PermissionsParser::GetOptionalPermissions(extension)); - - // Make sure the active permissions contain no more than optional + default. - std::unique_ptr<const PermissionSet> adjusted_active = - PermissionSet::CreateIntersection(*total_permissions, - *active_permissions); - - // Make sure the active permissions contain the default permissions. - adjusted_active = - PermissionSet::CreateUnion(required_permissions, *adjusted_active); - - return adjusted_active; -} - std::unique_ptr<PermissionsUpdater::Delegate>& GetDelegateWrapper() { static base::NoDestructor<std::unique_ptr<PermissionsUpdater::Delegate>> delegate_wrapper; @@ -515,24 +481,27 @@ } void PermissionsUpdater::InitializePermissions(const Extension* extension) { - std::unique_ptr<const PermissionSet> bounded_wrapper; - const PermissionSet* bounded_active = nullptr; + std::unique_ptr<const PermissionSet> desired_permissions_wrapper; + const PermissionSet* desired_permissions = nullptr; + + PermissionsManager* permissions_manager = + PermissionsManager::Get(browser_context_); + DCHECK(permissions_manager); + // If |extension| is a transient dummy extension, we do not want to look for // it in preferences. if (init_flag_ & INIT_FLAG_TRANSIENT) { - bounded_active = &extension->permissions_data()->active_permissions(); + desired_permissions = &extension->permissions_data()->active_permissions(); } else { - ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context_); - std::unique_ptr<const PermissionSet> active_permissions = - prefs->GetActivePermissions(extension->id()); - bounded_wrapper = - GetBoundedActivePermissions(extension, active_permissions.get()); - bounded_active = bounded_wrapper.get(); + desired_permissions_wrapper = + PermissionsManager::Get(browser_context_) + ->GetExtensionDesiredPermissionsFromPrefs(*extension); + desired_permissions = desired_permissions_wrapper.get(); } std::unique_ptr<const PermissionSet> granted_permissions = - ScriptingPermissionsModifier(browser_context_, extension) - .WithholdPermissionsIfNecessary(*bounded_active); + permissions_manager->GetEffectivePermissionsToGrant(*extension, + *desired_permissions); if (GetDelegate()) GetDelegate()->InitializePermissions(extension, &granted_permissions);
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc index f2ea179b..4d9759a 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -11,6 +11,7 @@ #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_util.h" +#include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/permissions_manager.h" #include "extensions/common/extension.h" #include "extensions/common/manifest_handlers/permissions_parser.h" @@ -22,54 +23,6 @@ namespace { -// Iterates over |requested_permissions| and returns a permission set of any -// permissions that should be granted. These include any non-host -// permissions or host permissions that are present in -// |runtime_granted_permissions|. The returned permission set may contain new -// patterns not found in either |requested_permissions| or -// |runtime_granted_permissions| in the case of overlapping host permissions -// (such as *://*.google.com/* and https://*/*, which would intersect with -// https://*.google.com/*). -std::unique_ptr<const PermissionSet> PartitionHostPermissions( - const PermissionSet& requested_permissions, - const PermissionSet& runtime_granted_permissions) { - auto segregate_url_permissions = - [](const URLPatternSet& requested_patterns, - const URLPatternSet& runtime_granted_patterns, - URLPatternSet* granted) { - *granted = URLPatternSet::CreateIntersection( - requested_patterns, runtime_granted_patterns, - URLPatternSet::IntersectionBehavior::kDetailed); - for (const URLPattern& pattern : requested_patterns) { - // The chrome://favicon permission is special. It is requested by - // extensions to access stored favicons, but is not a traditional - // host permission. Since it cannot be reasonably runtime-granted - // while the user is on the site (i.e., the user never visits - // chrome://favicon/), we auto-grant it and treat it like an API - // permission. - bool is_chrome_favicon = - pattern.scheme() == content::kChromeUIScheme && - pattern.host() == chrome::kChromeUIFaviconHost; - if (is_chrome_favicon) - granted->AddPattern(pattern); - } - }; - - URLPatternSet granted_explicit_hosts; - URLPatternSet granted_scriptable_hosts; - segregate_url_permissions(requested_permissions.explicit_hosts(), - runtime_granted_permissions.explicit_hosts(), - &granted_explicit_hosts); - segregate_url_permissions(requested_permissions.scriptable_hosts(), - runtime_granted_permissions.scriptable_hosts(), - &granted_scriptable_hosts); - - return std::make_unique<PermissionSet>( - requested_permissions.apis().Clone(), - requested_permissions.manifest_permissions().Clone(), - std::move(granted_explicit_hosts), std::move(granted_scriptable_hosts)); -} - // Returns true if the extension should even be considered for being affected // by the runtime host permissions experiment. bool ShouldConsiderExtension(const Extension& extension) { @@ -232,43 +185,6 @@ } std::unique_ptr<const PermissionSet> -ScriptingPermissionsModifier::WithholdPermissionsIfNecessary( - const PermissionSet& permissions) { - if (!ShouldConsiderExtension(*extension_)) { - // The withhold creation flag should never have been set in cases where - // withholding isn't allowed. - DCHECK(!(extension_->creation_flags() & Extension::WITHHOLD_PERMISSIONS)); - return permissions.Clone(); - } - - if (permissions.effective_hosts().is_empty()) - return permissions.Clone(); // No hosts to withhold. - - bool should_withhold = false; - if (extension_->creation_flags() & Extension::WITHHOLD_PERMISSIONS) { - should_withhold = true; - } else { - should_withhold = - extension_prefs_->GetWithholdingPermissions(extension_->id()); - } - - if (!should_withhold) - return permissions.Clone(); - - // Only grant host permissions that the user has explicitly granted at - // runtime through the runtime host permissions feature or the optional - // permissions API. - std::unique_ptr<const PermissionSet> runtime_granted_permissions = - GetRuntimePermissionsFromPrefs(); - // If there were no runtime granted permissions found in the prefs, default to - // a new empty set. - if (!runtime_granted_permissions) { - runtime_granted_permissions = std::make_unique<PermissionSet>(); - } - return PartitionHostPermissions(permissions, *runtime_granted_permissions); -} - -std::unique_ptr<const PermissionSet> ScriptingPermissionsModifier::GetRevokablePermissions() const { // No extra revokable permissions if the extension couldn't ever be affected. if (!ShouldConsiderExtension(*extension_)) @@ -296,14 +212,29 @@ &extension_->permissions_data()->active_permissions(); } - // Revokable permissions are those that would be withheld if there were no - // runtime-granted permissions. - PermissionSet empty_runtime_granted_permissions; - std::unique_ptr<const PermissionSet> granted_permissions = - PartitionHostPermissions(*current_granted_permissions, - empty_runtime_granted_permissions); + std::unique_ptr<const PermissionSet> unrevokable_permissions; + { + PermissionSet apis_and_manifest( + current_granted_permissions->apis().Clone(), + current_granted_permissions->manifest_permissions().Clone(), + URLPatternSet(), URLPatternSet()); + // TODO(devlin): We do this pattern of "required + optional" enough. Make it + // a part of PermissionsParser and stop duplicating the set each time. + std::unique_ptr<const PermissionSet> requested_permissions = + PermissionSet::CreateUnion( + PermissionsParser::GetRequiredPermissions(extension_.get()), + PermissionsParser::GetOptionalPermissions(extension_.get())); + // Unrevokable permissions include API permissions, manifest permissions, + // and host permissions that are always allowed. + unrevokable_permissions = + ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( + *requested_permissions, apis_and_manifest); + } + + // Revokable permissions are, predictably, any in the current set that aren't + // considered unrevokable. return PermissionSet::CreateDifference(*current_granted_permissions, - *granted_permissions); + *unrevokable_permissions); } void ScriptingPermissionsModifier::GrantWithheldHostPermissions() {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 778a0fb2..82c118c 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -1371,6 +1371,11 @@ "owners": [ "garrick", "jasongustaman" ], "expiry_milestone": 109 }, + { + "name": "document-picture-in-picture-api", + "owners": [ "steimel", "media-dev" ], + "expiry_milestone": 120 + }, { "name": "document-transition", "owners": [ "khushalsagar", "vmpstr", "chrishtr" ],
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 256eea20..9ebd2e4 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -152,6 +152,11 @@ "Defer text rendering in invisible CSS boxes until the boxes become " "visible."; +const char kDocumentPictureInPictureApiName[] = + "Document Picture-in-Picture API"; +const char kDocumentPictureInPictureApiDescription[] = + "Enables API to open an always-on-top window with a full HTML document"; + const char kEditPasswordsInSettingsName[] = "Edit passwords in settings"; const char kEditPasswordsInSettingsDescription[] = "Enables password editing in settings.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index c3eb436..68556fe2 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -100,6 +100,9 @@ extern const char kDeferredFontShapingName[]; extern const char kDeferredFontShapingDescription[]; +extern const char kDocumentPictureInPictureApiName[]; +extern const char kDocumentPictureInPictureApiDescription[]; + extern const char kForceStartupSigninPromoName[]; extern const char kForceStartupSigninPromoDescription[];
diff --git a/chrome/browser/media/webrtc/webrtc_text_log_handler.cc b/chrome/browser/media/webrtc/webrtc_text_log_handler.cc index db36e1a1..6b67dbcd 100644 --- a/chrome/browser/media/webrtc/webrtc_text_log_handler.cc +++ b/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
@@ -120,7 +120,9 @@ sensitive_address = net::IPAddress(stripped).ToString(); break; } - default: { break; } + default: { + break; + } } return sensitive_address; #else @@ -525,7 +527,10 @@ NumberToString( media::kChromeWideEchoCancellationProcessingFifoSize.Get()), ", minimize_resampling = ", - media::kChromeWideEchoCancellationMinimizeResampling.Get() + media::kChromeWideEchoCancellationMinimizeResampling.Get() ? "true" + : "false", + ", allow_all_sample_rates = ", + media::kChromeWideEchoCancellationAllowAllSampleRates.Get() ? "true" : "false"})); } else {
diff --git a/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc b/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc index f7a7faf..bd9c75e 100644 --- a/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc +++ b/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc
@@ -1870,9 +1870,10 @@ } } -TEST_P(NearbyNotificationManagerTest, ShowVisibilityReminder_Hidden_Mode) { - ExpectShowVisibilityReminderDcheckDeath(); -} +// TODO: b/237714345 fix the test. +// TEST_P(NearbyNotificationManagerTest, ShowVisibilityReminder_Hidden_Mode) { +// ExpectShowVisibilityReminderDcheckDeath(); +// } TEST_P(NearbyNotificationManagerTest, ShowVisibilityReminder_Notification_Clicked) {
diff --git a/chrome/browser/password_manager/password_store_backend_factory.cc b/chrome/browser/password_manager/password_store_backend_factory.cc index 54d19b7..89e9374 100644 --- a/chrome/browser/password_manager/password_store_backend_factory.cc +++ b/chrome/browser/password_manager/password_store_backend_factory.cc
@@ -25,8 +25,7 @@ std::unique_ptr<PasswordStoreBackend> PasswordStoreBackend::Create( const base::FilePath& login_db_path, - PrefService* prefs, - std::unique_ptr<SyncDelegate> sync_delegate) { + PrefService* prefs) { TRACE_EVENT0("passwords", "PasswordStoreBackendCreation"); #if !BUILDFLAG(IS_ANDROID) || BUILDFLAG(USE_LEGACY_PASSWORD_STORE_BACKEND) return std::make_unique<PasswordStoreBuiltInBackend>( @@ -42,8 +41,7 @@ return std::make_unique<PasswordStoreBackendMigrationDecorator>( std::make_unique<PasswordStoreBuiltInBackend>( CreateLoginDatabaseForProfileStorage(login_db_path)), - std::make_unique<PasswordStoreAndroidBackend>(prefs), prefs, - std::move(sync_delegate)); + std::make_unique<PasswordStoreAndroidBackend>(prefs), prefs); } return std::make_unique<PasswordStoreBuiltInBackend>( CreateLoginDatabaseForProfileStorage(login_db_path));
diff --git a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.cc b/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.cc deleted file mode 100644 index 9a1c3908..0000000 --- a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.cc +++ /dev/null
@@ -1,27 +0,0 @@ -// 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/password_manager/password_store_backend_sync_delegate_impl.h" - -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/sync/sync_service_factory.h" -#include "components/password_manager/core/browser/password_sync_util.h" -#include "components/signin/public/identity_manager/account_info.h" -#include "components/sync/driver/sync_service.h" - -using password_manager::sync_util::IsPasswordSyncEnabled; - -PasswordStoreBackendSyncDelegateImpl::PasswordStoreBackendSyncDelegateImpl( - Profile* profile) - : profile_(profile) { - DCHECK(profile_); -} - -PasswordStoreBackendSyncDelegateImpl::~PasswordStoreBackendSyncDelegateImpl() = - default; - -bool PasswordStoreBackendSyncDelegateImpl::IsSyncingPasswordsEnabled() { - DCHECK(SyncServiceFactory::HasSyncService(profile_)); - return IsPasswordSyncEnabled(SyncServiceFactory::GetForProfile(profile_)); -}
diff --git a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h b/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h deleted file mode 100644 index d9dff3f..0000000 --- a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h +++ /dev/null
@@ -1,26 +0,0 @@ -// 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_PASSWORD_MANAGER_PASSWORD_STORE_BACKEND_SYNC_DELEGATE_IMPL_H_ -#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_BACKEND_SYNC_DELEGATE_IMPL_H_ - -#include "components/password_manager/core/browser/password_store_backend.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -class Profile; - -class PasswordStoreBackendSyncDelegateImpl - : public password_manager::PasswordStoreBackend::SyncDelegate { - public: - explicit PasswordStoreBackendSyncDelegateImpl(Profile* profile); - ~PasswordStoreBackendSyncDelegateImpl() override; - - private: - // SyncDelegate implementation. - bool IsSyncingPasswordsEnabled() override; - - base::raw_ptr<Profile> profile_; -}; - -#endif // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_BACKEND_SYNC_DELEGATE_IMPL_H_
diff --git a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc b/chrome/browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc deleted file mode 100644 index 3be8195..0000000 --- a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc +++ /dev/null
@@ -1,79 +0,0 @@ -// 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/password_manager/password_store_backend_sync_delegate_impl.h" - -#include <memory> - -#include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/test/base/testing_profile.h" -#include "components/sync/driver/sync_service.h" -#include "components/sync/driver/test_sync_service.h" -#include "components/sync/driver/test_sync_user_settings.h" -#include "content/public/test/browser_task_environment.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -class PasswordStoreBackendSyncDelegateImplTest : public testing::Test { - protected: - PasswordStoreBackendSyncDelegateImplTest() { - TestingProfile::Builder builder; - builder.AddTestingFactory(SyncServiceFactory::GetInstance(), - SyncServiceFactory::GetDefaultFactory()); - testing_profile_ = builder.Build(); - - sync_service_ = static_cast<syncer::TestSyncService*>( - SyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( - testing_profile_.get(), - base::BindRepeating( - [](content::BrowserContext*) -> std::unique_ptr<KeyedService> { - return std::make_unique<syncer::TestSyncService>(); - }))); - - sync_delegate_ = std::make_unique<PasswordStoreBackendSyncDelegateImpl>( - testing_profile_.get()); - } - - ~PasswordStoreBackendSyncDelegateImplTest() override = default; - - syncer::TestSyncService* sync_service() { return sync_service_; } - - password_manager::PasswordStoreBackend::SyncDelegate* sync_delegate() { - return sync_delegate_.get(); - } - - private: - content::BrowserTaskEnvironment task_environment_; - std::unique_ptr<TestingProfile> testing_profile_; - raw_ptr<syncer::TestSyncService> sync_service_; - std::unique_ptr<PasswordStoreBackendSyncDelegateImpl> sync_delegate_; -}; - -TEST_F(PasswordStoreBackendSyncDelegateImplTest, SyncDisabled) { - sync_service()->SetTransportState( - syncer::SyncService::TransportState::DISABLED); - sync_service()->SetHasSyncConsent(false); - EXPECT_FALSE(sync_delegate()->IsSyncingPasswordsEnabled()); -} - -TEST_F(PasswordStoreBackendSyncDelegateImplTest, - SyncEnabledButNotForPasswords) { - sync_service()->SetTransportState( - syncer::SyncService::TransportState::ACTIVE); - sync_service()->SetHasSyncConsent(true); - static_cast<syncer::TestSyncUserSettings*>(sync_service()->GetUserSettings()) - ->SetSelectedTypes(/*sync_everything=*/false, - {syncer::UserSelectableType::kHistory}); - EXPECT_FALSE(sync_delegate()->IsSyncingPasswordsEnabled()); -} - -TEST_F(PasswordStoreBackendSyncDelegateImplTest, SyncEnabled) { - sync_service()->SetTransportState( - syncer::SyncService::TransportState::ACTIVE); - sync_service()->SetHasSyncConsent(true); - AccountInfo active_info; - active_info.email = "test@email.com"; - sync_service()->SetAccountInfo(active_info); - EXPECT_TRUE(sync_delegate()->IsSyncingPasswordsEnabled()); -}
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc index 10a75cb..36480b47 100644 --- a/chrome/browser/password_manager/password_store_factory.cc +++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -13,7 +13,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/password_manager/affiliation_service_factory.h" #include "chrome/browser/password_manager/credentials_cleaner_runner_factory.h" -#include "chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h" #include "chrome/browser/password_manager/password_store_utils.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" @@ -76,16 +75,16 @@ // about the sync service existence. And hence we cannot directly query the // status of password syncing. However, status of password syncing is // relevant for migrating passwords from the built-in backend to the Android - // backend. Since migration does *not* start immediately after start up, we - // inject a repeating callback that queries the sync service. Assumption is - // by the time the migration starts, the sync service will have been - // created. As a safety mechanism, if the sync service isn't created yet, we - // proceed as if the user isn't syncing which forces moving the passwords to - // the Android backend to avoid data loss. + // backend. Since migration does *not* start immediately after start up, + // SyncService will be propagated to PasswordStoreBackend after the backend + // creation once SyncService is initialized. Assumption is by the time the + // migration starts, the sync service will have been created. As a safety + // mechanism, if the sync service isn't created yet, we proceed as if the + // user isn't syncing which forces moving the passwords to the Android backend + // to avoid data loss. ps = new password_manager::PasswordStore( - password_manager::PasswordStoreBackend::Create( - profile->GetPath(), profile->GetPrefs(), - std::make_unique<PasswordStoreBackendSyncDelegateImpl>(profile))); + password_manager::PasswordStoreBackend::Create(profile->GetPath(), + profile->GetPrefs())); #else NOTIMPLEMENTED(); #endif
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 372c299..a82db3e 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -652,9 +652,6 @@ { key::kAdditionalDnsQueryTypesEnabled, prefs::kAdditionalDnsQueryTypesEnabled, base::Value::Type::BOOLEAN }, - { key::kSafeBrowsingForTrustedSourcesEnabled, - prefs::kSafeBrowsingForTrustedSourcesEnabled, - base::Value::Type::BOOLEAN }, { key::kSafeBrowsingExtendedReportingEnabled, prefs::kSafeBrowsingScoutReportingEnabled, base::Value::Type::BOOLEAN }, @@ -673,9 +670,6 @@ { key::kDisablePrintPreview, prefs::kPrintPreviewDisabled, base::Value::Type::BOOLEAN }, - { key::kApplicationLocaleValue, - language::prefs::kApplicationLocale, - base::Value::Type::STRING }, { key::kAlwaysOpenPdfExternally, prefs::kPluginsAlwaysOpenPdfExternally, base::Value::Type::BOOLEAN }, @@ -881,9 +875,6 @@ { key::kPasswordLeakDetectionEnabled, password_manager::prefs::kPasswordLeakDetectionEnabled, base::Value::Type::BOOLEAN }, - { key::kTotalMemoryLimitMb, - prefs::kTotalMemoryLimitMb, - base::Value::Type::INTEGER }, { key::kPaymentMethodQueryEnabled, payments::kCanMakePaymentEnabled, base::Value::Type::BOOLEAN }, @@ -1418,6 +1409,9 @@ #endif // BUILDFLAG(IS_LINUX) #if BUILDFLAG(IS_WIN) + { key::kApplicationLocaleValue, + language::prefs::kApplicationLocale, + base::Value::Type::STRING }, { key::kChromeCleanupEnabled, prefs::kSwReporterEnabled, base::Value::Type::BOOLEAN }, @@ -1451,6 +1445,12 @@ { key::kNetworkServiceSandboxEnabled, prefs::kNetworkServiceSandboxEnabled, base::Value::Type::BOOLEAN }, + { key::kSafeBrowsingForTrustedSourcesEnabled, + prefs::kSafeBrowsingForTrustedSourcesEnabled, + base::Value::Type::BOOLEAN }, + { key::kWindowOcclusionEnabled, + policy::policy_prefs::kNativeWindowOcclusionEnabled, + base::Value::Type::BOOLEAN }, #else // BUILDFLAG(IS_WIN) { key::kNtlmV2Enabled, prefs::kNtlmV2Enabled, @@ -1467,6 +1467,9 @@ { key::kPrintPdfAsImageAvailability, prefs::kPrintPdfAsImageAvailability, base::Value::Type::BOOLEAN }, + { key::kTotalMemoryLimitMb, + prefs::kTotalMemoryLimitMb, + base::Value::Type::INTEGER }, #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) @@ -1948,10 +1951,6 @@ std::make_unique<WebUsbAllowDevicesForUrlsPolicyHandler>(chrome_schema)); handlers->AddHandler(std::make_unique<FileSelectionDialogsPolicyHandler>()); handlers->AddHandler(std::make_unique<JavascriptPolicyHandler>()); - handlers->AddHandler(std::make_unique<SimplePolicyHandler>( - key::kWindowOcclusionEnabled, - policy::policy_prefs::kNativeWindowOcclusionEnabled, - base::Value::Type::BOOLEAN)); handlers->AddHandler(std::make_unique<BrowsingHistoryPolicyHandler>()); handlers->AddHandler( @@ -1991,9 +1990,11 @@ #else // BUILDFLAG(IS_CHROMEOS) std::vector<std::unique_ptr<ConfigurationPolicyHandler>> signin_legacy_policies; +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) signin_legacy_policies.push_back(std::make_unique<SimplePolicyHandler>( key::kForceBrowserSignin, prefs::kForceBrowserSignin, base::Value::Type::BOOLEAN)); +#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) signin_legacy_policies.push_back(std::make_unique<SimplePolicyHandler>( key::kSigninAllowed, #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/profiles/guest_mode_policy_handler.cc b/chrome/browser/profiles/guest_mode_policy_handler.cc index c5fd9d5..73357e666b 100644 --- a/chrome/browser/profiles/guest_mode_policy_handler.cc +++ b/chrome/browser/profiles/guest_mode_policy_handler.cc
@@ -28,6 +28,7 @@ guest_mode_value->GetBool()); return; } +#if !BUILDFLAG(IS_CHROMEOS) // Disable guest mode by default if force signin is enabled. const base::Value* browser_signin_value = policies.GetValue(key::kBrowserSignin, base::Value::Type::INTEGER); @@ -37,13 +38,16 @@ prefs->SetBoolean(prefs::kBrowserGuestModeEnabled, false); return; } +#endif +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) const base::Value* force_signin_value = policies.GetValue(key::kForceBrowserSignin, base::Value::Type::BOOLEAN); if (!browser_signin_value && force_signin_value && force_signin_value->GetBool()) { prefs->SetBoolean(prefs::kBrowserGuestModeEnabled, false); } +#endif } } // namespace policy
diff --git a/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc b/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc index 3c41c83..11b0e1e 100644 --- a/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc +++ b/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc
@@ -46,19 +46,23 @@ EXPECT_FALSE(prefs_.GetValue(prefs::kBrowserGuestModeEnabled, nullptr)); } +#if !BUILDFLAG(IS_CHROMEOS) TEST_F(GuestModePolicyHandlerTest, ForceSigninDisabled) { - SetUpPolicy(key::kForceBrowserSignin, false); + SetUpPolicy(key::kBrowserSignin, + static_cast<int>(policy::BrowserSigninMode::kDisabled)); handler_.ApplyPolicySettings(policies_, &prefs_); EXPECT_FALSE(prefs_.GetValue(prefs::kBrowserGuestModeEnabled, nullptr)); - SetUpPolicy(key::kForceBrowserSignin, 0); // Invalid format + SetUpPolicy(key::kBrowserSignin, + static_cast<int>(policy::BrowserSigninMode::kEnabled)); handler_.ApplyPolicySettings(policies_, &prefs_); EXPECT_FALSE(prefs_.GetValue(prefs::kBrowserGuestModeEnabled, nullptr)); } TEST_F(GuestModePolicyHandlerTest, GuestModeDisabledByDefault) { bool value; - SetUpPolicy(key::kForceBrowserSignin, true); + SetUpPolicy(key::kBrowserSignin, + static_cast<int>(policy::BrowserSigninMode::kForced)); handler_.ApplyPolicySettings(policies_, &prefs_); EXPECT_TRUE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value)); EXPECT_FALSE(value); @@ -67,7 +71,8 @@ TEST_F(GuestModePolicyHandlerTest, GuestModeDisabledByDefaultWithInvalidFormat) { bool value; - SetUpPolicy(key::kForceBrowserSignin, true); + SetUpPolicy(key::kBrowserSignin, + static_cast<int>(policy::BrowserSigninMode::kForced)); SetUpPolicy(key::kBrowserGuestModeEnabled, 0); handler_.ApplyPolicySettings(policies_, &prefs_); EXPECT_TRUE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value)); @@ -76,7 +81,8 @@ TEST_F(GuestModePolicyHandlerTest, GuestModeSet) { bool value; - SetUpPolicy(key::kForceBrowserSignin, true); + SetUpPolicy(key::kBrowserSignin, + static_cast<int>(policy::BrowserSigninMode::kForced)); SetUpPolicy(key::kBrowserGuestModeEnabled, true); handler_.ApplyPolicySettings(policies_, &prefs_); EXPECT_TRUE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value)); @@ -114,13 +120,7 @@ SetUpPolicy(key::kBrowserSignin, false); handler_.ApplyPolicySettings(policies_, &prefs_); EXPECT_FALSE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value)); - - // Even with forceBrowserSignin enable. - SetUpPolicy(key::kBrowserSignin, - static_cast<int>(BrowserSigninMode::kEnabled)); - SetUpPolicy(key::kForceBrowserSignin, true); - handler_.ApplyPolicySettings(policies_, &prefs_); - EXPECT_FALSE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value)); } +#endif // !BUILDFLAG(IS_CHROMEOS) } // namespace policy
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc index d8a2f46..342e297 100644 --- a/chrome/browser/profiles/off_the_record_profile_impl.cc +++ b/chrome/browser/profiles/off_the_record_profile_impl.cc
@@ -98,6 +98,10 @@ #include "chrome/browser/ash/profiles/profile_helper.h" #endif +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chromeos/startup/browser_init_params.h" +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS) #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_special_storage_policy.h" @@ -345,7 +349,9 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) bool OffTheRecordProfileImpl::IsMainProfile() const { - return false; + return chromeos::BrowserInitParams::Get()->session_type == + crosapi::mojom::SessionType::kGuestSession && + profile_->IsMainProfile(); } #endif // BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/profiles/profile_keyed_service_browsertest.cc b/chrome/browser/profiles/profile_keyed_service_browsertest.cc index 4f89905..53e7208 100644 --- a/chrome/browser/profiles/profile_keyed_service_browsertest.cc +++ b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
@@ -356,6 +356,7 @@ "PasswordsPrivateEventRouter", "PermissionAuditingService", "PermissionHelper", + "PermissionsManager", "PermissionsUpdaterShutdownFactory", "PersonalDataManager", "PinnedTabService",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn index d6e8d44..104b21c1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -30,13 +30,11 @@ "background/braille/cursor_dots.js", "background/braille/liblouis.js", "background/braille/pan_strategy.js", - "background/braille/spans.js", "background/chromevox.js", "background/focus_bounds.js", "background/logging/log_store.js", "background/output/output_role_info.js", "background/output/output_types.js", - "background/phonetic_data.js", "common/abstract_earcons.js", "common/background_bridge.js", "common/braille/braille_interface.js", @@ -45,7 +43,6 @@ "common/bridge_constants.js", "common/bridge_helper.js", "common/extension_bridge.js", - "common/locale_output_helper.js", "common/log_types.js", "common/msgs.js", "common/panel_bridge.js", @@ -80,6 +77,7 @@ "background/braille/cursor_dots.js", "background/braille/expanding_braille_translator.js", "background/braille/pan_strategy.js", + "background/braille/spans.js", "background/chromevox_state.js", "background/classic_background.js", "background/color.js", @@ -119,6 +117,7 @@ "background/panel/panel_background.js", "background/panel/panel_node_menu_background.js", "background/panel/panel_tab_menu_background.js", + "background/phonetic_data.js", "background/pointer_handler.js", "background/prefs.js", "background/range_automation_handler.js", @@ -138,6 +137,7 @@ "common/key_sequence.js", "common/key_util.js", "common/keyboard_handler.js", + "common/locale_output_helper.js", "common/panel_command.js", "common/tts_base.js", "learn_mode/learn_mode.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index 052f0cb..de57d7a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -25,6 +25,7 @@ import {ChromeVoxPrefs} from '/chromevox/background/prefs.js'; import {RangeAutomationHandler} from '/chromevox/background/range_automation_handler.js'; import {ExtensionBridge} from '/chromevox/common/extension_bridge.js'; +import {LocaleOutputHelper} from '/chromevox/common/locale_output_helper.js'; import {PanelCommand, PanelCommandType} from '/chromevox/common/panel_command.js'; import {JaPhoneticMap} from '/chromevox/third_party/tamachiyomi/ja_phonetic_map.js'; import {CursorRange} from '/common/cursors/range.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js index 5b0de8f..b2d37b1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js
@@ -9,6 +9,7 @@ import {BrailleTranslatorManager} from '/chromevox/background/braille/braille_translator_manager.js'; import {ExpandingBrailleTranslator} from '/chromevox/background/braille/expanding_braille_translator.js'; import {PanStrategy} from '/chromevox/background/braille/pan_strategy.js'; +import {ValueSpan} from '/chromevox/background/braille/spans.js'; export class BrailleDisplayManager { /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js index 98f70fcb..c9b660a7 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
@@ -9,6 +9,7 @@ */ import {BrailleTranslatorManager} from '/chromevox/background/braille/braille_translator_manager.js'; import {ExpandingBrailleTranslator} from '/chromevox/background/braille/expanding_braille_translator.js'; +import {ExtraCellsSpan, ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js'; import {EventGenerator} from '/common/event_generator.js'; export class BrailleInputHandler {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js index 9f52e22..2722fd3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js
@@ -440,6 +440,9 @@ await importModule( 'ExpandingBrailleTranslator', '/chromevox/background/braille/expanding_braille_translator.js'); + await importModule( + ['ExtraCellsSpan', 'ValueSelectionSpan', 'ValueSpan'], + '/chromevox/background/braille/spans.js'); chrome.runtime.onConnectExternal = new FakeChromeEvent(); this.port = new FakePort();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js index a02e7d53..1018262 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
@@ -6,6 +6,7 @@ * @fileoverview Translates text to braille, optionally with some parts * uncontracted. */ +import {BrailleTextStyleSpan, ExtraCellsSpan, ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js'; /** * A wrapper around one or two braille translators that uses contracted
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js index 05bdf6a4..3ad9bcb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
@@ -15,6 +15,9 @@ await importModule( 'ExpandingBrailleTranslator', '/chromevox/background/braille/expanding_braille_translator.js'); + await importModule( + ['ExtraCellsSpan', 'ValueSelectionSpan', 'ValueSpan'], + '/chromevox/background/braille/spans.js'); } }; @@ -24,7 +27,6 @@ '../../testing/fake_dom.js', '../../common/spannable.js', 'liblouis.js', - 'spans.js', ]; /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js index bda84b7..51aa8c8e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
@@ -7,16 +7,8 @@ * and selections. */ -goog.provide('BrailleTextStyleSpan'); -goog.provide('ExtraCellsSpan'); -goog.provide('ValueSelectionSpan'); -goog.provide('ValueSpan'); - -goog.require('LibLouis.FormType'); -goog.require('Spannable'); - /** Attached to the value region of a braille spannable. */ -ValueSpan = class { +export class ValueSpan { /** @param {number} offset The offset of the span into the value. */ constructor(offset) { /** @@ -42,7 +34,7 @@ toJson() { return this; } -}; +} Spannable.registerSerializableSpan( @@ -50,7 +42,7 @@ /** Attached to the selected text within a value. */ -ValueSelectionSpan = class {}; +export class ValueSelectionSpan {} Spannable.registerStatelessSerializableSpan( @@ -62,19 +54,19 @@ * This is supported by the {@code ExpandingBrailleTranslator} * class. */ -ExtraCellsSpan = class { +export class ExtraCellsSpan { constructor() { /** @type {ArrayBuffer} */ this.cells = new Uint8Array(0).buffer; } -}; +} /** Indicates a text form during translation in Liblouis. */ -BrailleTextStyleSpan = class { +export class BrailleTextStyleSpan { /** @param {LibLouis.FormType} formType */ constructor(formType) { /** @type {LibLouis.FormType} */ this.formType = formType; } -}; +}
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 fcb16c3..6754bc87 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -17,6 +17,7 @@ import {EventSourceState} from '/chromevox/background/event_source.js'; import {GestureInterface} from '/chromevox/background/gesture_interface.js'; import {Output} from '/chromevox/background/output/output.js'; +import {PhoneticData} from '/chromevox/background/phonetic_data.js'; import {ChromeVoxPrefs} from '/chromevox/background/prefs.js'; import {SmartStickyMode} from '/chromevox/background/smart_sticky_mode.js'; import {AbstractTts} from '/chromevox/common/abstract_tts.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 b4cedb7..deadfea 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
@@ -7,6 +7,7 @@ * appropriate spoken and braille feedback. */ import {BrailleBackground} from '/chromevox/background/braille/braille_background.js'; +import {BrailleTextStyleSpan, ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js'; import {ChromeVoxState, ChromeVoxStateObserver} from '/chromevox/background/chromevox_state.js'; import {Color} from '/chromevox/background/color.js'; import {EditableLine} from '/chromevox/background/editing/editable_line.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js index c647c371..110d90c 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -16,12 +16,11 @@ goog.require('BrailleKeyEvent'); goog.require('BridgeHelper'); goog.require('ChromeVox'); -goog.require('ExtraCellsSpan'); goog.require('FocusBounds'); +goog.require('JaPhoneticData'); goog.require('KeyCode'); goog.require('LibLouis'); goog.require('LibLouis.FormType'); -goog.require('LocaleOutputHelper'); goog.require('LogStore'); goog.require('LogType'); goog.require('Msgs'); @@ -37,7 +36,6 @@ goog.require('PanelBridge'); goog.require('PanelNodeMenuData'); goog.require('PanelTabMenuItemData'); -goog.require('PhoneticData'); goog.require('QueueMode'); goog.require('Spannable'); goog.require('SpeechLog'); @@ -47,8 +45,6 @@ goog.require('TreePathRecoveryStrategy'); goog.require('TtsCategory'); goog.require('TtsInterface'); -goog.require('ValueSelectionSpan'); -goog.require('ValueSpan'); goog.require('constants'); goog.require('cursors.Cursor');
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 06ee563a..915a966 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -5,12 +5,15 @@ /** * @fileoverview Provides output services for ChromeVox. */ +import {ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js'; import {EventSourceState} from '/chromevox/background/event_source.js'; import {OutputAncestryInfo} from '/chromevox/background/output/output_ancestry_info.js'; import {OutputFormatParser, OutputFormatParserObserver} from '/chromevox/background/output/output_format_parser.js'; import {OutputFormatTree} from '/chromevox/background/output/output_format_tree.js'; import {OutputRulesStr} from '/chromevox/background/output/output_logger.js'; +import {PhoneticData} from '/chromevox/background/phonetic_data.js'; import {EventSourceType} from '/chromevox/common/event_source_type.js'; +import {LocaleOutputHelper} from '/chromevox/common/locale_output_helper.js'; import {CursorRange} from '/common/cursors/range.js'; const AriaCurrentState = chrome.automation.AriaCurrentState;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js index e3e4bfb..dae8f7a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js
@@ -5,14 +5,9 @@ /** * @fileoverview Provides phonetic disambiguation functionality across multiple * languages for ChromeVox. - * */ -goog.provide('PhoneticData'); - -goog.require('JaPhoneticData'); - -PhoneticData = class { +export class PhoneticData { /** * Returns the phonetic disambiguation for |char| in |locale|. * Returns empty string if disambiguation can't be found. @@ -67,4 +62,4 @@ } return result.join(', '); } -}; +}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js index 5b3d5ca..bbfb63a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js
@@ -9,8 +9,11 @@ */ ChromeVoxPhoneticDataTest = class extends AccessibilityTestBase { /** @override */ - setUp() { - super.setUp(); + async setUpDeferred() { + await super.setUpDeferred(); + await importModule( + 'PhoneticData', '/chromevox/background/phonetic_data.js'); + JaPhoneticData.init(JA_TEST_MAP); } }; @@ -19,7 +22,6 @@ ChromeVoxPhoneticDataTest.prototype.extraLibraries = [ '../../common/testing/assert_additions.js', '../testing/fake_dom.js', - 'phonetic_data.js', '../third_party/tamachiyomi/ja_phonetic_data.js', ];
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js index c2fa8297..179692a1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js
@@ -7,6 +7,7 @@ * extension API. */ +import {PhoneticData} from '/chromevox/background/phonetic_data.js'; import {AbstractTts} from '/chromevox/common/abstract_tts.js'; import {PanelCommand, PanelCommandType} from '/chromevox/common/panel_command.js'; import {ChromeTtsBase} from '/chromevox/common/tts_base.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 c639d3f..44c6dd9 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
@@ -10,9 +10,7 @@ * https://en.wikipedia.org/wiki/Locale_(computer_software) */ -goog.provide('LocaleOutputHelper'); - -LocaleOutputHelper = class { +export class LocaleOutputHelper { /** @private */ constructor() { /** @@ -183,7 +181,7 @@ return chrome.accessibilityPrivate.getDisplayNameForLocale( locale, locale) !== ''; } -}; +} /** @type {LocaleOutputHelper} */ LocaleOutputHelper.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js index 56ee11c..82b1cd9f9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js
@@ -30,8 +30,12 @@ } /** @override */ - setUp() { - super.setUp(); + async setUpDeferred() { + await super.setUpDeferred(); + + await importModule( + 'LocaleOutputHelper', '/chromevox/common/locale_output_helper.js'); + // Mock this api to return a predefined set of voices. chrome.tts.getVoices = function(callback) { callback([
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 b640f2a..53fb809 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
@@ -10,14 +10,12 @@ goog.require('BluetoothBrailleDisplayListener'); goog.require('BluetoothBrailleDisplayManager'); goog.require('ChromeVox'); -goog.require('ExtraCellsSpan'); goog.require('LibLouis'); +goog.require('LibLouis.FormType'); goog.require('Msgs'); goog.require('Spannable'); goog.require('SpeechLog'); goog.require('TtsInterface'); -goog.require('ValueSelectionSpan'); -goog.require('ValueSpan'); goog.require('constants'); goog.require('goog.i18n.MessageFormat');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js index d7e7c0ed..36408319 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js
@@ -11,6 +11,7 @@ import {GestureCommandData} from '/chromevox/common/gesture_command_data.js'; import {KeyMap} from '/chromevox/common/key_map.js'; import {KeyUtil} from '/chromevox/common/key_util.js'; +import {LocaleOutputHelper} from '/chromevox/common/locale_output_helper.js'; import {PanelCommand, PanelCommandType} from '/chromevox/common/panel_command.js'; import {ISearchUI} from '/chromevox/panel/i_search_ui.js'; import {PanelInterface} from '/chromevox/panel/panel_interface.js';
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 405b20d..9190f48 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
@@ -13,7 +13,6 @@ goog.require('EarconDescription'); goog.require('FocusBounds'); goog.require('KeyCode'); -goog.require('LocaleOutputHelper'); goog.require('LogStore'); goog.require('Msgs'); goog.require('NavBraille'); @@ -31,8 +30,6 @@ goog.require('Spannable'); goog.require('TextLog'); goog.require('TtsCategory'); -goog.require('ValueSelectionSpan'); -goog.require('ValueSpan'); goog.require('constants'); goog.require('cursors.Cursor');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js index f3dabad..ca5f5d71 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
@@ -18,6 +18,8 @@ 'CommandHandlerInterface', '/chromevox/background/command_handler_interface.js'); await importModule( + 'LocaleOutputHelper', '/chromevox/common/locale_output_helper.js'); + await importModule( ['PanelCommand', 'PanelCommandType'], '/chromevox/common/panel_command.js'); await importModule('CursorRange', '/common/cursors/range.js');
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html index 3575179b..15b5939 100644 --- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html +++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html
@@ -131,10 +131,6 @@ border-bottom-color: var(--scrollable-border-color); } - #contentArea { - scroll-behavior: smooth; - } - iron-collapse { --iron-collapse-transition-duration: 300ms; }
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts index b4106e9..5dbc1d2d 100644 --- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts +++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts
@@ -131,10 +131,7 @@ // ...and scroll the content area up to make the section content // visible. const rect = this.$.expandSection.getBoundingClientRect(); - // If the section is expanding, scroll the content area so the learn - // more section is at the top. If the section is collapsing, scroll - // the content area to the top. - this.$.contentArea.scrollTo({top: newVal ? rect.top : 0}); + this.$.contentArea.scrollTo({top: rect.top, behavior: 'smooth'}); }, duration * 0.7); } } @@ -142,29 +139,6 @@ private promptActionOccurred(action: PrivacySandboxPromptAction) { PrivacySandboxDialogBrowserProxy.getInstance().promptActionOccurred(action); } - - // Methods to be used only for testing, in WebUI or native browser tests. - public waitForScrollToEndForTesting() { - return new Promise(resolve => { - let timer: ReturnType<typeof setTimeout>|null = null; - this.$.contentArea.addEventListener('scroll', _ => { - if (timer !== null) { - clearTimeout(timer); - } - timer = setTimeout(resolve, 150); - }); - }); - } - - public async expandLearnMoreSectionForTesting() { - this.expanded_ = true; - const collapseElement: HTMLElement|null = - this.$.expandSection.querySelector('iron-collapse'); - collapseElement!.style.setProperty( - '--iron-collapse-transition-duration', '0ms'); - this.$.contentArea.style.setProperty('scroll-behavior', 'auto'); - await this.waitForScrollToEndForTesting(); - } } declare global {
diff --git a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts index 0327cc6..42d7f35 100644 --- a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
@@ -33,11 +33,13 @@ import {PasswordRequestorMixin} from './password_requestor_mixin.js'; export type SavedPasswordEditedEvent = - CustomEvent<chrome.passwordsPrivate.ChangeSavedPasswordParams>; + CustomEvent<chrome.passwordsPrivate.CredentialIds>; + +const SAVED_PASSWORD_EDITED_EVENT_NAME = 'saved-password-edited'; declare global { interface HTMLElementEventMap { - 'saved-password-edited': SavedPasswordEditedEvent; + [SAVED_PASSWORD_EDITED_EVENT_NAME]: SavedPasswordEditedEvent; } } @@ -524,20 +526,22 @@ PasswordManagerImpl.getInstance() .changeSavedPassword(idsToChange, params) - .finally(() => { + .then(newIds => { if (this.isPasswordViewPageEnabled_) { - this.dispatchChangePasswordEvent_(params); + this.dispatchChangePasswordEvent_(newIds); } + }) + .finally(() => { this.close(); }); } private dispatchChangePasswordEvent_( - params: chrome.passwordsPrivate.ChangeSavedPasswordParams) { - this.dispatchEvent(new CustomEvent('saved-password-edited', { + newIds: chrome.passwordsPrivate.CredentialIds) { + this.dispatchEvent(new CustomEvent(SAVED_PASSWORD_EDITED_EVENT_NAME, { bubbles: true, composed: true, - detail: params, + detail: newIds, })); }
diff --git a/chrome/browser/resources/settings/autofill_page/password_list_item.ts b/chrome/browser/resources/settings/autofill_page/password_list_item.ts index 0e95bf8af..9337096 100644 --- a/chrome/browser/resources/settings/autofill_page/password_list_item.ts +++ b/chrome/browser/resources/settings/autofill_page/password_list_item.ts
@@ -109,19 +109,14 @@ return; } const params = new URLSearchParams(); - params.set(PasswordViewPageUrlParams.SITE, this.entry.urls.shown); - params.set(PasswordViewPageUrlParams.USERNAME, this.entry.username); - // For sync'ing and signed-out users, there is strictly only one password - // store, and hence no need to specify store information. - // For account store users, a credential can exist in one or both of the - // device and account stores, in which case, store information is required. - // For consistency with the sync'ing and signed-out case, store information - // isn't provided when the credentials exist only in the device store. - if (this.entry.isPresentInAccount()) { - params.set(PasswordViewPageUrlParams.IN_ACCOUNT, 'true'); - if (this.entry.isPresentOnDevice()) { - params.set(PasswordViewPageUrlParams.ON_DEVICE, 'true'); - } + if (this.entry.deviceId !== null) { + params.set( + PasswordViewPageUrlParams.DEVICE_ID, this.entry.deviceId.toString()); + } + if (this.entry.accountId !== null) { + params.set( + PasswordViewPageUrlParams.ACCOUNT_ID, + this.entry.accountId.toString()); } recordPasswordViewInteraction( PasswordViewPageInteractions.CREDENTIAL_ROW_CLICKED);
diff --git a/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts b/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts index 4129510..f5c20fd4 100644 --- a/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts +++ b/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts
@@ -77,11 +77,13 @@ /** * Changes the saved password corresponding to |ids|. * @param ids The ids for the password entry being updated. - * @return A promise that resolves when the password is updated for all ids. + * @return A promise that resolves with the new IDs when the password is + * updated for all ids. */ changeSavedPassword( - ids: number[], - params: chrome.passwordsPrivate.ChangeSavedPasswordParams): Promise<void>; + ids: Array<number>, + params: chrome.passwordsPrivate.ChangeSavedPasswordParams): + Promise<chrome.passwordsPrivate.CredentialIds>; /** * Should remove the saved password and notify that the list has changed. @@ -207,6 +209,13 @@ optInForAccountStorage(optIn: boolean): void; /** + * Refreshes the cache for automatic password change scripts if the cache is + * stale. + * @return A promise that resolves when the cache is fresh. + */ + refreshScriptsIfNecessary(): Promise<void>; + + /** * Requests the start of the bulk password check. */ startBulkPasswordCheck(): Promise<void>; @@ -417,8 +426,11 @@ changeSavedPassword( ids: number[], params: chrome.passwordsPrivate.ChangeSavedPasswordParams) { - return new Promise<void>(resolve => { - chrome.passwordsPrivate.changeSavedPassword(ids, params, resolve); + return new Promise<chrome.passwordsPrivate.CredentialIds>(resolve => { + chrome.passwordsPrivate.changeSavedPassword( + ids, params, (newIds: chrome.passwordsPrivate.CredentialIds) => { + resolve(newIds); + }); }); } @@ -550,6 +562,12 @@ chrome.passwordsPrivate.optInForAccountStorage(optIn); } + refreshScriptsIfNecessary() { + return new Promise<void>(resolve => { + chrome.passwordsPrivate.refreshScriptsIfNecessary(resolve); + }); + } + startBulkPasswordCheck() { return new Promise<void>((resolve, reject) => { chrome.passwordsPrivate.startPasswordCheck(() => {
diff --git a/chrome/browser/resources/settings/autofill_page/password_view.ts b/chrome/browser/resources/settings/autofill_page/password_view.ts index 50592e8..fb1e0dc 100644 --- a/chrome/browser/resources/settings/autofill_page/password_view.ts +++ b/chrome/browser/resources/settings/autofill_page/password_view.ts
@@ -63,10 +63,8 @@ } export enum PasswordViewPageUrlParams { - SITE = 'site', - USERNAME = 'username', - IN_ACCOUNT = 'inAccount', - ON_DEVICE = 'onDevice', + ACCOUNT_ID = 'accountId', + DEVICE_ID = 'deviceId', } export function recordPasswordViewInteraction( @@ -107,6 +105,8 @@ static get properties() { return { + accountId_: Number, + activeDialogAnchorStack_: { type: Array, value: () => [], @@ -123,6 +123,8 @@ notify: true, }, + deviceId_: Number, + isPasswordNotesEnabled_: { type: Boolean, value() { @@ -130,20 +132,21 @@ }, }, - inAccount_: Boolean, - isPasswordVisible_: { type: Boolean, value: false, }, - onDevice_: Boolean, - password_: { type: String, value: '', }, + showEditDialog_: { + type: Boolean, + value: false, + }, + // <if expr="chromeos_ash or chromeos_lacros"> showPasswordPromptDialog_: Boolean, // </if> @@ -154,40 +157,32 @@ */ recentlyEdited_: Boolean, - site: { - type: String, - value: '', - }, - - username: { - type: String, - value: '', - }, }; } static get observers() { return [ - 'savedPasswordsChanged_(savedPasswords.splices, site, username, ' + - 'inAccount_, onDevice_)' + 'savedPasswordsChanged_(savedPasswords.splices, accountId_, deviceId_)' ]; } - private activeDialogAnchorStack_: HTMLElement[]; + /** + * Valid values for accountId_ and deviceId_ are null or number. They are set + * to undefined for early return in the observer. + */ + private accountId_: number|null|undefined; + private deviceId_: number|null|undefined; + private activeDialogAnchorStack_: Array<HTMLElement>; private toastText_: string; credential: MultiStorePasswordUiEntry|null; - private inAccount_: boolean|undefined; private isPasswordNotesEnabled_: boolean; private isPasswordVisible_: boolean; - private onDevice_: boolean|undefined; private password_: string; private recentlyEdited_: boolean; // <if expr="chromeos_ash or chromeos_lacros"> private showPasswordPromptDialog_: boolean; // </if> private showEditDialog_: boolean; - site: string; - username: string; // <if expr="chromeos_ash or chromeos_lacros"> override connectedCallback() { @@ -208,10 +203,8 @@ override currentRouteChanged(route: Route): void { if (route !== routes.PASSWORD_VIEW) { - this.site = ''; - this.username = ''; - this.inAccount_ = undefined; - this.onDevice_ = undefined; + this.accountId_ = undefined; + this.deviceId_ = undefined; this.recentlyEdited_ = false; this.password_ = ''; this.credential = null; @@ -220,29 +213,16 @@ } const queryParameters = Router.getInstance().getQueryParameters(); - const site = queryParameters.get(PasswordViewPageUrlParams.SITE); - if (!site) { - return; - } - - this.username = - queryParameters.get(PasswordViewPageUrlParams.USERNAME) || ''; - this.site = site; - - // inAccount | onDevice - // ----------+--------- - // true | -/false : look for the credential stored in account - // -/false | true : look for the credential stored on device - // true | true : look for the credential stored in both - // -/false | -/false : look for the credential stored on device - if (!queryParameters.has(PasswordViewPageUrlParams.IN_ACCOUNT)) { - this.onDevice_ = true; - this.inAccount_ = false; - return; - } - - this.onDevice_ = queryParameters.has(PasswordViewPageUrlParams.ON_DEVICE); - this.inAccount_ = queryParameters.has(PasswordViewPageUrlParams.IN_ACCOUNT); + const convertToNullOrNumber = (input: string|null) => { + if (!input || Number.isNaN(Number(input))) { + return null; + } + return Number(input); + }; + this.accountId_ = convertToNullOrNumber( + queryParameters.get(PasswordViewPageUrlParams.ACCOUNT_ID)); + this.deviceId_ = convertToNullOrNumber( + queryParameters.get(PasswordViewPageUrlParams.DEVICE_ID)); } override onPasswordRemoveDialogPasswordsRemoved( @@ -355,21 +335,19 @@ private onSavedPasswordEdited_(event: SavedPasswordEditedEvent) { this.recentlyEdited_ = true; - - const newUsername = event.detail.username; - if (event.detail.username !== this.credential!.username || - event.detail.password !== this.credential!.password || - event.detail.note !== this.credential!.note) { - recordPasswordViewInteraction( - PasswordViewPageInteractions.CREDENTIAL_EDITED); - } - if (this.credential!.username === newUsername) { - return; - } - // The dialog is recently closed. If the username has changed, reroute the - // page to the new credential. + // The dialog is recently closed. Use the new IDs to update the URL. const newParams = Router.getInstance().getQueryParameters(); - newParams.set(PasswordViewPageUrlParams.USERNAME, newUsername); + + if (event.detail.accountId !== undefined) { + newParams.set( + PasswordViewPageUrlParams.ACCOUNT_ID, + event.detail.accountId.toString()); + } + if (event.detail.deviceId !== undefined) { + newParams.set( + PasswordViewPageUrlParams.DEVICE_ID, + event.detail.deviceId.toString()); + } Router.getInstance().updateRouteParams(newParams); } @@ -447,15 +425,13 @@ this.isPasswordVisible_ = false; // When an observed property changes, the observer will be called. Make sure // that all properties are set. - if (!this.savedPasswords.length || - !(!!this.site && this.inAccount_ !== undefined && - this.onDevice_ !== undefined)) { + if (!this.savedPasswords.length || this.accountId_ === undefined || + this.deviceId_ === undefined) { return; } const item = this.savedPasswords.find((item: MultiStorePasswordUiEntry) => { - return item.urls.shown === this.site && item.username === this.username && - item.isPresentInAccount() === this.inAccount_ && - item.isPresentOnDevice() === this.onDevice_; + return item.accountId === this.accountId_ && + item.deviceId === this.deviceId_; }); if (!item) {
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_section.ts index ad9d3e1..cb513f6 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_section.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_section.ts
@@ -36,31 +36,31 @@ import {CrLinkRowElement} from 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js'; import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; -import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; +import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js'; import {getDeepActiveElement} from 'chrome://resources/js/util.m.js'; -import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; +import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/js/web_ui_listener_mixin.js'; import {DomRepeat, DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {GlobalScrollTargetMixin} from '../global_scroll_target_mixin.js'; +import {GlobalScrollTargetMixin, GlobalScrollTargetMixinInterface} from '../global_scroll_target_mixin.js'; import {HatsBrowserProxyImpl, TrustSafetyInteraction} from '../hats_browser_proxy.js'; import {loadTimeData} from '../i18n_setup.js'; import {OpenWindowProxyImpl} from '../open_window_proxy.js'; import {StoredAccount, SyncBrowserProxyImpl, SyncPrefs, SyncStatus, TrustedVaultBannerState} from '../people_page/sync_browser_proxy.js'; -import {PrefsMixin} from '../prefs/prefs_mixin.js'; +import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js'; import {routes} from '../route.js'; -import {Route, Router} from '../router.js'; +import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; // <if expr="chromeos_ash or chromeos_lacros"> import {BlockingRequestManager} from './blocking_request_manager.js'; // </if> -import {MergeExceptionsStoreCopiesMixin} from './merge_exceptions_store_copies_mixin.js'; -import {MergePasswordsStoreCopiesMixin} from './merge_passwords_store_copies_mixin.js'; +import {MergeExceptionsStoreCopiesMixin, MergeExceptionsStoreCopiesMixinInterface} from './merge_exceptions_store_copies_mixin.js'; +import {MergePasswordsStoreCopiesMixin, MergePasswordsStoreCopiesMixinInterface} from './merge_passwords_store_copies_mixin.js'; import {MultiStoreExceptionEntry} from './multi_store_exception_entry.js'; import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; -import {PasswordCheckMixin} from './password_check_mixin.js'; +import {PasswordCheckMixin, PasswordCheckMixinInterface} from './password_check_mixin.js'; import {AddCredentialFromSettingsUserInteractions, PasswordEditDialogElement} from './password_edit_dialog.js'; import {PasswordCheckReferrer, PasswordExceptionListChangedListener, PasswordManagerImpl, PasswordManagerProxy} from './password_manager_proxy.js'; -import {PasswordRequestorMixin} from './password_requestor_mixin.js'; +import {PasswordRequestorMixin, PasswordRequestorMixinInterface} from './password_requestor_mixin.js'; import {PasswordsListHandlerElement} from './passwords_list_handler.js'; import {getTemplate} from './passwords_section.html.js'; @@ -109,10 +109,18 @@ }; } -const PasswordsSectionElementBase = MergePasswordsStoreCopiesMixin( - PasswordRequestorMixin(PrefsMixin(GlobalScrollTargetMixin( - MergeExceptionsStoreCopiesMixin(WebUIListenerMixin( - I18nMixin(PasswordCheckMixin(PolymerElement)))))))); +const PasswordsSectionElementBase = + MergePasswordsStoreCopiesMixin(PasswordRequestorMixin( + PrefsMixin(GlobalScrollTargetMixin(RouteObserverMixin( + MergeExceptionsStoreCopiesMixin(WebUIListenerMixin( + I18nMixin(PasswordCheckMixin(PolymerElement))))))))) as { + new (): PolymerElement & PasswordCheckMixinInterface & + I18nMixinInterface & WebUIListenerMixinInterface & + MergeExceptionsStoreCopiesMixinInterface & + RouteObserverMixinInterface & GlobalScrollTargetMixinInterface & + PrefsMixinInterface & PasswordRequestorMixinInterface & + MergePasswordsStoreCopiesMixinInterface, + }; export class PasswordsSectionElement extends PasswordsSectionElementBase { static get is() { @@ -245,6 +253,14 @@ 'eligibleForAccountStorage_)', }, + isAutomaticPasswordChangeEnabled_: { + type: Boolean, + value() { + return loadTimeData.getBoolean( + 'enableAutomaticPasswordChangeInSettings'); + } + }, + isPasswordViewPageEnabled_: { type: Boolean, value() { @@ -317,6 +333,7 @@ private hasPasswordExceptions_: boolean; private shouldShowBanner_: boolean; private isAccountStoreUser_: boolean; + private isAutomaticPasswordChangeEnabled_: boolean; private isPasswordViewPageEnabled_: boolean; private isUnifiedPasswordManagerEnabled_: boolean; private shouldShowDevicePasswordsLink_: boolean; @@ -449,6 +466,16 @@ this.setIsOptedInForAccountStorageListener_ = null; } + override currentRouteChanged(route: Route): void { + super.currentRouteChanged(route); + + // If password change scripts are enabled, the scripts cache should be + // refreshed to minimize any UI modifications on the password check page. + if (route === routes.PASSWORDS && this.isAutomaticPasswordChangeEnabled_) { + this.passwordManager_.refreshScriptsIfNecessary(); + } + } + private computeShowAddPasswordButton_(): boolean { // Don't show add button if password manager is disabled by policy. return !(
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index 2df2b3ec..ff61bdf 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -14,6 +14,7 @@ assert(is_chromeos_ash) +# root_gen_dir is "gen" # target_gen_dir is "gen/chrome/browser/resources/settings/chromeos" preprocessed_folder = "preprocessed" @@ -135,13 +136,17 @@ # Preprocess all WebUI mojom files, which are bundled in optimized builds. preprocess_if_expr("preprocess_mojo_webui") { - deps = [ ":generate_settings_mojo_webui" ] + deps = [ + ":generate_personalization_search_mojo_webui", + ":generate_settings_mojo_webui", + ] in_folder = "$target_gen_dir" out_folder = "$target_gen_dir/$preprocessed_folder" out_manifest = "$target_gen_dir/$mojo_webui_manifest" in_files = [ "mojom-webui/routes.mojom-webui.js", "mojom-webui/setting.mojom-webui.js", + "mojom-webui/personalization/search.mojom-webui.js", ] } @@ -155,6 +160,13 @@ outputs = [ "$target_gen_dir/mojom-webui/{{source_file_part}}" ] } +copy("generate_personalization_search_mojo_webui") { + deps = [ "//ash/webui/personalization_app/search:mojo_bindings_webui_js" ] + sources = [ "$root_gen_dir/mojom-webui/ash/webui/personalization_app/search/search.mojom-webui.js" ] + outputs = + [ "$target_gen_dir/mojom-webui/personalization/{{source_file_part}}" ] +} + # Mojo files generated by non-OS-settings targets, not bundled. preprocess_if_expr("preprocess_external_mojo") { deps = [ @@ -887,6 +899,7 @@ deps = [ ":personalization_search_handler", ":settings_search_handler", + "//ash/webui/personalization_app/search:mojo_bindings_webui_js", "//mojo/public/mojom/base:base_webui_js", ] }
diff --git a/chrome/browser/resources/settings/chromeos/combined_search_handler.js b/chrome/browser/resources/settings/chromeos/combined_search_handler.js index ea0177ec..717ad34c 100644 --- a/chrome/browser/resources/settings/chromeos/combined_search_handler.js +++ b/chrome/browser/resources/settings/chromeos/combined_search_handler.js
@@ -5,12 +5,13 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js'; +import {SearchResult as PersonalizationSearchResult} from '../mojom-webui/personalization/search.mojom-webui.js'; + import {getPersonalizationSearchHandler} from './personalization_search_handler.js'; import {getSettingsSearchHandler} from './settings_search_handler.js'; /** - * @typedef {chromeos.settings.mojom.SearchResult| - * ash.personalizationApp.mojom.SearchResult} + * @typedef {chromeos.settings.mojom.SearchResult|PersonalizationSearchResult} */ export let SearchResult;
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index 00db6c82..e4ef917 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -21,6 +21,10 @@ "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/settings/chromeos/constants", root_build_dir), "browser_resolver_prefix_replacements=\"../mojom-webui/=../\"", + "js_module_root=" + rebase_path( + "$root_gen_dir/mojom-webui/ash/webui/personalization_app/search", + root_build_dir), + "browser_resolver_prefix_replacements=\"../mojom-webui/personalization/=../\"", ] # TODO(crbug.com/1315757) Remove once ChromeOS Settings is fully migrated to
diff --git a/chrome/browser/resources/side_panel/read_anything/app.html b/chrome/browser/resources/side_panel/read_anything/app.html index 6f0c8a6..0a17ab22 100644 --- a/chrome/browser/resources/side_panel/read_anything/app.html +++ b/chrome/browser/resources/side_panel/read_anything/app.html
@@ -25,4 +25,5 @@ font-family: Calibri, 'Times New Roman', serif; } </style> -<div id="container" class$="[[fontName_]]"></div> +<div id="container" class$="[[fontName_]]" style$="font-size:[[fontSize_]]px;"> +</div>
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts index 5b42728..d06f4263 100644 --- a/chrome/browser/resources/side_panel/read_anything/app.ts +++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -32,6 +32,12 @@ assert(readAnythingApp); readAnythingApp.updateContent(); }; + + chrome.readAnything.updateFontSize = function() { + const readAnythingApp = document.querySelector('read-anything-app'); + assert(readAnythingApp); + readAnythingApp.updateFontSize(); + }; } export class ReadAnythingElement extends ReadAnythingElementBase { @@ -52,6 +58,7 @@ } private fontName_: string; + private fontSize_: number; // Defines the valid font names that can be passed to front-end and maps // them to a corresponding class style in app.html. Must stay in-sync with @@ -172,6 +179,10 @@ this.fontName_ = validFontName ? validFontName.cssClass : this.defaultFontName; } + + updateFontSize() { + this.fontSize_ = chrome.readAnything.fontSize; + } } declare global {
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts index b6439d5..49a1f7f 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts +++ b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
@@ -17,6 +17,8 @@ // A font name, defined in ReadAnythingFontModel. let fontName: string; + let fontSize: number; + // Returns a list of AXNodeIDs corresponding to the unignored children of // the AXNode for the provided AXNodeID. function getChildren(nodeId: number): number[]; @@ -81,5 +83,9 @@ // Ping that the font name has been changed in the ReadAnythingToolbar and // is available to consume. function updateFontName(): void; + + // Ping that the font size has been changed for the distilled contents and + // is available to consume. + function updateFontSize(): void; } }
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html index 693b1280..0f3f359 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html +++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html
@@ -143,6 +143,11 @@ padding-top: 50px; } + button[disabled] { + cursor: auto; + pointer-events: none; + } + @media (prefers-color-scheme: dark) { :host { --account-button-hover-color: var(--google-grey-800); @@ -179,7 +184,7 @@ <h3>$i18n{accountSelectionLacrosSubtitle}</h3> </div> <button id="other-account-button" class="account-button" - on-click="onOtherAccountClick_"> + on-click="onOtherAccountClick_" disabled="[[accountSelected_]]"> <div class="account-avatar"> <iron-icon icon="profiles:account-circle" id="otherAccountIcon"> </iron-icon> @@ -192,7 +197,8 @@ </button> <div id="buttonsContainer"> <template is="dom-repeat" items="[[availableAccounts_]]"> - <button class="account-button" on-click="onAccountClick_"> + <button class="account-button" on-click="onAccountClick_" + disabled="[[accountSelected_]]"> <img class="account-avatar" src="[[item.accountImageUrl]]"> <div class="account-text"> <div class="account-name">[[item.name]]</div>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts index c527e3f..a6a9678f 100644 --- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts +++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import './profile_creation_shared.css.js'; @@ -51,6 +50,11 @@ type: Boolean, value: () => hasPreviousRoute(), }, + + accountSelected_: { + type: Boolean, + value: false, + }, }; } @@ -59,6 +63,7 @@ profileThemeInfo: AutogeneratedThemeColorInfo; private availableAccounts_: AvailableAccount[]; + private accountSelected_: Boolean; override connectedCallback() { super.connectedCallback(); @@ -105,6 +110,7 @@ } private onAccountClick_(e: DomRepeatEvent<AvailableAccount>) { + this.accountSelected_ = true; const gaiaId = e.model.item.gaiaId; this.manageProfilesBrowserProxy_.selectAccountLacros( this.profileThemeInfo.color, gaiaId);
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn index e7637a8..9d43a724 100644 --- a/chrome/browser/safe_browsing/BUILD.gn +++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -26,6 +26,7 @@ "//chrome/common", "//chrome/common:constants", "//components/browser_sync", + "//components/enterprise:enterprise", "//components/enterprise/common:strings", "//components/keyed_service/content", "//components/language/core/browser",
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc index 898811c..b896d41 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
@@ -3,16 +3,17 @@ // found in the LICENSE file. #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h" + #include "base/base64.h" #include "base/command_line.h" #include "base/metrics/histogram_functions.h" #include "base/rand_util.h" #include "chrome/browser/enterprise/util/affiliation.h" - #include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/advanced_protection_status_manager.h" #include "chrome/browser/safe_browsing/advanced_protection_status_manager_factory.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "components/enterprise/browser/controller/browser_dm_token_storage.h" #include "components/safe_browsing/content/browser/web_ui/safe_browsing_ui.h" #include "components/safe_browsing/core/common/features.h" #include "content/public/browser/browser_task_traits.h" @@ -140,6 +141,22 @@ } } +bool CanUseAccessToken(const BinaryUploadService::Request& request, + Profile* profile) { + DCHECK(profile); + // Consumer requests never need to use the access token. + if (IsConsumerScanRequest(request)) + return false; + + // Allow the access token to be used on unmanaged devices, but not on + // managed devices that aren't affiliated. +#if !BUILDFLAG(IS_CHROMEOS) + if (!policy::BrowserDMTokenStorage::Get()->RetrieveDMToken().is_valid()) + return true; +#endif + return chrome::enterprise_util::IsProfileAffiliated(profile); +} + } // namespace // static @@ -313,7 +330,7 @@ request->set_fcm_token(instance_id); if (base::FeatureList::IsEnabled(kConnectorsScanningAccessToken) && - chrome::enterprise_util::IsProfileAffiliated(profile_)) { + CanUseAccessToken(*request, profile_)) { if (!token_fetcher_) { token_fetcher_ = std::make_unique<SafeBrowsingPrimaryAccountTokenFetcher>( IdentityManagerFactory::GetForProfile(profile_)); @@ -332,6 +349,9 @@ void CloudBinaryUploadService::OnGetAccessToken( Request* request, const std::string& access_token) { + if (!IsActive(request)) + return; + request->set_access_token(access_token); request->GetRequestData( base::BindOnce(&CloudBinaryUploadService::OnGetRequestData,
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 7e5c42c..472f2659 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -4791,6 +4791,8 @@ "views/side_panel/feed/feed_side_panel_coordinator.h", "views/side_panel/history_clusters/history_clusters_side_panel_coordinator.cc", "views/side_panel/history_clusters/history_clusters_side_panel_coordinator.h", + "views/side_panel/read_anything/read_anything_button_view.cc", + "views/side_panel/read_anything/read_anything_button_view.h", "views/side_panel/read_anything/read_anything_constants.h", "views/side_panel/read_anything/read_anything_container_view.cc", "views/side_panel/read_anything/read_anything_container_view.h",
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index ce0f1606..64eeec3 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -316,6 +316,10 @@ // maximizable. bool can_maximize = true; + // Aspect ratio parameters specific to TYPE_PICTURE_IN_PICTURE. + float initial_aspect_ratio = 1.0f; + bool lock_aspect_ratio = false; + private: friend class Browser; friend class WindowSizerChromeOSTest;
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc index 50c1db5..3c01acf 100644 --- a/chrome/browser/ui/browser_navigator.cc +++ b/chrome/browser/ui/browser_navigator.cc
@@ -165,14 +165,15 @@ #if !BUILDFLAG(IS_CHROMEOS_LACROS) gfx::Rect CalculateInitialPictureInPictureWindowBounds( float initial_aspect_ratio) { + DCHECK(initial_aspect_ratio > 0); + // TODO(https://crbug.com/1327797): This copies a bunch of logic from // OverlayWindowViews. The sizing logic should be delegated to a PiP-specific // controller. gfx::Rect work_area = display::Screen::GetScreen()->GetDisplayForNewWindows().work_area(); gfx::Rect window_bounds(work_area.width() / 5, work_area.height() / 5); - float aspect_ratio = (initial_aspect_ratio > 0) ? initial_aspect_ratio : 1.0; - gfx::SizeRectToAspectRatio(gfx::ResizeEdge::kTopLeft, aspect_ratio, + gfx::SizeRectToAspectRatio(gfx::ResizeEdge::kTopLeft, initial_aspect_ratio, gfx::Size(0, 0), work_area.size(), &window_bounds); int window_diff_width = work_area.right() - window_bounds.width(); @@ -312,6 +313,11 @@ CalculateInitialPictureInPictureWindowBounds( params.contents_to_insert ->GetPictureInPictureInitialAspectRatio()); + browser_params.initial_aspect_ratio = + params.contents_to_insert + ->GetPictureInPictureInitialAspectRatio(); + browser_params.lock_aspect_ratio = + params.contents_to_insert->GetPictureInPictureLockAspectRatio(); } return {Browser::Create(browser_params), -1};
diff --git a/chrome/browser/ui/browser_navigator_browsertest.cc b/chrome/browser/ui/browser_navigator_browsertest.cc index c82e29e..6324510 100644 --- a/chrome/browser/ui/browser_navigator_browsertest.cc +++ b/chrome/browser/ui/browser_navigator_browsertest.cc
@@ -1896,6 +1896,7 @@ // The WebContents holds the parameters from the PiP request. WebContents::CreateParams web_contents_params(browser()->profile()); web_contents_params.initial_picture_in_picture_aspect_ratio = 0.5; + web_contents_params.lock_picture_in_picture_aspect_ratio = true; // Opening a picture in picture window should create a new browser. NavigateParams params(MakeNavigateParams(browser()));
diff --git a/chrome/browser/ui/tabs/tab_group_model.cc b/chrome/browser/ui/tabs/tab_group_model.cc index 8e3712b..eaadc63 100644 --- a/chrome/browser/ui/tabs/tab_group_model.cc +++ b/chrome/browser/ui/tabs/tab_group_model.cc
@@ -25,6 +25,11 @@ TabGroup* TabGroupModel::AddTabGroup( const tab_groups::TabGroupId& id, absl::optional<tab_groups::TabGroupVisualData> visual_data) { + // The tab group must not already exist - replacing the old group without + // first removing it would invalidate pointers to the old group and could + // easily UAF. + CHECK(!ContainsTabGroup(id)); + auto tab_group = std::make_unique<TabGroup>( controller_, id, visual_data.value_or(
diff --git a/chrome/browser/ui/views/extensions/extension_dialog.cc b/chrome/browser/ui/views/extensions/extension_dialog.cc index 2c60ad2..9a0d42623 100644 --- a/chrome/browser/ui/views/extensions/extension_dialog.cc +++ b/chrome/browser/ui/views/extensions/extension_dialog.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/bind.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_view_host.h" @@ -86,6 +87,12 @@ observer_->ExtensionDialogClosing(this); } +void ExtensionDialog::HandleCloseExtensionHost( + extensions::ExtensionHost* host) { + DCHECK_EQ(host, host_.get()); + GetWidget()->Close(); +} + void ExtensionDialog::OnExtensionHostDidStopFirstLoad( const extensions::ExtensionHost* host) { DCHECK_EQ(host, host_.get()); @@ -97,12 +104,6 @@ MaybeFocusRenderer(); } -void ExtensionDialog::OnExtensionHostShouldClose( - extensions::ExtensionHost* host) { - DCHECK_EQ(host, host_.get()); - GetWidget()->Close(); -} - void ExtensionDialog::OnExtensionProcessTerminated( const extensions::Extension* extension) { if (extension == host_->extension() && observer_) @@ -140,6 +141,11 @@ SetShowTitle(!init_params.title.empty()); SetTitle(init_params.title); + // The base::Unretained() below is safe because this object owns `host_`, so + // the callback will never fire if `this` is deleted. + host_->SetCloseHandler(base::BindOnce( + &ExtensionDialog::HandleCloseExtensionHost, base::Unretained(this))); + extension_view_ = SetContentsView(std::make_unique<ExtensionViewViews>(host_.get()));
diff --git a/chrome/browser/ui/views/extensions/extension_dialog.h b/chrome/browser/ui/views/extensions/extension_dialog.h index 8ec3df1..e33c222 100644 --- a/chrome/browser/ui/views/extensions/extension_dialog.h +++ b/chrome/browser/ui/views/extensions/extension_dialog.h
@@ -99,7 +99,6 @@ // extensions::ExtensionHostObserver: void OnExtensionHostDidStopFirstLoad( const extensions::ExtensionHost* host) override; - void OnExtensionHostShouldClose(extensions::ExtensionHost* host) override; // extensions::ProcessManagerObserver: void OnExtensionProcessTerminated( @@ -120,6 +119,9 @@ void OnWindowClosing(); + // Handles a signal from the `host` to close. + void HandleCloseExtensionHost(extensions::ExtensionHost* host); + // Window Title std::u16string window_title_;
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc index 4202c5e..fb85609 100644 --- a/chrome/browser/ui/views/extensions/extension_popup.cc +++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/views/extensions/extension_popup.h" +#include "base/bind.h" #include "base/memory/raw_ptr.h" #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/extensions/extension_view_host.h" @@ -198,7 +199,6 @@ // try to access the host during Widget closure, destroy it immediately. RemoveChildViewT(extension_view_.get()); - extension_host_observation_.Reset(); // Note: it's important that we unregister the devtools observation *before* // we destroy `host_`. Otherwise, destroying `host_` can synchronously cause // the associated WebContents to be destroyed, which will cause devtools to @@ -243,12 +243,6 @@ show_action_ = PopupShowAction::kShow; } -void ExtensionPopup::OnExtensionHostShouldClose( - extensions::ExtensionHost* host) { - DCHECK_EQ(host, host_.get()); - GetWidget()->Close(); -} - ExtensionPopup::ExtensionPopup( std::unique_ptr<extensions::ExtensionViewHost> host, views::View* anchor_view, @@ -284,8 +278,11 @@ std::make_unique<ScopedDevToolsAgentHostObservation>(this); host_->browser()->tab_strip_model()->AddObserver(this); - // Listen for the containing view calling window.close(); - extension_host_observation_.Observe(host_.get()); + // Handle the containing view calling window.close(); + // The base::Unretained() below is safe because this object owns `host_`, so + // the callback will never fire if `this` is deleted. + host_->SetCloseHandler(base::BindOnce( + &ExtensionPopup::HandleCloseExtensionHost, base::Unretained(this))); extension_registry_observation_.Observe( extensions::ExtensionRegistry::Get(host_->browser_context())); @@ -323,5 +320,10 @@ GetWidget()->CloseWithReason(views::Widget::ClosedReason::kLostFocus); } +void ExtensionPopup::HandleCloseExtensionHost(extensions::ExtensionHost* host) { + DCHECK_EQ(host, host_.get()); + GetWidget()->Close(); +} + BEGIN_METADATA(ExtensionPopup, views::BubbleDialogDelegateView) END_METADATA
diff --git a/chrome/browser/ui/views/extensions/extension_popup.h b/chrome/browser/ui/views/extensions/extension_popup.h index f0c96baf3..7944f691 100644 --- a/chrome/browser/ui/views/extensions/extension_popup.h +++ b/chrome/browser/ui/views/extensions/extension_popup.h
@@ -15,7 +15,6 @@ #include "content/public/browser/devtools_agent_host_observer.h" #include "content/public/browser/web_contents_observer.h" #include "extensions/browser/extension_host.h" -#include "extensions/browser/extension_host_observer.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry_observer.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -48,8 +47,7 @@ public extensions::ExtensionRegistryObserver, public content::WebContentsObserver, public TabStripModelObserver, - public content::DevToolsAgentHostObserver, - public extensions::ExtensionHostObserver { + public content::DevToolsAgentHostObserver { public: METADATA_HEADER(ExtensionPopup); @@ -117,9 +115,6 @@ void DevToolsAgentHostDetached( content::DevToolsAgentHost* agent_host) override; - // extensions::ExtensionHostObserver: - void OnExtensionHostShouldClose(extensions::ExtensionHost* host) override; - // Returns the most recently constructed popup. For testing only. static ExtensionPopup* last_popup_for_testing(); @@ -138,15 +133,14 @@ // Closes the bubble if the devtools window is not attached. void CloseUnlessUnderInspection(); + // Handles a signal from the extension host to close. + void HandleCloseExtensionHost(extensions::ExtensionHost* host); + // The contained host for the view. std::unique_ptr<extensions::ExtensionViewHost> host_; raw_ptr<ExtensionViewViews> extension_view_; - base::ScopedObservation<extensions::ExtensionHost, - extensions::ExtensionHostObserver> - extension_host_observation_{this}; - base::ScopedObservation<extensions::ExtensionRegistry, extensions::ExtensionRegistryObserver> extension_registry_observation_{this};
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 21bf0585..a6f5515c 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1168,6 +1168,14 @@ return browser_->is_type_picture_in_picture(); } +float BrowserView::GetInitialAspectRatio() const { + return browser_->create_params().initial_aspect_ratio; +} + +bool BrowserView::GetLockAspectRatio() const { + return browser_->create_params().lock_aspect_ratio; +} + bool BrowserView::GetTopControlsSlideBehaviorEnabled() const { return top_controls_slide_controller_ && top_controls_slide_controller_->IsEnabled();
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index c768615d..0fad4aa 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -314,6 +314,14 @@ // a Picture in Picture window. bool GetIsPictureInPictureType() const; + // Returns the initial_aspect_ratio parameter from |browser_|'s CreateParams. + // Valid only for PictureInPicture browsers. + float GetInitialAspectRatio() const; + + // Returns the lock_aspect_ratio parameter from |browser_|'s CreateParams. + // Valid only for PictureInPicture browsers. + bool GetLockAspectRatio() const; + // Returns true if the top browser controls (a.k.a. top-chrome UIs) are // allowed to slide up and down with the gesture scrolls on the current tab's // page.
diff --git a/chrome/browser/ui/views/frame/browser_window_factory.cc b/chrome/browser/ui/views/frame/browser_window_factory.cc index 2c62b0bd..ad2b2d0 100644 --- a/chrome/browser/ui/views/frame/browser_window_factory.cc +++ b/chrome/browser/ui/views/frame/browser_window_factory.cc
@@ -57,6 +57,11 @@ view->GetWidget()->non_client_view()->SetAccessibleName( l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); + if (view->GetIsPictureInPictureType() && view->GetLockAspectRatio()) { + gfx::SizeF aspect_ratio(view->GetInitialAspectRatio(), 1.0f); + view->GetWidget()->SetAspectRatio(aspect_ratio); + } + #if defined(USE_AURA) // For now, all browser windows are true. This only works when USE_AURA // because it requires gfx::NativeWindow to be an aura::Window*.
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc index 3e20ccb1..eb19367 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -83,7 +83,6 @@ dialog_created_time_ = base::TimeTicks::Now(); web_view_ = AddChildView(std::make_unique<views::WebView>(browser->profile())); - web_view_->SetID(kViewIdWebView); web_view_->LoadInitialURL(GURL(chrome::kChromeUIPrivacySandboxDialogURL)); auto width =
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h index 812d4c4..71dda28 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
@@ -24,8 +24,6 @@ PrivacySandboxDialogView(Browser* browser, PrivacySandboxService::PromptType dialog_type); - static constexpr int kViewIdWebView = 1; - void Close(); private:
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc index 9cc716eb..cb159e2 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
@@ -23,15 +23,6 @@ constexpr int kAverageBrowserWidth = 800; constexpr int kAverageBrowserHeight = 700; -void ExpandLearnMoreSection(content::WebContents* web_contents) { - content::RenderFrameHost* main_frame = web_contents->GetPrimaryMainFrame(); - EXPECT_TRUE( - content::ExecJs(main_frame, - "(async () => { return await " - "document.querySelector('privacy-sandbox-dialog-app')." - "expandLearnMoreSectionForTesting(); })()")); -} - } // namespace class PrivacySandboxDialogViewBrowserTest : public DialogBrowserTest { @@ -50,9 +41,6 @@ if (name == "Consent") { prompt_type = PrivacySandboxService::PromptType::kConsent; } - if (name == "ConsentExpanded") { - prompt_type = PrivacySandboxService::PromptType::kConsent; - } if (name == "Notice") { prompt_type = PrivacySandboxService::PromptType::kNotice; } @@ -66,13 +54,7 @@ views::test::AnyWidgetTestPasskey{}, PrivacySandboxDialogView::kViewClassName); ShowPrivacySandboxPrompt(browser(), prompt_type); - auto* dialog = waiter.WaitIfNeededAndGet(); - if (name == "ConsentExpanded") { - auto* web_view = dialog->GetRootView()->GetViewByID( - PrivacySandboxDialogView::kViewIdWebView); - ExpandLearnMoreSection( - static_cast<views::WebView*>(web_view)->GetWebContents()); - } + waiter.WaitIfNeededAndGet(); base::RunLoop().RunUntilIdle(); } @@ -94,21 +76,6 @@ ShowAndVerifyUi(); } -IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewBrowserTest, - InvokeUi_ConsentExpanded) { - EXPECT_CALL( - *mock_service(), - PromptActionOccurred(PrivacySandboxService::PromptAction::kConsentShown)); - EXPECT_CALL(*mock_service(), - PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentMoreInfoOpened)); - EXPECT_CALL( - *mock_service(), - PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentClosedNoDecision)); - ShowAndVerifyUi(); -} - IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewBrowserTest, InvokeUi_Notice) { EXPECT_CALL( *mock_service(),
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc new file mode 100644 index 0000000..7b38977 --- /dev/null +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc
@@ -0,0 +1,37 @@ +// 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/views/side_panel/read_anything/read_anything_button_view.h" + +#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h" +#include "ui/views/layout/box_layout.h" + +ReadAnythingButtonView::ReadAnythingButtonView( + views::ImageButton::PressedCallback callback, + const gfx::ImageSkia& icon, + const std::u16string& tooltip) { + // Create and set a BoxLayout with insets to hold the button. + auto button_layout_manager = std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal); + button_layout_manager->set_inside_border_insets( + gfx::Insets().set_left(kButtonPadding).set_right(kButtonPadding)); + button_layout_manager->set_cross_axis_alignment( + views::BoxLayout::CrossAxisAlignment::kCenter); + button_layout_manager->set_main_axis_alignment( + views::BoxLayout::MainAxisAlignment::kCenter); + + SetLayoutManager(std::move(button_layout_manager)); + + // Create the image button. + auto button = std::make_unique<views::ImageButton>(std::move(callback)); + button->SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER); + button->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); + button->SetImage(views::Button::STATE_NORMAL, icon); + button->SetTooltipText(tooltip); + + // Add the button to the view. + AddChildView(std::move(button)); +} + +ReadAnythingButtonView::~ReadAnythingButtonView() = default;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h new file mode 100644 index 0000000..cddbaa5 --- /dev/null +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h
@@ -0,0 +1,30 @@ +// 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_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_BUTTON_VIEW_H_ +#define CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_BUTTON_VIEW_H_ + +#include "base/callback_forward.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/view.h" + +/////////////////////////////////////////////////////////////////////////////// +// ReadAnythingButtonView +// +// A helper class for buttons in the Read Anything toolbar. +// This class makes image button views with padding and theming as a +// convenience class for the ReadAnythingToolbarView. +// +class ReadAnythingButtonView : public views::View { + public: + ReadAnythingButtonView(const views::ImageButton::PressedCallback callback, + const gfx::ImageSkia& icon, + const std::u16string& tooltip); + ReadAnythingButtonView(const ReadAnythingButtonView&) = delete; + ReadAnythingButtonView& operator=(const ReadAnythingButtonView&) = delete; + ~ReadAnythingButtonView() override; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_BUTTON_VIEW_H_
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h index 7e682143..9530ab9 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h
@@ -11,9 +11,12 @@ // Visual constants for Read Anything feature. // TODO(1226555): Replace these with final values provided by UI. const int kInternalInsets = 6; -const int kFontSize = 16; -const int kIconSize = 16; -const int kIconCornerRadius = 2; + +const int kButtonPadding = 12; +const int kSeparatorTopBottomPadding = 6; + +const int kSmallIconSize = 18; +const int kLargeIconSize = 24; const char kReadAnythingDefaultFontName[] = "Standard font";
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc index a267f9ff..cb7b963 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
@@ -32,7 +32,6 @@ } void ReadAnythingController::OnFontChoiceChanged(int new_choice) { - std::string new_font_name; model_->SetSelectedFontByIndex(new_choice); browser_->profile()->GetPrefs()->SetString( @@ -40,6 +39,14 @@ model_->GetFontModel()->GetFontNameAt(new_choice)); } +void ReadAnythingController::OnFontSizeChanged(bool increase) { + if (increase) { + model_->IncreaseTextSize(); + } else { + model_->DecreaseTextSize(); + } +} + void ReadAnythingController::OnUIReady() { DistillAXTree(); }
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h index c7715a59..19960ef 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
@@ -49,6 +49,7 @@ private: // ReadAnythingToolbarView::Delegate: void OnFontChoiceChanged(int new_choice) override; + void OnFontSizeChanged(bool increase) override; // ReadAnythingPageHandler::Delegate: void OnUIReady() override;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc index c0cb260..476f831 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
@@ -38,6 +38,7 @@ (const ui::AXTreeUpdate& snapshot, const std::vector<ui::AXNodeID>& content_node_ids), (override)); + MOCK_METHOD(void, OnFontSizeChanged, (float new_font_size), (override)); }; class ReadAnythingCoordinatorTest : public TestWithBrowserView {
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc index 11bfdb1..75ee82b 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
@@ -19,6 +19,9 @@ font_model_->SetDefaultIndexFromPrefsFontName(prefs_font_name); font_name_ = prefs_font_name; } + + // TODO(1266555): Add font size to users prefs and initialize here. + font_size_ = 18.0f; } ReadAnythingModel::~ReadAnythingModel() = default; @@ -51,6 +54,17 @@ NotifyAXTreeDistilled(); } +// TODO(1266555): Update with text scaling approach based on UI/UX feedback. +void ReadAnythingModel::DecreaseTextSize() { + font_size_ *= 0.83333f; + NotifyFontSizeChanged(); +} + +void ReadAnythingModel::IncreaseTextSize() { + font_size_ *= 1.2f; + NotifyFontSizeChanged(); +} + void ReadAnythingModel::NotifyFontNameUpdated() { for (Observer& obs : observers_) { obs.OnFontNameUpdated(font_name_); @@ -63,6 +77,12 @@ } } +void ReadAnythingModel::NotifyFontSizeChanged() { + for (Observer& obs : observers_) { + obs.OnFontSizeChanged(font_size_); + } +} + ReadAnythingFontModel::ReadAnythingFontModel() { // TODO(1266555): Replace these with proper versions once finalized. font_choices_.emplace_back(u"Standard font");
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h index 7e2e1f5e..ed9c4e0 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
@@ -65,6 +65,7 @@ virtual void OnAXTreeDistilled( const ui::AXTreeUpdate& snapshot, const std::vector<ui::AXNodeID>& content_node_ids) = 0; + virtual void OnFontSizeChanged(const float new_font_size) = 0; }; explicit ReadAnythingModel(std::string prefs_font_name); @@ -77,16 +78,22 @@ void SetDistilledAXTree(ui::AXTreeUpdate snapshot, std::vector<ui::AXNodeID> content_node_ids); + void SetSelectedFontByIndex(int new_index); + void DecreaseTextSize(); + void IncreaseTextSize(); ReadAnythingFontModel* GetFontModel() { return font_model_.get(); } private: void NotifyAXTreeDistilled(); void NotifyFontNameUpdated(); + void NotifyFontSizeChanged(); // State: std::string font_name_; + float font_size_; + // TODO(crbug.com/1266555): Use |snapshot_| and |content_node_ids_| to keep // scrolls in sync. ui::AXTreeUpdate snapshot_;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc index 3ec8095..cb8362d 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
@@ -9,14 +9,18 @@ #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h" #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h" +#include "components/vector_icons/cc_macros.h" #include "components/vector_icons/vector_icons.h" +#include "ui/color/color_id.h" #include "ui/color/color_provider.h" #include "ui/gfx/color_palette.h" +#include "ui/gfx/color_utils.h" #include "ui/gfx/geometry/geometry_export.h" +#include "ui/gfx/paint_vector_icon.h" #include "ui/views/background.h" -#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/highlight_path_generator.h" +#include "ui/views/controls/separator.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/layout_types.h" @@ -48,8 +52,28 @@ combobox->SetTooltipTextAndAccessibleName(u"Font Choice"); combobox->SetModel(font_model); + // Create the decrease/increase text size buttons. + // TODO(1266555): These use placeholder text, update for final UI. + auto decrease_size_button = std::make_unique<ReadAnythingButtonView>( + base::BindRepeating(&ReadAnythingToolbarView::DecreaseFontSizeCallback, + weak_pointer_factory_.GetWeakPtr()), + gfx::CreateVectorIcon(vector_icons::kTextDecreaseIcon, kSmallIconSize, + gfx::kGoogleGrey700), + u"Decrease font size"); + + auto increase_size_button = std::make_unique<ReadAnythingButtonView>( + base::BindRepeating(&ReadAnythingToolbarView::IncreaseFontSizeCallback, + weak_pointer_factory_.GetWeakPtr()), + gfx::CreateVectorIcon(vector_icons::kTextIncreaseIcon, kLargeIconSize, + gfx::kGoogleGrey700), + u"Increase font size"); + // Add all views as children. font_combobox_ = AddChildView(std::move(combobox)); + AddChildView(Separator()); + decrease_text_size_button_ = AddChildView(std::move(decrease_size_button)); + increase_text_size_button_ = AddChildView(std::move(increase_size_button)); + AddChildView(Separator()); } void ReadAnythingToolbarView::FontNameChangedCallback() { @@ -57,6 +81,16 @@ delegate_->OnFontChoiceChanged(font_combobox_->GetSelectedIndex()); } +void ReadAnythingToolbarView::DecreaseFontSizeCallback() { + if (delegate_) + delegate_->OnFontSizeChanged(/* increase = */ false); +} + +void ReadAnythingToolbarView::IncreaseFontSizeCallback() { + if (delegate_) + delegate_->OnFontSizeChanged(/* increase = */ true); +} + void ReadAnythingToolbarView::OnCoordinatorDestroyed() { // When the coordinator that created |this| is destroyed, clean up pointers. coordinator_ = nullptr; @@ -64,6 +98,27 @@ font_combobox_->SetModel(nullptr); } +std::unique_ptr<views::View> ReadAnythingToolbarView::Separator() { + // Create a simple separator with padding to be inserted into views. + auto separator_container = std::make_unique<views::View>(); + + auto separator_layout_manager = std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal); + separator_layout_manager->set_inside_border_insets( + gfx::Insets(kButtonPadding) + .set_top(kSeparatorTopBottomPadding) + .set_bottom(kSeparatorTopBottomPadding)); + + separator_container->SetLayoutManager(std::move(separator_layout_manager)); + + auto separator = std::make_unique<views::Separator>(); + separator->SetColorId(ui::kColorMenuSeparator); + + separator_container->AddChildView(std::move(separator)); + + return separator_container; +} + ReadAnythingToolbarView::~ReadAnythingToolbarView() { // If |this| is being destroyed before the associated coordinator, then // remove |this| as an observer.
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h index 840e687c..d113a80 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h
@@ -7,6 +7,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h" #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.h" #include "ui/base/models/combobox_model.h" #include "ui/views/controls/combobox/combobox.h" @@ -25,6 +26,7 @@ class Delegate { public: virtual void OnFontChoiceChanged(int new_choice) = 0; + virtual void OnFontSizeChanged(bool increase) = 0; }; explicit ReadAnythingToolbarView(ReadAnythingCoordinator* coordinator); @@ -37,8 +39,14 @@ private: void FontNameChangedCallback(); + void DecreaseFontSizeCallback(); + void IncreaseFontSizeCallback(); + + std::unique_ptr<views::View> Separator(); raw_ptr<views::Combobox> font_combobox_; + raw_ptr<ReadAnythingButtonView> decrease_text_size_button_; + raw_ptr<ReadAnythingButtonView> increase_text_size_button_; raw_ptr<ReadAnythingToolbarView::Delegate> delegate_; raw_ptr<ReadAnythingCoordinator> coordinator_;
diff --git a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc index 9228d5ce..11fae90 100644 --- a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc +++ b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc
@@ -95,6 +95,8 @@ } void UserNoteUICoordinator::FocusNote(const base::UnguessableToken& guid) { + Show(); + auto* scroll_contents_view = scroll_view_->contents(); for (views::View* child_view : scroll_contents_view->children()) { UserNoteView* user_note_view = views::AsViewClass<UserNoteView>(child_view); @@ -108,9 +110,10 @@ void UserNoteUICoordinator::StartNoteCreation( user_notes::UserNoteInstance* instance) { - scoped_view_observer_.Observe(scroll_view_); + Show(); auto* scroll_contents_view = scroll_view_->contents(); + scoped_view_observer_.Observe(scroll_contents_view); scroll_to_note_id_ = instance->model().id(); int index = 0; @@ -127,6 +130,8 @@ std::make_unique<UserNoteView>(this, instance, UserNoteView::State::kCreating), index); + + scroll_view_->Layout(); } void UserNoteUICoordinator::OnViewBoundsChanged(views::View* observed_view) { @@ -241,6 +246,12 @@ void UserNoteUICoordinator::Show() { auto* side_panel_coordinator = BrowserView::GetBrowserViewForBrowser(browser_)->side_panel_coordinator(); + + if (side_panel_coordinator->GetCurrentEntryId() == + SidePanelEntry::Id::kUserNote) { + return; + } + side_panel_coordinator->Show( SidePanelEntry::Id::kUserNote, SidePanelUtil::SidePanelOpenTrigger::kNotesInPageContextMenu);
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc index 440e582..caf8d576 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -2436,9 +2436,6 @@ const absl::optional<tab_groups::TabGroupId> updated_group = GetTabGroupForTargetIndex(selected_unpinned); - if (updated_group == attached_model->GetTabGroupForTab(selected_unpinned[0])) - return; - attached_model->MoveTabsAndSetGroup(selected_unpinned, selected_unpinned[0], updated_group); }
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc index a628c17..9e9e8f4 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -1096,6 +1096,42 @@ EXPECT_EQ(group_model->GetTabGroup(group3)->ListTabs(), gfx::Range(1, 4)); } +// Creates a browser with four tabs with third and fourth in a group. +// Selecting and dragging the second and third tabs towards left out +// of the group will result in the tabs being ungrouped. +IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, + DragUngroupedTabGroupedTabOutsideGroup) { + ASSERT_TRUE(browser()->tab_strip_model()->SupportsTabGroups()); + + TabStrip* tab_strip = GetTabStripForBrowser(browser()); + TabStripModel* model = browser()->tab_strip_model(); + TabGroupModel* group_model = model->group_model(); + + AddTabsAndResetBrowser(browser(), 3); + tab_groups::TabGroupId group1 = model->AddToNewGroup({2, 3}); + StopAnimating(tab_strip); + EnsureFocusToTabStrip(tab_strip); + + // Click the second tab and select third tab so both second and third tabs + // are selected. + ASSERT_TRUE(PressInput(GetCenterInScreenCoordinates(tab_strip->tab_at(1)))); + ASSERT_TRUE(ReleaseInput()); + browser()->tab_strip_model()->ToggleSelectionAt(2); + + // Dragging the third tab slightly to the left will result in the two + // selected tabs leaving the group. + const gfx::Point first_tab_screen_center = + GetCenterInScreenCoordinates(tab_strip->tab_at(0)); + + ASSERT_TRUE(PressInput(GetCenterInScreenCoordinates(tab_strip->tab_at(2)))); + ASSERT_TRUE(DragInputTo(first_tab_screen_center)); + ASSERT_TRUE(ReleaseInput()); + StopAnimating(tab_strip); + + EXPECT_EQ("1 2 0 3", IDString(model)); + EXPECT_EQ(group_model->GetTabGroup(group1)->ListTabs(), gfx::Range(3, 4)); +} + // Creates a browser with four tabs. The first two tabs are in Tab Group 1. // Dragging the third tab over one to the left will result in the tab joining // Tab Group 1. While this drag is still in session, pressing escape will revert
diff --git a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc index 841633a..4e399de 100644 --- a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc
@@ -129,42 +129,49 @@ // The difference between a nearby::fastpair::FastPairDevice and a // nearby::fastpair::StoredDiscoveryItem is that although they represent the // same devices saved to a user's account, the FastPairDevice contains the - // raw byte array with the device name and the image url, which we will - // parse into a StoredDiscoveryItem to access the image url as strings. We + // raw byte array with the device name and the image bytes, which we will + // parse into a StoredDiscoveryItem to access the image bytes as strings. We // create a flat set of these strings in the case that the - // user has the same device multiple times, we only decode the image url + // user has the same device multiple times, we only decode the image bytes // once. devices_ = devices; - base::flat_set<std::string> image_urls; + base::flat_set<std::string> image_byte_strings; for (const auto& device : devices) { nearby::fastpair::StoredDiscoveryItem item; if (item.ParseFromString(device.discovery_item_bytes()) && - item.has_display_url()) { - image_urls.insert(item.display_url()); + item.has_icon_png()) { + image_byte_strings.insert(item.icon_png()); } } + if (image_byte_strings.empty()) { + QP_LOG(VERBOSE) << __func__ << ": no device images"; + DecodingUrlsFinished(); + return; + } + // Image decoding occurs asynchronously in a separate process, so we use // a AtomicRefCounter to keep track of the pending tasks remaining, and once // they complete, we can continue parsing the saved device data to communicate // with the settings page. pending_decoding_tasks_count_ = - std::make_unique<base::AtomicRefCount>(image_urls.size()); - for (std::string image_url : image_urls) { - image_decoder_->DecodeImageFromUrl( - GURL(image_url), + std::make_unique<base::AtomicRefCount>(image_byte_strings.size()); + for (std::string image_byte_string : image_byte_strings) { + image_decoder_->DecodeImage( + std::vector<uint8_t>(image_byte_string.begin(), + image_byte_string.end()), /*resize_to_notification_size=*/false, base::BindOnce(&FastPairSavedDevicesHandler::SaveImageAsBase64, - weak_ptr_factory_.GetWeakPtr(), image_url)); + weak_ptr_factory_.GetWeakPtr(), image_byte_string)); } } void FastPairSavedDevicesHandler::SaveImageAsBase64( - const std::string& image_url, + const std::string& image_byte_string, gfx::Image image) { if (!image.IsEmpty()) { std::string encoded_image = webui::GetBitmapDataUrl(image.AsBitmap()); - image_url_to_encoded_url_map_[image_url] = encoded_image; + image_byte_string_to_encoded_url_map_[image_byte_string] = encoded_image; } // Even if the image is empty, we want to decrement our task counter to @@ -185,13 +192,16 @@ saved_devices_list.reserve(devices_.size()); // |nearby::fastpair::StoredDiscoveryItem| contains information about - // the device name, |image_url_to_encoded_url_map_| contains the base64 - // encoded urls for the images, and |nearby::fastpair::FastPairDevice| + // the device name, |image_byte_string_to_encoded_url_map_| contains the + // base64 encoded urls for the images, and |nearby::fastpair::FastPairDevice| // contains the account key. Here, we reconcile this data for each device // and convert it to dictionary, to be communicated to the settings page. for (const auto& device : devices_) { // If the device does not have an account key, then it was not properly - // saved to the user's account, and we ignore these devices. + // saved to the user's account, and we ignore these devices. Android + // has devices still in Footprints but marked as deleted by removing the + // account key, so it is not expected for all of these devices to have + // account keys. if (!device.has_account_key()) continue; @@ -199,13 +209,14 @@ std::string image_url = ""; nearby::fastpair::StoredDiscoveryItem item; if (item.ParseFromString(device.discovery_item_bytes()) && - item.has_display_url() && - base::Contains(image_url_to_encoded_url_map_, item.display_url())) { - image_url = image_url_to_encoded_url_map_[item.display_url()]; + item.has_icon_png() && + base::Contains(image_byte_string_to_encoded_url_map_, + item.icon_png())) { + image_url = image_byte_string_to_encoded_url_map_[item.icon_png()]; } saved_devices_list.Append(SavedDeviceToDictionary( - /*device_name=*/item.has_device_name() ? item.device_name() : "", + /*device_name=*/item.has_title() ? item.title() : "", /*image_url=*/image_url, /*account_key=*/account_key)); } @@ -217,7 +228,7 @@ // We reset the state here for another page load that may happened while // chrome://os-settings is open, since our decoding tasks are completed. devices_.clear(); - image_url_to_encoded_url_map_.clear(); + image_byte_string_to_encoded_url_map_.clear(); pending_decoding_tasks_count_.reset(); loading_saved_device_page_ = false; }
diff --git a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h index b509dff..51a9ec0 100644 --- a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h
@@ -39,7 +39,8 @@ void HandleLoadSavedDevicePage(const base::Value::List& args); void OnGetSavedDevices(nearby::fastpair::OptInStatus status, std::vector<nearby::fastpair::FastPairDevice> devices); - void SaveImageAsBase64(const std::string& image_url, gfx::Image image); + void SaveImageAsBase64(const std::string& image_byte_string, + gfx::Image image); void DecodingUrlsFinished(); void HandleRemoveSavedDevice(const base::Value::List& args); @@ -57,7 +58,8 @@ // for security reasons. This map is used to store the encoded urls created // in async calls to be used when we create our dictionary to give to // chrome://os-settings for display. - base::flat_map<std::string, std::string> image_url_to_encoded_url_map_; + base::flat_map<std::string, std::string> + image_byte_string_to_encoded_url_map_; base::WeakPtrFactory<FastPairSavedDevicesHandler> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc index abdcf6d..78abec8d 100644 --- a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h" +#include "ash/quick_pair/common/logging.h" #include "ash/quick_pair/common/mock_quick_pair_browser_delegate.h" #include "ash/quick_pair/proto/fastpair.pb.h" #include "ash/quick_pair/proto/fastpair_data.pb.h" @@ -51,63 +52,45 @@ "zAXrTQLGi/OgEwAAAABJRU5ErkJggg=="; const char kDeviceName1[] = "I16max"; -const char kDisplayUrl1[] = - "https://lh3.googleusercontent.com/" - "k8zVfbUX1vo44utJCdVzEf9hkmijQfHLCMc2cidJfrnvH62rblJ5LH32gfQce6XnAPB1LwwTVh" - "vSPEw3c7OxMCw"; +const char kImageBytes1[] = "01010101001010101010101010101"; const std::vector<uint8_t> kAccountKey1 = {0xA0, 0xBA, 0xF0, 0xBB, 0x95, 0x1F, 0xF7, 0xB6, 0xCF, 0x5E, 0x3F, 0x45, 0x61, 0xC3, 0x32, 0x1D}; const char kDeviceName2[] = "JBL Flip 6"; -const char kDisplayUrl2[] = - "https://lh3-dz.googleusercontent.com/" - "Bw8fRUbTFyZhUU5wge68od-" - "6RXdoeuGs3uMZbFm8zvpKtI6hTxiLlNU7cbeHlB1pPL3n2jHyqcIae7B0giXGTQ"; +const char kImageBytes2[] = "111110101001010101001010101111"; const std::vector<uint8_t> kAccountKey2 = {0xA1, 0xBA, 0xF0, 0xBB, 0x95, 0x1F, 0xF7, 0xB6, 0xCD, 0x5E, 0x3F, 0x45, 0x61, 0xC3, 0x32, 0x1D}; const char kDeviceName3[] = "Pixel Buds"; -const char kDisplayUrl3[] = - "https://lh3.googleusercontent.com/" - "pCvLoM4hzVoFiqTSTUkLg7puZfpBTvBLr6PBSZYDoeIsaxwcaSkPGqOfdJ5fuaVa3PKT71qrF6" - "5KJrBYX-K-Xg"; +const char kImageBytes3[] = "00000010101100110101010010101001"; const std::vector<uint8_t> kAccountKey3 = {0xA6, 0xB0, 0xF0, 0xBB, 0x95, 0x1F, 0xF7, 0xB6, 0xCD, 0x5E, 0x3F, 0x45, 0x68, 0xC3, 0x32, 0x1D}; const char kDeviceName4[] = "Wyze Buds"; -const char kDisplayUrl4[] = - "https://lh3.googleusercontent.com/" - "NTEvjDWCU9v5T6D80kGMzG-" - "ziGKRYhEW093j5YYEoat56UODs9sk8L2kkfF0570psmClMLfDlyHD0yEhDmTIZg"; +const char kImageBytes4[] = "11111000101010010101"; const std::vector<uint8_t> kAccountKey4 = {0xB0, 0xB6, 0xF0, 0xBB, 0x95, 0x1F, 0xF7, 0xB6, 0xCF, 0x5E, 0x3F, 0x45, 0x61, 0xC3, 0x32, 0x1D}; const char kDeviceName5[] = "B&O Beoplay E6"; -const char kDisplayUrl5[] = - "https://lh3.googleusercontent.com/" - "Af3OOuFVJasO6MMnfA59I4_KoemT79Q7bYy-aN7pXPvSsyPHdYdQh4mtAUKUuo_zgvZsQ_" - "egiAmloPCpgg"; +const char kImageBytes5[] = "110000100010000100010100000001001000100001"; const std::vector<uint8_t> kAccountKey5 = {0xC0, 0xC6, 0xD0, 0xBB, 0x95, 0x1F, 0xF7, 0xB6, 0xCF, 0x5E, 0x3F, 0x45, 0x61, 0xC3, 0x32, 0x1D}; const char kDeviceName6[] = "LG HBS-830"; -const char kDisplayUrl6[] = - "https://lh3.googleusercontent.com/" - "40-bd0-Jt7puzW1x7gRnub2KsIx6qWP5g8Qx_vhAF4-" - "eJZiGVEIirRD7g3KxkmZ53X2VoMWRkg4d6uopNkc"; +const char kImageBytes6[] = "11110100011111111010100101001010100101010011"; const std::vector<uint8_t> kAccountKey6 = {0xB5, 0xB6, 0xF0, 0xBB, 0x95, 0x1F, 0xF7, 0xB8, 0xCF, 0x5E, 0x3F, 0x45, 0x61, 0xC3, 0x36, 0x1D}; nearby::fastpair::FastPairDevice CreateFastPairDevice( const std::string device_name, - const std::string image_url, + const std::string image_bytes, const std::vector<uint8_t>& account_key) { nearby::fastpair::StoredDiscoveryItem item; - item.set_device_name(device_name); - item.set_display_url(image_url); + item.set_title(device_name); + item.set_icon_png(image_bytes); nearby::fastpair::FastPairDevice device; device.set_account_key(std::string(account_key.begin(), account_key.end())); @@ -171,8 +154,7 @@ std::make_unique<ash::quick_pair::MockFastPairImageDecoder>(); mock_decoder_ = mock_decoder.get(); // On call to DecodeImage, run the third argument callback with test_image_. - ON_CALL(*mock_decoder, - DecodeImageFromUrl(testing::_, testing::_, testing::_)) + ON_CALL(*mock_decoder, DecodeImage(testing::_, testing::_, testing::_)) .WillByDefault(base::test::RunOnceCallback<2>(test_image_)); handler_ = std::make_unique<TestFastPairSavedDevicesHandler>( @@ -184,24 +166,24 @@ content::TestWebUI* test_web_ui() { return test_web_ui_.get(); } void InitializeSavedDevicesList(const std::string& device_name1, - const std::string& device_url1, + const std::string& device_image_bytes1, const std::vector<uint8_t>& account_key1, const std::string& device_name2, - const std::string& device_url2, + const std::string& device_image_bytes2, const std::vector<uint8_t>& account_key2, const std::string& device_name3, - const std::string& device_url3, + const std::string& device_image_bytes3, const std::vector<uint8_t>& account_key3, nearby::fastpair::OptInStatus opt_in_status) { std::vector<nearby::fastpair::FastPairDevice> devices{ CreateFastPairDevice(/*device_name=*/device_name1, - /*image_url=*/device_url1, + /*image_bytes=*/device_image_bytes1, /*account_key=*/account_key1), CreateFastPairDevice(/*device_name=*/device_name2, - /*image_url=*/device_url2, + /*image_bytes=*/device_image_bytes2, /*account_key=*/account_key2), CreateFastPairDevice(/*device_name=*/device_name3, - /*image_url=*/device_url3, + /*image_bytes=*/device_image_bytes3, /*account_key=*/account_key3)}; fast_pair_repository_.SetSavedDevices( /*status=*/opt_in_status, @@ -230,6 +212,7 @@ const base::Value::List* saved_devices_list = saved_devices_list_call_data.arg2()->GetIfList(); ASSERT_EQ(3u, saved_devices_list->size()); + ASSERT_TRUE( VerifyDeviceInList(/*device=*/*(saved_devices_list->begin()), /*expected_device_name=*/device_name1, @@ -294,10 +277,10 @@ TEST_F(FastPairSavedDevicesHandlerTest, GetSavedDevices) { InitializeSavedDevicesList( - /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1, + /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1, /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2, - /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2, - /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3, + /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2, + /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3, /*account_key3=*/kAccountKey3, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); LoadPage(); @@ -320,10 +303,10 @@ TEST_F(FastPairSavedDevicesHandlerTest, ReloadBeforePageLoadsIgnored) { InitializeSavedDevicesList( - /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1, + /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1, /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2, - /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2, - /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3, + /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2, + /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3, /*account_key3=*/kAccountKey3, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); @@ -352,10 +335,10 @@ TEST_F(FastPairSavedDevicesHandlerTest, ReloadAfterPageLoads) { InitializeSavedDevicesList( - /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1, + /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1, /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2, - /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2, - /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3, + /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2, + /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3, /*account_key3=*/kAccountKey3, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); LoadPage(); @@ -415,10 +398,10 @@ TEST_F(FastPairSavedDevicesHandlerTest, SavedDevicesBecomesEmpty) { InitializeSavedDevicesList( - /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1, + /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1, /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2, - /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2, - /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3, + /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2, + /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3, /*account_key3=*/kAccountKey3, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); LoadPage(); @@ -451,10 +434,10 @@ TEST_F(FastPairSavedDevicesHandlerTest, SavedDevicesChanges) { InitializeSavedDevicesList( - /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1, + /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1, /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2, - /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2, - /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3, + /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2, + /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3, /*account_key3=*/kAccountKey3, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); LoadPage(); @@ -472,10 +455,10 @@ /*account_key3=*/kAccountKey3); InitializeSavedDevicesList( - /*device_name1=*/kDeviceName4, /*device_url1=*/kDisplayUrl4, + /*device_name1=*/kDeviceName4, /*device_image_bytes1=*/kImageBytes4, /*account_key1=*/kAccountKey4, /*device_name2=*/kDeviceName5, - /*device_url2=*/kDisplayUrl5, /*account_key2=*/kAccountKey5, - /*device_name3=*/kDeviceName6, /*device_url3=*/kDisplayUrl6, + /*device_image_bytes2=*/kImageBytes5, /*account_key2=*/kAccountKey5, + /*device_name3=*/kDeviceName6, /*device_image_bytes3=*/kImageBytes6, /*account_key3=*/kAccountKey6, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); LoadPage(); @@ -494,14 +477,13 @@ } TEST_F(FastPairSavedDevicesHandlerTest, EmptyImageSentToWebUi) { - ON_CALL(*mock_decoder_, - DecodeImageFromUrl(testing::_, testing::_, testing::_)) + ON_CALL(*mock_decoder_, DecodeImage(testing::_, testing::_, testing::_)) .WillByDefault(base::test::RunOnceCallback<2>(gfx::Image())); InitializeSavedDevicesList( - /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1, + /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1, /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2, - /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2, - /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3, + /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2, + /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3, /*account_key3=*/kAccountKey3, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); LoadPage(); @@ -522,10 +504,10 @@ TEST_F(FastPairSavedDevicesHandlerTest, RemoveSavedDevice) { InitializeSavedDevicesList( - /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1, + /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1, /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2, - /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2, - /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3, + /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2, + /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3, /*account_key3=*/kAccountKey3, /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN); LoadPage();
diff --git a/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc index afefe678..6143c823 100644 --- a/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc
@@ -76,9 +76,8 @@ } // Assume that the data is stored in the last valid arg. - for (const base::Value* arg : - {data->arg4(), data->arg3(), data->arg2()}) { - if (arg) + for (const auto& arg : base::Reversed(data->args())) { + if (arg && arg.get() != data->arg1()) return arg->Clone(); } }
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index 73df7c33b..3938ee76 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -292,6 +292,11 @@ "enableAutofillAssistant", password_manager::features::IsAutomatedPasswordChangeEnabled()); + html_source->AddBoolean( + "enableAutomaticPasswordChangeInSettings", + base::FeatureList::IsEnabled( + password_manager::features::kPasswordChangeInSettings)); + #if !BUILDFLAG(IS_CHROMEOS) html_source->AddBoolean( "enableDesktopDetailedLanguageSettings",
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc index 9e644c7..23c446fc 100644 --- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc
@@ -63,3 +63,7 @@ const std::string& new_font_name) { page_->OnFontNameChange(std::move(new_font_name)); } + +void ReadAnythingPageHandler::OnFontSizeChanged(const float new_font_size) { + page_->OnFontSizeChanged(new_font_size); +}
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h index 699ea390..7a86c05 100644 --- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h +++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h
@@ -52,6 +52,7 @@ void OnAXTreeDistilled( const ui::AXTreeUpdate& snapshot, const std::vector<ui::AXNodeID>& content_node_ids) override; + void OnFontSizeChanged(const float new_font_size) override; // ReadAnythingCoordinator::Observer: void OnCoordinatorDestroyed() override;
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc index f2a355a..4c7c196 100644 --- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc +++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -788,8 +788,15 @@ ManifestUpdateResult::kAppUpToDate, 1); } +// TODO(crbug.com/1342625): Test is flaky. +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) +#define MAYBE_CheckNameUpdatesForDefaultApps \ + DISABLED_CheckNameUpdatesForDefaultApps +#else +#define MAYBE_CheckNameUpdatesForDefaultApps CheckNameUpdatesForDefaultApps +#endif IN_PROC_BROWSER_TEST_F(ManifestUpdateManagerBrowserTest, - CheckNameUpdatesForDefaultApps) { + MAYBE_CheckNameUpdatesForDefaultApps) { constexpr char kManifestTemplate[] = R"( { "name": "$1", @@ -1283,8 +1290,16 @@ http_server_.GetURL("/")); } +// TODO(crbug.com/1342625): Test is flaky. +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) +#define MAYBE_CheckDoesApplyIconURLChangeForDefaultApps \ + DISABLED_CheckDoesApplyIconURLChangeForDefaultApps +#else +#define MAYBE_CheckDoesApplyIconURLChangeForDefaultApps \ + CheckDoesApplyIconURLChangeForDefaultApps +#endif IN_PROC_BROWSER_TEST_F(ManifestUpdateManagerBrowserTest, - CheckDoesApplyIconURLChangeForDefaultApps) { + MAYBE_CheckDoesApplyIconURLChangeForDefaultApps) { // This test changes the scope and also the icon list. The scope should update // along with the icons. constexpr char kManifestTemplate[] = R"(
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index ac68059..d8ae4066 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1657195044-3c86484fed2a862220df0aeccac563af5c3b0382.profdata +chrome-linux-main-1657216488-964c1af31a57f69ad7c96efc5ae8bf09b66ba8c5.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index a2f042c..e4d2f12 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1657173309-cc6b6d1fb1c12e1b6efa16ace4cc6d27897ae21a.profdata +chrome-mac-arm-main-1657195044-bdc21327076ea0bf11bc33a0cd128af31cd79101.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index e4c55da..cefd2ae 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1657173309-5a4a53b0cd160a5cf4e4cd15db3c9dc0b0313df4.profdata +chrome-mac-main-1657195044-3da3f90aa1353824f081911d64c98f76df120c2d.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 70adce4..b33eb4a 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1657162680-887c20482644b3f27a8d31e9fbea7c20776fc28e.profdata +chrome-win32-main-1657195044-193c962b3200db57362fb83e5aa3345b410bf261.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 954120c..7305c13 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1657184339-1d54fb4a6688e24248bedce2767937a3d6973927.profdata +chrome-win64-main-1657206003-8700049f94a1e67edaf33366fef93cd62e950a67.profdata
diff --git a/chrome/common/accessibility/read_anything.mojom b/chrome/common/accessibility/read_anything.mojom index f75f786..ec4a65d1 100644 --- a/chrome/common/accessibility/read_anything.mojom +++ b/chrome/common/accessibility/read_anything.mojom
@@ -31,4 +31,7 @@ // Send an updated font name to front end. OnFontNameChange(string new_font_name); + + // Send an updated font size to front end. + OnFontSizeChanged(float new_font_size); };
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 41625e9..5d45112 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -790,8 +790,14 @@ base::FEATURE_DISABLED_BY_DEFAULT}; // Shows a confirmation dialog when updates to a PWAs name has been detected. -const base::Feature kPwaUpdateDialogForName{"PwaUpdateDialogForName", - base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kPwaUpdateDialogForName { + "PwaUpdateDialogForName", +#if BUILDFLAG(IS_ANDROID) + base::FEATURE_DISABLED_BY_DEFAULT +#else + base::FEATURE_ENABLED_BY_DEFAULT +#endif +}; // Enables using quiet prompts for notification permission requests. const base::Feature kQuietNotificationPrompts{"QuietNotificationPrompts",
diff --git a/chrome/common/extensions/api/passwords_private.idl b/chrome/common/extensions/api/passwords_private.idl index 7c5e77eb..28ce5e1 100644 --- a/chrome/common/extensions/api/passwords_private.idl +++ b/chrome/common/extensions/api/passwords_private.idl
@@ -232,7 +232,18 @@ DOMString? note; }; + // Object describing the IDs of credentials after a changeSavedPassword call. + dictionary CredentialIds { + // ID of the credential stored in the account store. Can be null if the + // credential is not stored in the account store. + long? accountId; + // ID of the credential stored in the device store. Can be null if the + // credential is not stored in the device store. + long? deviceId; + }; + callback PlaintextPasswordCallback = void(DOMString password); + callback ChangeSavedPasswordCallback = void(CredentialIds newIds); callback PasswordListCallback = void(PasswordUiEntry[] entries); callback ExceptionListCallback = void(ExceptionEntry[] exceptions); callback ExportProgressStatusCallback = void(ExportProgressStatus status); @@ -262,7 +273,7 @@ [supportsPromises] static void changeSavedPassword( long[] ids, ChangeSavedPasswordParams params, - optional VoidCallback callback); + optional ChangeSavedPasswordCallback callback); // Removes the saved password corresponding to |id|. If no saved password // for this pair exists, this function is a no-op. |id|: The id for the @@ -401,6 +412,11 @@ boolean isManualFlow, optional VoidCallback callback); + // Refreshes the cache for automatic password change scripts if it is stale. + // Invokes `callback` on completion. + [supportsPromises] static void refreshScriptsIfNecessary( + optional VoidCallback callback); + // Starts a check for insecure passwords. Invokes |callback| on completion. [supportsPromises] static void startPasswordCheck( optional VoidCallback callback);
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc index dfa8365..77aa378 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller.cc +++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -206,12 +206,21 @@ render_frame_->ExecuteJavaScript(base::ASCIIToUTF16(script)); } +void ReadAnythingAppController::OnFontSizeChanged(const float new_font_size) { + font_size_ = new_font_size; + + // TODO: Use v*::Function rather than javascript. + std::string script = "chrome.readAnything.updateFontSize();"; + render_frame_->ExecuteJavaScript(base::ASCIIToUTF16(script)); +} + gin::ObjectTemplateBuilder ReadAnythingAppController::GetObjectTemplateBuilder( v8::Isolate* isolate) { return gin::Wrappable<ReadAnythingAppController>::GetObjectTemplateBuilder( isolate) .SetProperty("contentNodeIds", &ReadAnythingAppController::ContentNodeIds) .SetProperty("fontName", &ReadAnythingAppController::FontName) + .SetProperty("fontSize", &ReadAnythingAppController::FontSize) .SetMethod("getChildren", &ReadAnythingAppController::GetChildren) .SetMethod("getHeadingLevel", &ReadAnythingAppController::GetHeadingLevel) .SetMethod("getTextContent", &ReadAnythingAppController::GetTextContent) @@ -235,6 +244,10 @@ return font_name_; } +float ReadAnythingAppController::FontSize() { + return font_size_; +} + std::vector<ui::AXNodeID> ReadAnythingAppController::GetChildren( ui::AXNodeID ax_node_id) { std::vector<ui::AXNodeID> child_ids;
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything_app_controller.h index 3eaeec51..f4010a1 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller.h +++ b/chrome/renderer/accessibility/read_anything_app_controller.h
@@ -67,10 +67,12 @@ const ui::AXTreeUpdate& snapshot, const std::vector<ui::AXNodeID>& content_node_ids) override; void OnFontNameChange(const std::string& new_font_name) override; + void OnFontSizeChanged(const float new_font_size) override; // gin templates: std::vector<ui::AXNodeID> ContentNodeIds(); std::string FontName(); + float FontSize(); std::vector<ui::AXNodeID> GetChildren(ui::AXNodeID ax_node_id); uint32_t GetHeadingLevel(ui::AXNodeID ax_node_id); std::string GetTextContent(ui::AXNodeID ax_node_id); @@ -113,6 +115,7 @@ std::unique_ptr<ui::AXTree> tree_; std::vector<ui::AXNodeID> content_node_ids_; std::string font_name_; + float font_size_; }; #endif // CHROME_RENDERER_ACCESSIBILITY_READ_ANYTHING_APP_CONTROLLER_H_
diff --git a/chrome/renderer/chrome_render_thread_observer.cc b/chrome/renderer/chrome_render_thread_observer.cc index f99e226..d566a876 100644 --- a/chrome/renderer/chrome_render_thread_observer.cc +++ b/chrome/renderer/chrome_render_thread_observer.cc
@@ -39,7 +39,6 @@ #include "content/public/common/content_switches.h" #include "content/public/common/resource_usage_reporter_type_converters.h" #include "content/public/renderer/render_thread.h" -#include "content/public/renderer/render_view_visitor.h" #include "extensions/buildflags/buildflags.h" #include "ipc/ipc_sync_channel.h" #include "media/base/localized_strings.h"
diff --git a/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc b/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc index 18d6902e..db33e01 100644 --- a/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc +++ b/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc
@@ -83,8 +83,6 @@ void SandboxedDMGAnalyzer::AnalyzeFile(base::File file) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - base::UmaHistogramBoolean("SBClientDownload.DmgAnalysisRemoteValid", - remote_analyzer_.is_bound()); if (remote_analyzer_) { remote_analyzer_->AnalyzeDmgFile( std::move(file),
diff --git a/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc index f3cc2e9..12a13c6413 100644 --- a/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc +++ b/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc
@@ -68,8 +68,6 @@ const base::FilePath& file_path) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - base::UmaHistogramBoolean("SBClientDownload.DocumentAnalysisRemoteValid", - remote_analyzer_.is_bound()); if (remote_analyzer_) { remote_analyzer_->AnalyzeDocument( std::move(file), target_file_path_,
diff --git a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc index 45c47ba1..4516729f 100644 --- a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc +++ b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
@@ -49,8 +49,6 @@ void SandboxedRarAnalyzer::AnalyzeFile(base::File file, base::File temp_file) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!file_path_.value().empty()); - base::UmaHistogramBoolean("SBClientDownload.RarAnalysisRemoteValid", - remote_analyzer_.is_bound()); if (remote_analyzer_) { remote_analyzer_->AnalyzeRarFile( std::move(file), std::move(temp_file),
diff --git a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc index c5a4a5d..7c3eb923 100644 --- a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc +++ b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
@@ -86,8 +86,6 @@ void SandboxedZipAnalyzer::AnalyzeFile(base::File file, base::File temp_file) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - base::UmaHistogramBoolean("SBClientDownload.ZipAnalysisRemoteValid", - remote_analyzer_.is_bound()); if (remote_analyzer_) { remote_analyzer_->AnalyzeZipFile( std::move(file), std::move(temp_file),
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index e74c0a55..fafd92e 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4631,6 +4631,7 @@ "../browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_apitest.cc", "../browser/chromeos/extensions/wallpaper_apitest.cc", "../browser/chromeos/tablet_mode/tablet_mode_page_behavior_browsertest.cc", + "../browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc", "../browser/extensions/api/preference/preference_api_lacros_browsertest.cc", "../browser/extensions/api/vpn_provider/vpn_provider_apitest.cc", "../browser/lacros/browser_service_lacros_browsertest.cc", @@ -4697,9 +4698,11 @@ "//components/infobars/content:content", "//components/metrics/structured", "//components/metrics/structured:structured_events", + "//components/onc:onc", "//components/proxy_config:proxy_config", "//components/services/app_service/public/cpp:intents", "//components/services/app_service/public/cpp:preferred_apps", + "//components/user_manager:user_manager", "//ui/gfx/codec", "//ui/platform_window", ] @@ -6231,7 +6234,6 @@ "../browser/optimization_guide/android/optimization_guide_tab_url_provider_android_unittest.cc", "../browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc", "../browser/password_manager/android/password_ui_view_android_unittest.cc", - "../browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc", "../browser/permissions/notification_blocked_message_delegate_android_unittest.cc", "../browser/permissions/permission_prompt_android_unittest.cc", "../browser/permissions/permission_update_message_controller_android_unittest.cc", @@ -7656,6 +7658,7 @@ "../browser/extensions/permission_message_combinations_unittest.cc", "../browser/extensions/permission_messages_unittest.cc", "../browser/extensions/permissions_based_management_policy_provider_unittest.cc", + "../browser/extensions/permissions_manager_unittest.cc", "../browser/extensions/permissions_updater_unittest.cc", "../browser/extensions/policy_handlers_unittest.cc", "../browser/extensions/preinstalled_apps_unittest.cc",
diff --git a/chrome/test/data/extensions/api_test/passwords_private/test.js b/chrome/test/data/extensions/api_test/passwords_private/test.js index 6856c3a1..441f093 100644 --- a/chrome/test/data/extensions/api_test/passwords_private/test.js +++ b/chrome/test/data/extensions/api_test/passwords_private/test.js
@@ -86,7 +86,8 @@ function changeSavedPasswordSucceeds() { chrome.passwordsPrivate.changeSavedPassword( - [0], {username: 'new_user', password: 'new_pass'}, () => { + [0], {username: 'new_user', password: 'new_pass'}, (credentialIds) => { + chrome.test.assertEq({deviceId: 0}, credentialIds); chrome.test.assertNoLastError(); chrome.test.succeed(); }); @@ -94,7 +95,8 @@ function changeSavedPasswordWithIncorrectIdFails() { chrome.passwordsPrivate.changeSavedPassword( - [-1], {username: 'new_user', password: 'new_pass'}, () => { + [-1], {username: 'new_user', password: 'new_pass'}, (credentialIds) => { + chrome.test.assertEq(undefined, credentialIds); chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD); chrome.test.succeed(); }); @@ -102,7 +104,9 @@ function changeSavedPasswordWithOneIncorrectIdFromArrayFails() { chrome.passwordsPrivate.changeSavedPassword( - [0, -1], {username: 'new_user', password: 'new_pass'}, () => { + [0, -1], {username: 'new_user', password: 'new_pass'}, + (credentialIds) => { + chrome.test.assertEq(undefined, credentialIds); chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD); chrome.test.succeed(); }); @@ -110,7 +114,8 @@ function changeSavedPasswordWithEmptyPasswordFails() { chrome.passwordsPrivate.changeSavedPassword( - [0], {username: 'new_user', password: ''}, () => { + [0], {username: 'new_user', password: ''}, (credentialIds) => { + chrome.test.assertEq(undefined, credentialIds); chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD); chrome.test.succeed(); }); @@ -118,7 +123,8 @@ function changeSavedPasswordWithEmptyArrayIdFails() { chrome.passwordsPrivate.changeSavedPassword( - [], {username: 'new_user', password: ''}, () => { + [], {username: 'new_user', password: ''}, (credentialIds) => { + chrome.test.assertEq(undefined, credentialIds); chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD); chrome.test.succeed(); }); @@ -127,7 +133,8 @@ function changeSavedPasswordWithNoteSucceeds() { chrome.passwordsPrivate.changeSavedPassword( [0], {username: 'new_user', password: 'new_pass', note: 'some note'}, - () => { + (credentialIds) => { + chrome.test.assertEq({deviceId: 0}, credentialIds); chrome.test.assertNoLastError(); chrome.test.succeed(); }); @@ -772,6 +779,13 @@ }); }, + function refreshScriptsIfNecessary() { + chrome.passwordsPrivate.refreshScriptsIfNecessary(() => { + chrome.test.assertNoLastError(); + chrome.test.succeed(); + }); + }, + function startPasswordCheck() { chrome.passwordsPrivate.startPasswordCheck(() => { chrome.test.assertNoLastError();
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js index 991691c..ea6b63c 100644 --- a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js +++ b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
@@ -132,7 +132,8 @@ assertTrue(!!getElement('#userEmailDropDown')); // URL elements. - assertEquals('share url:', getElementContent('#pageUrlLabel')); + assertEquals('Share URL:', getElementContent('#pageUrlLabel')); + assertTrue(page.i18nExists('sharePageUrlLabel')); assertTrue(!!getElement('#pageUrlCheckbox')); assertTrue(!!getElement('#pageUrlText')); @@ -188,7 +189,7 @@ await initializePage(); page.feedbackContext = fakeFeedbackContext; - assertEquals('chrome://tab/', getElement('#pageUrlText').value); + assertEquals('chrome://tab/', getElementContent('#pageUrlText')); }); /**
diff --git a/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts b/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts index 1a3b099..34fbf8f 100644 --- a/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts +++ b/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts
@@ -36,8 +36,6 @@ suite('PrivacySandboxDialogConsent', function() { let page: PrivacySandboxDialogAppElement; let browserProxy: TestPrivacySandboxDialogBrowserProxy; - // TODO(olesiamarukhno): Add tests with more dialog sizes. - const defaultSize: [string, string] = ['500px', '500px']; function testClickButton(buttonSelector: string) { const actionButton = @@ -56,12 +54,6 @@ PrivacySandboxDialogBrowserProxy.setInstance(browserProxy); document.body.innerHTML = ''; - // Set a fixed size for the body to make the content area scrollable. - document.body.style.position = 'fixed'; - const [width, height]: [string, string] = defaultSize; - document.body.style.width = width; - document.body.style.height = height; - page = document.createElement('privacy-sandbox-dialog-app'); document.body.appendChild(page); @@ -104,17 +96,10 @@ const collapseElement = page.shadowRoot!.querySelector('iron-collapse'); const contentArea: HTMLElement|null = page.shadowRoot!.querySelector('#contentArea'); - const expandSection = page.shadowRoot!.querySelector('#expandSection'); let hasScrollbar = contentArea!.offsetHeight < contentArea!.scrollHeight; - // Set transition duration to 0 to save time in tests. - collapseElement!.style.setProperty( - '--iron-collapse-transition-duration', '0ms'); - assertFalse(collapseElement!.opened); assertEquals(contentArea!.classList.contains('can-scroll'), hasScrollbar); - const expandSectionTop = expandSection!.getBoundingClientRect().top; - assertEquals(contentArea!.scrollTop, 0); // After clicking on the collapse section, the content area expands and // becomes scrollable with a separator in the bottom. The collapse section // is opened and the native UI is notified about the action. @@ -126,8 +111,6 @@ openedAction, PrivacySandboxPromptAction.CONSENT_MORE_INFO_OPENED); assertTrue(collapseElement!.opened); assertTrue(contentArea!.classList.contains('can-scroll')); - await page.waitForScrollToEndForTesting(); - assertEquals(contentArea!.scrollTop, expandSectionTop); // Reset proxy in between button clicks. browserProxy.reset(); @@ -142,8 +125,6 @@ closedAction, PrivacySandboxPromptAction.CONSENT_MORE_INFO_CLOSED); assertFalse(collapseElement!.opened); assertEquals(contentArea!.classList.contains('can-scroll'), hasScrollbar); - await page.waitForScrollToEndForTesting(); - assertEquals(contentArea!.scrollTop, 0); }); test('escPressed', async function() {
diff --git a/chrome/test/data/webui/settings/password_edit_dialog_test.ts b/chrome/test/data/webui/settings/password_edit_dialog_test.ts index c92decf..b728098 100644 --- a/chrome/test/data/webui/settings/password_edit_dialog_test.ts +++ b/chrome/test/data/webui/settings/password_edit_dialog_test.ts
@@ -168,6 +168,7 @@ assertFalse(editDialog.$.passwordInput.invalid); assertFalse(editDialog.$.actionButton.disabled); + passwordManager.setChangeSavedPasswordResponse({accountId: 999}); editDialog.$.actionButton.click(); // Check that the changeSavedPassword is called with the right arguments. @@ -642,6 +643,7 @@ test('changesPasswordWithNote', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); + loadTimeData.overrideValues({enablePasswordViewPage: true}); const entry = createMultiStorePasswordEntry( {url: 'goo.gl', username: 'bart', accountId: 42, note: 'some note'}); const editDialog = elementFactory.createPasswordEditDialog(entry); @@ -660,13 +662,20 @@ assertFalse(editDialog.$.passwordInput.invalid); assertFalse(editDialog.$.actionButton.disabled); + passwordManager.setChangeSavedPasswordResponse({accountId: 43}); editDialog.$.actionButton.click(); // Check that the changeSavedPassword is called with the right arguments. + const dispatchedEvent = eventToPromise('saved-password-edited', editDialog); const {params} = await passwordManager.whenCalled('changeSavedPassword'); assertEquals(expectedParams.password, params.password); assertEquals(expectedParams.username, params.username); assertEquals(expectedParams.note, params.note); + + await dispatchedEvent.then((event) => { + assertEquals(43, event.detail.accountId); + assertEquals(undefined, event.detail.deviceId); + }); }); test('noChangesWhenNotesIsNotEnabled', async function() {
diff --git a/chrome/test/data/webui/settings/password_view_test.ts b/chrome/test/data/webui/settings/password_view_test.ts index c518c53..6267e80 100644 --- a/chrome/test/data/webui/settings/password_view_test.ts +++ b/chrome/test/data/webui/settings/password_view_test.ts
@@ -76,21 +76,18 @@ PasswordManagerImpl.setInstance(passwordManager); }); - [{url: SITE, username: USERNAME, notesEnabled: false}, - {url: SITE, username: '', notesEnabled: false}, - {url: SITE, username: USERNAME, notesEnabled: true}, - {url: SITE, username: '', notesEnabled: true}] - .forEach( - item => test( - `Valid site and username displays an entry ${item.notesEnabled}`, + [false, true].forEach( + notesEnabled => + test( + `Textarea is shown when notes enabled: ${notesEnabled}`, async function() { loadTimeData.overrideValues( - {enablePasswordNotes: item.notesEnabled}); + {enablePasswordNotes: notesEnabled}); const passwordList = [ createPasswordEntry({ - url: item.url, - username: item.username, + url: SITE, + username: USERNAME, id: ID, note: NOTE, }), @@ -99,15 +96,12 @@ passwordManager.data.passwords = passwordList; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: item.username, - site: item.url, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); assertVisibilityOfPageElements(page, /*visibility=*/ true); - if (item.notesEnabled) { + if (notesEnabled) { assertEquals( NOTE, page.shadowRoot!.querySelector( @@ -118,13 +112,15 @@ } })); - [{inAccount: false, onDevice: true, username: USERNAME}, - {inAccount: true, onDevice: false, username: USERNAME}, - {inAccount: true, onDevice: true, username: USERNAME2}, + [{accountId: null, deviceId: 2, username: USERNAME}, + {accountId: 1, deviceId: null, username: USERNAME}, + {accountId: null, deviceId: 3, username: USERNAME}, + {accountId: 5, deviceId: 4, username: USERNAME2}, ] .forEach( item => test( - 'inAccount and onDevice parameters are used for finding credentials', + `IDs match to correct credentials for deviceId: ${ + item.deviceId}, accountId: ${item.accountId}`, async function() { const passwordList = [ // entry in the account store @@ -143,19 +139,28 @@ id: 2, fromAccountStore: false }), + // second entry in the device store. Has conflicting site and + // username + createPasswordEntry({ + url: SITE, + username: USERNAME, + frontendId: 3, + id: 3, + fromAccountStore: false + }), // entry in both stores are the next two items createPasswordEntry({ url: SITE, username: USERNAME2, - frontendId: 3, - id: 3, + frontendId: 4, + id: 4, fromAccountStore: false }), createPasswordEntry({ url: SITE, username: USERNAME2, - frontendId: 3, - id: 4, + frontendId: 4, + id: 5, fromAccountStore: true }), ]; @@ -163,25 +168,21 @@ passwordManager.data.passwords = passwordList; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: item.username, - site: SITE, - }); - if (item.inAccount) { - params.set('inAccount', 'true'); - if (item.onDevice) { - params.set('onDevice', 'true'); - } + const params = new URLSearchParams(); + if (item.deviceId !== null) { + params.set('deviceId', item.deviceId.toString()); + } + if (item.accountId !== null) { + params.set('accountId', item.accountId.toString()); } Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); assertVisibilityOfPageElements(page, /*visibility=*/ true); - assertEquals( - item.inAccount, page.credential!.isPresentInAccount()); - assertEquals( - item.onDevice, page.credential!.isPresentOnDevice()); + assertEquals(item.accountId, page.credential!.accountId); + assertEquals(item.deviceId, page.credential!.deviceId); assertEquals(item.username, page.credential!.username); + assertEquals(SITE, page.credential!.urls.shown); })); test('Empty note shows placeholder text', async function() { @@ -193,10 +194,7 @@ passwordManager.data.passwords = passwordList; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); @@ -205,28 +203,22 @@ page.shadowRoot!.querySelector('settings-textarea')!.value); }); - test( - 'Invalid site and username does not display an entry ' + - 'and routes to passwords page', - async function() { - const passwordList = [ - createPasswordEntry({url: SITE, username: 'user2', id: ID}), - ]; + test('Invalid IDs routes to passwords page', async function() { + const passwordList = [ + createPasswordEntry({url: SITE, username: USERNAME, id: ID}), + ]; - passwordManager.data.passwords = passwordList; - const page = document.createElement('password-view'); - document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); - Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); + passwordManager.data.passwords = passwordList; + const page = document.createElement('password-view'); + document.body.appendChild(page); + const params = new URLSearchParams({deviceId: 'invalid'}); + Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); - await flushTasks(); - assertVisibilityOfPageElements(page, /*visibility=*/ false); + await flushTasks(); + assertVisibilityOfPageElements(page, /*visibility=*/ false); - assertEquals(routes.PASSWORDS, Router.getInstance().getCurrentRoute()); - }); + assertEquals(routes.PASSWORDS, Router.getInstance().getCurrentRoute()); + }); test('Federated credential layout', async function() { const passwordList = [ @@ -234,15 +226,13 @@ federationText: 'with chromium.org', url: SITE, username: USERNAME, + id: ID, }), ]; passwordManager.data.passwords = passwordList; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); @@ -257,10 +247,7 @@ passwordManager.data.passwords = passwordList; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); @@ -313,10 +300,7 @@ passwordManager.data.passwords = [passwordEntry]; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); assertTrue(!!page.credential); @@ -332,6 +316,7 @@ assertTrue(!!page.credential); assertEquals(SITE, page.credential.urls.shown); assertEquals(USERNAME, page.credential.username); + assertEquals(ID, page.credential.deviceId); }); test( @@ -345,10 +330,7 @@ passwordManager.data.passwords = passwordList; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); @@ -365,17 +347,15 @@ 'When the username is changed, view page gets updated', async function() { const NEW_USERNAME = 'user2'; + const NEW_ID = ID + 1; const entry = - createPasswordEntry({url: SITE, username: USERNAME, id: 0}); + createPasswordEntry({url: SITE, username: USERNAME, id: ID}); passwordManager.setPlaintextPassword(PASSWORD); passwordManager.data.passwords = [entry]; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); @@ -395,21 +375,24 @@ assertEquals(entry.username, editDialog.existingEntry.username); assertEquals(PASSWORD, editDialog.existingEntry.password); + passwordManager.setChangeSavedPasswordResponse({deviceId: NEW_ID}); // user edits the username editDialog.$.usernameInput.value = NEW_USERNAME; editDialog.$.actionButton.click(); + await flushTasks(); + entry.username = NEW_USERNAME; + entry.id = NEW_ID; passwordManager.lastCallback.addSavedPasswordListChangedListener! ([entry]); - await flushTasks(); assertFalse(isVisible(editDialog)); assertEquals(NEW_USERNAME, page.credential!.username); const urlParams = Router.getInstance().getQueryParameters(); - assertEquals(urlParams.get('site'), SITE); - assertEquals(urlParams.get('username'), NEW_USERNAME); + assertEquals(urlParams.get('deviceId'), NEW_ID.toString()); + assertEquals(urlParams.get('accountId'), null); assertEquals( routes.PASSWORD_VIEW, Router.getInstance().getCurrentRoute()); }); @@ -425,10 +408,7 @@ passwordManager.data.passwords = [entry]; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); @@ -469,10 +449,8 @@ const page = document.createElement('password-view'); document.body.appendChild(page); const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - inAccount: 'true', - onDevice: 'true', + deviceId: '0', + accountId: '1', }); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks(); @@ -509,10 +487,7 @@ passwordManager.data.passwords = passwordList; const page = document.createElement('password-view'); document.body.appendChild(page); - const params = new URLSearchParams({ - username: USERNAME, - site: SITE, - }); + const params = new URLSearchParams({deviceId: ID.toString()}); Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params); await flushTasks();
diff --git a/chrome/test/data/webui/settings/passwords_section_test.ts b/chrome/test/data/webui/settings/passwords_section_test.ts index 5d181aa..d2ff95b 100644 --- a/chrome/test/data/webui/settings/passwords_section_test.ts +++ b/chrome/test/data/webui/settings/passwords_section_test.ts
@@ -222,6 +222,7 @@ // Close the dialog, verify that the list item password remains hidden. // Note that the password only gets hidden in the on-close handler, thus we // need to await this event first. + passwordManager.setChangeSavedPasswordResponse({deviceId: 1}); passwordEditDialog.$.actionButton.click(); await eventToPromise('close', passwordEditDialog); @@ -273,6 +274,7 @@ PasswordManagerImpl.setInstance(passwordManager); elementFactory = new PasswordSectionElementFactory(document); loadTimeData.overrideValues({ + enableAutomaticPasswordChangeInSettings: false, enablePasswordViewPage: false, unifiedPasswordManagerEnabled: false, }); @@ -1800,6 +1802,14 @@ assertEquals(TrustSafetyInteraction.OPENED_PASSWORD_MANAGER, interaction); }); + test('passwordScriptsRefreshedOnOpen', async function() { + loadTimeData.overrideValues( + {enableAutomaticPasswordChangeInSettings: true}); + elementFactory.createPasswordsSection(passwordManager, [], []); + Router.getInstance().navigateTo(routes.PASSWORDS); + await passwordManager.whenCalled('refreshScriptsIfNecessary'); + }); + test( 'addPasswordButtonShownOnlyWhenPasswordManagerNotDisabledByPolicy', function() {
diff --git a/chrome/test/data/webui/settings/test_password_manager_proxy.ts b/chrome/test/data/webui/settings/test_password_manager_proxy.ts index 488f95dc..17c61509 100644 --- a/chrome/test/data/webui/settings/test_password_manager_proxy.ts +++ b/chrome/test/data/webui/settings/test_password_manager_proxy.ts
@@ -85,6 +85,8 @@ private isAccountStoreDefault_: boolean = false; private getUrlCollectionResponse_: chrome.passwordsPrivate.UrlCollection| null = null; + private changeSavedPasswordResponse_: chrome.passwordsPrivate.CredentialIds| + null = null; constructor() { super([ @@ -106,6 +108,7 @@ 'recordChangePasswordFlowStarted', 'recordPasswordCheckInteraction', 'recordPasswordCheckReferrer', + 'refreshScriptsIfNecessary', 'removeException', 'removeExceptions', 'removeInsecureCredential', @@ -266,6 +269,11 @@ actual.listening.accountStorageOptInState); } + refreshScriptsIfNecessary() { + this.methodCalled('refreshScriptsIfNecessary'); + return Promise.resolve(); + } + startBulkPasswordCheck() { this.methodCalled('startBulkPasswordCheck'); if (this.data.checkStatus.state === @@ -355,11 +363,18 @@ this.methodCalled('recordPasswordCheckReferrer', referrer); } + setChangeSavedPasswordResponse(newIds: + chrome.passwordsPrivate.CredentialIds) { + this.changeSavedPasswordResponse_ = newIds; + } + changeSavedPassword( ids: number[], params: chrome.passwordsPrivate.ChangeSavedPasswordParams) { this.methodCalled('changeSavedPassword', {ids, params}); - return Promise.resolve(); + return !this.changeSavedPasswordResponse_ ? + Promise.reject(new Error('Could not change password.')) : + Promise.resolve(this.changeSavedPasswordResponse_); } /**
diff --git a/chrome/test/data/webui/signin/account_selection_lacros_test.ts b/chrome/test/data/webui/signin/account_selection_lacros_test.ts index ec13ca6e..bee71ab 100644 --- a/chrome/test/data/webui/signin/account_selection_lacros_test.ts +++ b/chrome/test/data/webui/signin/account_selection_lacros_test.ts
@@ -91,14 +91,34 @@ '.account-button'); assertTrue(!!buttons); assertEquals(buttons.length, 3); - // Click account buttons. - buttons[1]!.click(); - await verifySelectAccountLacrosCalled('gaia-id-0'); - buttons[2]!.click(); - await verifySelectAccountLacrosCalled('gaia-id-1'); // Click "Use another account". buttons[0]!.click(); await verifySelectAccountLacrosCalled(''); + // Click account buttons. + buttons[1]!.click(); + await verifySelectAccountLacrosCalled('gaia-id-0'); + }); + + test('accountButtonsDisabledAfterClick', async function() { + flushTasks(); + // Add some accounts. + webUIListenerCallback( + 'available-accounts-changed', generateAccountsList(3)); + flushTasks(); + const accounts_buttons = + testElement.shadowRoot!.querySelectorAll<HTMLButtonElement>( + '#buttonsContainer > button'); + assertTrue(!!accounts_buttons); + assertEquals(accounts_buttons.length, 3); + accounts_buttons[0]!.click(); + accounts_buttons.forEach(button => { + assertTrue(button.disabled); + }); + const other_account_button = + testElement.shadowRoot!.querySelector<HTMLButtonElement>( + '#other-account-button'); + assertTrue(!!other_account_button); + assertTrue(other_account_button.disabled); }); }); });
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc index 7a5cd652b..e7dbe1882 100644 --- a/chrome/updater/update_service_impl.cc +++ b/chrome/updater/update_service_impl.cc
@@ -250,12 +250,6 @@ return; } persisted_data_->RegisterApp(request); - update_client::CrxComponent crx_component; - crx_component.app_id = request.app_id; - crx_component.version = request.version; - crx_component.requires_network_encryption = false; - crx_component.ap = request.ap; - crx_component.brand = request.brand_code; std::move(callback).Run(RegistrationResponse(kRegistrationSuccess)); } @@ -382,10 +376,9 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); int policy = kPolicyEnabled; - if (IsUpdateDisabledByPolicy(app_id, priority, policy_same_version_update, - policy)) { - HandleUpdateDisabledByPolicy(app_id, policy, policy_same_version_update, - state_update, std::move(callback)); + if (IsUpdateDisabledByPolicy(app_id, priority, false, policy)) { + HandleUpdateDisabledByPolicy(app_id, policy, false, state_update, + std::move(callback)); return; } @@ -405,7 +398,28 @@ Callback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); VLOG(1) << __func__; - // TODO(crbug.com/1311743): Implement. + int policy = kPolicyEnabled; + if (IsUpdateDisabledByPolicy(registration.app_id, priority, true, policy)) { + HandleUpdateDisabledByPolicy(registration.app_id, policy, true, + state_update, std::move(callback)); + return; + } + if (registration.app_id != kUpdaterAppId) { + persisted_data_->SetHadApps(); + } + if (!persisted_data_->GetProductVersion(registration.app_id).IsValid()) { + // Only overwrite the registration if there's no current registration. + persisted_data_->RegisterApp(registration); + } + // TODO(crbug.com/1290331): Retain the cancellation callback. + update_client_->Install( + install_data_index, + base::BindOnce(&GetComponents, config_, persisted_data_, + AppInstallDataIndex({std::make_pair(registration.app_id, + install_data_index)}), + false, false, PolicySameVersionUpdate::kAllowed), + MakeUpdateClientCrxStateChangeCallback(config_, state_update), + MakeUpdateClientCallback(std::move(callback))); } void UpdateServiceImpl::CancelInstalls(const std::string& app_id) { @@ -425,11 +439,9 @@ VLOG(1) << __func__; int policy = kPolicyEnabled; - if (IsUpdateDisabledByPolicy(app_id, Priority::kForeground, - PolicySameVersionUpdate::kAllowed, policy)) { - HandleUpdateDisabledByPolicy(app_id, policy, - PolicySameVersionUpdate::kAllowed, - state_update, std::move(callback)); + if (IsUpdateDisabledByPolicy(app_id, Priority::kForeground, true, policy)) { + HandleUpdateDisabledByPolicy(app_id, policy, true, state_update, + std::move(callback)); return; } @@ -498,18 +510,15 @@ state_update, app_info.app_id, std::move(callback))); } -bool UpdateServiceImpl::IsUpdateDisabledByPolicy( - const std::string& app_id, - Priority priority, - PolicySameVersionUpdate policy_same_version_update, - int& policy) { +bool UpdateServiceImpl::IsUpdateDisabledByPolicy(const std::string& app_id, + Priority priority, + bool is_install, + int& policy) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); policy = kPolicyEnabled; - // The Install case is inferred by the presence of - // `PolicySameVersionUpdate::kAllowed`. - if (policy_same_version_update == PolicySameVersionUpdate::kAllowed) { + if (is_install) { return config_->GetPolicyService()->GetEffectivePolicyForAppInstalls( app_id, nullptr, &policy) && (policy == kPolicyDisabled || (config_->IsPerUserInstall() && @@ -528,7 +537,7 @@ void UpdateServiceImpl::HandleUpdateDisabledByPolicy( const std::string& app_id, int policy, - PolicySameVersionUpdate policy_same_version_update, + bool is_install, StateChangeCallback state_update, Callback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -538,11 +547,10 @@ update_state.state = UpdateService::UpdateState::State::kUpdateError; update_state.error_category = UpdateService::ErrorCategory::kUpdateCheck; update_state.error_code = - policy_same_version_update == PolicySameVersionUpdate::kAllowed - ? GOOPDATE_E_APP_INSTALL_DISABLED_BY_POLICY - : policy != kPolicyAutomaticUpdatesOnly - ? GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY - : GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY_MANUAL; + is_install ? GOOPDATE_E_APP_INSTALL_DISABLED_BY_POLICY + : policy != kPolicyAutomaticUpdatesOnly + ? GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY + : GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY_MANUAL; update_state.extra_code1 = 0; base::BindPostTask(main_task_runner_, state_update).Run(update_state); @@ -559,23 +567,6 @@ bool update_blocked) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(crbug.com/1311743): The Install case is inferred by the presence of - // `PolicySameVersionUpdate::kAllowed` and only having one app. - if (policy_same_version_update == PolicySameVersionUpdate::kAllowed && - app_install_data_index.size() == 1) { - main_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - base::IgnoreResult(&update_client::UpdateClient::Install), - update_client_, app_install_data_index.begin()->first, - base::BindOnce(&GetComponents, config_, persisted_data_, - app_install_data_index, false, update_blocked, - policy_same_version_update), - MakeUpdateClientCrxStateChangeCallback(config_, state_update), - MakeUpdateClientCallback(std::move(callback)))); - return; - } - main_task_runner_->PostTask( FROM_HERE, base::BindOnce(
diff --git a/chrome/updater/update_service_impl.h b/chrome/updater/update_service_impl.h index 952038a..b142d0d 100644 --- a/chrome/updater/update_service_impl.h +++ b/chrome/updater/update_service_impl.h
@@ -80,17 +80,15 @@ // Pops `tasks_`, and calls TaskStart. void TaskDone(); - bool IsUpdateDisabledByPolicy( - const std::string& app_id, - Priority priority, - PolicySameVersionUpdate policy_same_version_update, - int& policy); - void HandleUpdateDisabledByPolicy( - const std::string& app_id, - int policy, - PolicySameVersionUpdate policy_same_version_update, - StateChangeCallback state_update, - Callback callback); + bool IsUpdateDisabledByPolicy(const std::string& app_id, + Priority priority, + bool is_install, + int& policy); + void HandleUpdateDisabledByPolicy(const std::string& app_id, + int policy, + bool is_install, + StateChangeCallback state_update, + Callback callback); void OnShouldBlockUpdateForMeteredNetwork( StateChangeCallback state_update,
diff --git a/chrome/updater/win/app_install_controller.cc b/chrome/updater/win/app_install_controller.cc index 65e3298..fcd2d9e 100644 --- a/chrome/updater/win/app_install_controller.cc +++ b/chrome/updater/win/app_install_controller.cc
@@ -574,23 +574,11 @@ tag_args && tag_args->usage_stats_enable && *tag_args->usage_stats_enable), base::BindOnce( - &UpdateService::RegisterApp, update_service_, request, - base::BindOnce( - [](scoped_refptr<AppInstallControllerImpl> self, - const RegistrationResponse& response) { - DCHECK(response.status_code == kRegistrationSuccess || - response.status_code == kRegistrationAlreadyRegistered); - self->update_service_->Update( - self->app_id_, - GetInstallDataIndexFromAppArgs(self->app_id_), - UpdateService::Priority::kForeground, - UpdateService::PolicySameVersionUpdate::kAllowed, - base::BindRepeating(&AppInstallControllerImpl::StateChange, - self), - base::BindOnce(&AppInstallControllerImpl::InstallComplete, - self)); - }, - base::WrapRefCounted(this)))); + &UpdateService::Install, update_service_, request, + GetInstallDataIndexFromAppArgs(app_id_), + UpdateService::Priority::kForeground, + base::BindRepeating(&AppInstallControllerImpl::StateChange, this), + base::BindOnce(&AppInstallControllerImpl::InstallComplete, this))); } void AppInstallControllerImpl::InstallAppOffline(
diff --git a/chrome/updater/win/win_util.cc b/chrome/updater/win/win_util.cc index 10bfcc6e..a66f925 100644 --- a/chrome/updater/win/win_util.cc +++ b/chrome/updater/win/win_util.cc
@@ -510,8 +510,7 @@ return true; } -// TODO(crbug.com/1212187): maybe handle filtered tokens. -HRESULT IsUserAdmin(bool& is_user_admin) { +HRESULT IsTokenAdmin(HANDLE token, bool& is_token_admin) { SID_IDENTIFIER_AUTHORITY nt_authority = SECURITY_NT_AUTHORITY; PSID administrators_group = nullptr; if (!::AllocateAndInitializeSid(&nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID, @@ -522,12 +521,17 @@ base::ScopedClosureRunner free_sid( base::BindOnce([](PSID sid) { ::FreeSid(sid); }, administrators_group)); BOOL is_member = false; - if (!::CheckTokenMembership(NULL, administrators_group, &is_member)) + if (!::CheckTokenMembership(token, administrators_group, &is_member)) return HRESULTFromLastError(); - is_user_admin = is_member; + is_token_admin = is_member; return S_OK; } +// TODO(crbug.com/1212187): maybe handle filtered tokens. +HRESULT IsUserAdmin(bool& is_user_admin) { + return IsTokenAdmin(NULL, is_user_admin); +} + HRESULT IsUserNonElevatedAdmin(bool& is_user_non_elevated_admin) { HANDLE token = NULL; if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_READ, &token))
diff --git a/chrome/updater/win/win_util.h b/chrome/updater/win/win_util.h index 1789f570..2108bec 100644 --- a/chrome/updater/win/win_util.h +++ b/chrome/updater/win/win_util.h
@@ -168,6 +168,10 @@ // Returns a logged on user token handle from the current session. base::win::ScopedHandle GetUserTokenFromCurrentSessionId(); +// Sets `is_token_admin` to `true` if the token is an elevated administrator. If +// `token` is `NULL`, the current thread token is used. +HRESULT IsTokenAdmin(HANDLE token, bool& is_token_admin); + // Sets `is_user_admin` to true if the user is running as an elevated // administrator. HRESULT IsUserAdmin(bool& is_user_admin);
diff --git a/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc b/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc index 38c8be3..65aaeac2 100644 --- a/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc +++ b/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
@@ -342,7 +342,7 @@ MinidumpParams params; // Fork the process. - pid_t pid = base::ForkWithFlags(0u, nullptr, nullptr); + pid_t pid = base::ForkWithFlags(0, nullptr, nullptr); if (pid != 0) { // The child process should instantiate a manager which immediately grabs // the lock, and falls aleep for some period of time, then writes a dump,
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc index 2c60185..35951efe 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
@@ -79,42 +79,68 @@ // Used to track the fake instance, mirrors the instance in the base class. FakeUserDataAuthClient* g_instance = nullptr; -// Used to construct a functor/visitor with overloaded `operator()` from a list -// of lambdas. Useful for visiting absl::variant. -template <class... Ts> -struct OverloadedFunctor : Ts... { - using Ts::operator()...; +// `OverloadedFunctor` and `FunctorWithReturnType` are used to implement +// `Overload`, which constructs a visitor appropriate for use with +// `absl::visit` from lambdas for each case. + +// A functor combining the `operator()` definitions of a list of functors into +// a single functor with overloaded `operator()`. +template <class... Functors> +struct OverloadedFunctor : Functors... { + using Functors::operator()...; }; -template <class... Ts> -OverloadedFunctor<Ts...> Overload(Ts&&... ts) { - return OverloadedFunctor<Ts...>{std::forward<Ts>(ts)...}; + +// Used to fix the return type of a functor with overloaded `operator()`. +// This is useful in case the `operator()` overloads have different return +// types, but all return types are convertible into the intended fixed +// `ReturnType`. +template <class ReturnType, class Functor> +struct FunctorWithReturnType { + template <class Arg> + ReturnType operator()(Arg&& arg) { + return functor(std::forward<Arg>(arg)); + } + + Functor functor; +}; + +// `Overload` constructs a visitor appropriate for use with `absl::visit` from +// a number of lambdas for each case. The return type of each provided lambda +// must be convertible to `ReturnType`, and the `operator()` of the combined +// visitor will always return `ReturnType`. +template <class ReturnType, class... Functors> +FunctorWithReturnType<ReturnType, OverloadedFunctor<Functors...>> Overload( + Functors... functors) { + return {{std::move(functors)...}}; } absl::optional<cryptohome::KeyData> AuthFactorToKeyData( std::string label, const FakeAuthFactor& factor) { - absl::optional<cryptohome::KeyData> data; - absl::visit(Overload( - [&](const PasswordFactor& password) { - data = cryptohome::KeyData(); - data->set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD); - data->set_label(std::move(label)); - }, - [&](const PinFactor& pin) { - data = cryptohome::KeyData(); - data->set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD); - data->set_label(std::move(label)); - data->mutable_policy()->set_low_entropy_credential(true); - data->mutable_policy()->set_auth_locked(pin.locked); - }, - [&](const RecoveryFactor& recovery) { data = absl::nullopt; }, - [&](const KioskFactor& kiosk) { - data = cryptohome::KeyData(); - data->set_type(cryptohome::KeyData::KEY_TYPE_KIOSK); - data->set_label(std::move(label)); - }), - factor); - return data; + return absl::visit( + Overload<absl::optional<cryptohome::KeyData>>( + [&](const PasswordFactor& password) { + cryptohome::KeyData data; + data.set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD); + data.set_label(std::move(label)); + return data; + }, + [&](const PinFactor& pin) { + cryptohome::KeyData data; + data.set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD); + data.set_label(std::move(label)); + data.mutable_policy()->set_low_entropy_credential(true); + data.mutable_policy()->set_auth_locked(pin.locked); + return data; + }, + [&](const RecoveryFactor&) { return absl::nullopt; }, + [&](const KioskFactor& kiosk) { + cryptohome::KeyData data; + data.set_type(cryptohome::KeyData::KEY_TYPE_KIOSK); + data.set_label(std::move(label)); + return data; + }), + factor); } // Helper that automatically sends a reply struct to a supplied callback when @@ -407,7 +433,7 @@ const FakeAuthFactor& factor = factor_it->second; absl::visit( - Overload( + Overload<void>( [&](const PasswordFactor& password) { const std::string& secret = key.secret(); if (password.password != secret) {
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index bf35fed1..fc5a0e5b 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -3437,6 +3437,9 @@ <message name="IDS_FEEDBACK_TOOL_ANONYMOUS_EMAIL_OPTION" desc="Option in the drop down menu to let the user send the feedback report without attaching their email."> Don't include email address </message> + <message name="IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL" desc="Label showing the share page url."> + Share URL: + </message> <message name="IDS_FEEDBACK_TOOL_SHARE_DIAGNOSTIC_DATA_LABEL" desc="Label showing the share diagnostic data."> Share diagnostic data </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL.png.sha1 new file mode 100644 index 0000000..caf87a3 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL.png.sha1
@@ -0,0 +1 @@ +5e254308593225f67778d525a4a5ec6b6d735b5b \ No newline at end of file
diff --git a/chromeos/crosapi/mojom/test_controller.mojom b/chromeos/crosapi/mojom/test_controller.mojom index 126acf2..fdb008c 100644 --- a/chromeos/crosapi/mojom/test_controller.mojom +++ b/chromeos/crosapi/mojom/test_controller.mojom
@@ -4,8 +4,9 @@ module crosapi.mojom; -import "ui/gfx/geometry/mojom/geometry.mojom"; import "chromeos/crosapi/mojom/app_service_types.mojom"; +import "mojo/public/mojom/base/values.mojom"; +import "ui/gfx/geometry/mojom/geometry.mojom"; [Stable, Extensible] enum TouchEventType { @@ -65,10 +66,58 @@ }; // This interface is implemented by Ash-Chrome. +// It enables tests in Lacros-Chrome to access the TestInterfaces +// of chromeos::Shill*Client classes. +[Stable, Uuid="12d5dbb4-e974-4f41-820e-6d92c2215452"] +interface ShillClientTestInterface { + // From chromeos::ShillDeviceClient::TestInterface: + + // Adds a fake networking device. + AddDevice@0(string device_path, string type,string name) => (); + // Clear all fake networking devices. + ClearDevices@1() => (); + // Sets a property on the given fake device. + SetDeviceProperty@2(string device_path, + string name, + mojo_base.mojom.Value value, + bool notify_changed) => (); + // Sets whether the SIM in the given fake device should be locked. + SetSimLocked@3(string device_path, bool enabled) => (); + + // From chromeos::ShillServiceClient::TestInterface: + + // Adds a Service to the Manager and Service stubs. + AddService@4(string service_path, + string guid, + string name, + string type, + string state, + bool visible) => (); + // Clears all Services from the Manager and Service stubs. + ClearServices@5() => (); + // Sets a property of the specified service. + SetServiceProperty@6(string service_path, string property, + mojo_base.mojom.Value value) => (); + + // From chromeos::ShillProfileClient::TestInterface: + + // Adds a profile. + AddProfile@7(string profile_path, string userhash) => (); + // Adds a service to the profile, copying properties from the + // ShillServiceClient entry matching |service_path|. + AddServiceToProfile@8(string profile_path, string service_path) => (); + + // From chromeos::ShillIPConfigClient::TestInterface: + + // Adds an IPConfig entry. + AddIPConfig@9(string ip_config_path, mojo_base.mojom.Value properties) => (); +}; + +// This interface is implemented by Ash-Chrome. // This interface provides tests a mechanism to mutate or query ash. // In the future, this interface may merge with an automation or a11y interface. -// Next version: 16 -// Next method id: 25 +// Next version: 17 +// Next method id: 27 [Stable, Uuid="1f93f9d7-e466-466c-a675-c21b48cf30d3"] interface TestController { // Clicks the middle of the views element identified by |element_name|. @@ -209,4 +258,14 @@ // Creates and then cancels a print job. [MinVersion=15] CreateAndCancelPrintJob@24(string job_title) => (); + + // Binds a |shill_client| that Lacros-Chrome can use to access the Shill + // test intefaces in Ash-Chrome. + [MinVersion=16] + BindShillClientTestInterface@25( + pending_receiver<ShillClientTestInterface> shill_client) => (); + + // Returns the sanitized (aka "hashed") username of the active user. + [MinVersion=16] + GetSanitizedActiveUsername@26() => (string sanitized_active_username); };
diff --git a/chromeos/dbus/missive/fake_missive_client.cc b/chromeos/dbus/missive/fake_missive_client.cc index c156e340..38e1a2e 100644 --- a/chromeos/dbus/missive/fake_missive_client.cc +++ b/chromeos/dbus/missive/fake_missive_client.cc
@@ -28,6 +28,9 @@ const reporting::Priority priority, reporting::Record record, base::OnceCallback<void(reporting::Status)> completion_callback) { + for (auto& observer : observer_list_) { + observer.OnRecordEnqueued(priority, record); + } enqueued_records_[priority].push_back(std::move(record)); std::move(completion_callback).Run(reporting::Status::StatusOK()); } @@ -62,4 +65,12 @@ return enqueued_records_[priority]; } +void FakeMissiveClient::AddObserver(Observer* observer) { + observer_list_.AddObserver(observer); +} + +void FakeMissiveClient::RemoveObserver(Observer* observer) { + observer_list_.RemoveObserver(observer); +} + } // namespace chromeos
diff --git a/chromeos/dbus/missive/fake_missive_client.h b/chromeos/dbus/missive/fake_missive_client.h index b422faf..3125d31 100644 --- a/chromeos/dbus/missive/fake_missive_client.h +++ b/chromeos/dbus/missive/fake_missive_client.h
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/containers/flat_map.h" #include "base/memory/weak_ptr.h" +#include "base/observer_list.h" #include "base/task/sequenced_task_runner.h" #include "chromeos/dbus/missive/missive_client.h" #include "components/reporting/proto/synced/record.pb.h" @@ -48,10 +49,13 @@ // |MissiveClient::TestInterface| implementation: const std::vector<::reporting::Record>& GetEnqueuedRecords( ::reporting::Priority priority) override; + void AddObserver(Observer* observer) override; + void RemoveObserver(Observer* observer) override; private: base::flat_map<::reporting::Priority, std::vector<::reporting::Record>> enqueued_records_; + base::ObserverList<Observer> observer_list_; // Weak pointer factory - must be last member of the class. base::WeakPtrFactory<FakeMissiveClient> weak_ptr_factory_{this};
diff --git a/chromeos/dbus/missive/missive_client.h b/chromeos/dbus/missive/missive_client.h index d83af7d..0a76366 100644 --- a/chromeos/dbus/missive/missive_client.h +++ b/chromeos/dbus/missive/missive_client.h
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/component_export.h" #include "base/memory/weak_ptr.h" +#include "base/observer_list_types.h" #include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" #include "components/reporting/proto/synced/interface.pb.h" @@ -32,9 +33,18 @@ // only implemented in the fake implementation. class TestInterface { public: + class Observer : public base::CheckedObserver { + public: + virtual void OnRecordEnqueued(reporting::Priority priority, + const reporting::Record& record) = 0; + }; + virtual const std::vector<::reporting::Record>& GetEnqueuedRecords( ::reporting::Priority) = 0; + virtual void AddObserver(Observer* observer) = 0; + virtual void RemoveObserver(Observer* observer) = 0; + protected: virtual ~TestInterface() = default; };
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 7e7b37d..972101fa 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "10.28", - "log_list_timestamp": "2022-06-30T12:53:54Z", + "version": "10.35", + "log_list_timestamp": "2022-07-07T12:54:44Z", "operators": [ { "name": "Google",
diff --git a/components/device_reauth/biometric_authenticator.h b/components/device_reauth/biometric_authenticator.h index 5659fe9..c50704c 100644 --- a/components/device_reauth/biometric_authenticator.h +++ b/components/device_reauth/biometric_authenticator.h
@@ -45,37 +45,6 @@ kMaxValue = kIncognitoReauthPage, }; -// The result of the biometric authentication. -// -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. -enum class BiometricAuthFinalResult { - // This value is used for when we don't know the exact auth method used. This - // can be the case on Android versions under 11. - kSuccessWithUnknownMethod = 0, - kSuccessWithBiometrics = 1, - kSuccessWithDeviceLock = 2, - kCanceledByUser = 3, - kFailed = 4, - - // Deprecated in favour of kCanceledByChrome. Recorded when the auth succeeds - // after Chrome cancelled it. - // kSuccessButCanceled = 5, - - // Deprecated in favour of kCanceledByChrome. Recorded when the auth fails - // after Chrome cancelled it. - // kFailedAndCanceled = 6, - - // Recorded if an authentication was requested within 60s of the previous - // successful authentication. - kAuthStillValid = 7, - - // Recorded when the authentication flow is cancelled by Chrome. - kCanceledByChrome = 8, - - kMaxValue = kCanceledByChrome, -}; - // This interface encapsulates operations related to biometric authentication. // It's intended to be used prior to sharing the user's credentials with a // website, either via form filling or the Credential Management API. @@ -96,6 +65,15 @@ virtual void Authenticate(BiometricAuthRequester requester, AuthenticateCallback callback) = 0; + // Asks the user to authenticate. Invokes |callback| asynchronously when + // the auth flow returns with the result. + // |requester| is the filling surface that is asking for authentication. + // |message| contains text that will be displayed to the end user on + // authentication request + virtual void AuthenticateWithMessage(BiometricAuthRequester requester, + const std::u16string message, + AuthenticateCallback callback) = 0; + // Cancels an in-progress authentication if the filling surface requesting // the cancelation corresponds to the one for which the ongoing auth was // triggered.
diff --git a/components/device_reauth/mock_biometric_authenticator.h b/components/device_reauth/mock_biometric_authenticator.h index 7cdd7c9..f79b5d6 100644 --- a/components/device_reauth/mock_biometric_authenticator.h +++ b/components/device_reauth/mock_biometric_authenticator.h
@@ -21,6 +21,12 @@ Authenticate, (BiometricAuthRequester, AuthenticateCallback), (override)); + MOCK_METHOD(void, + AuthenticateWithMessage, + (BiometricAuthRequester, + const std::u16string, + AuthenticateCallback), + (override)); MOCK_METHOD(void, Cancel, (BiometricAuthRequester), (override)); private:
diff --git a/components/exo/wayland/wayland_display_observer.cc b/components/exo/wayland/wayland_display_observer.cc index 5d91b1b..4d2812f 100644 --- a/components/exo/wayland/wayland_display_observer.cc +++ b/components/exo/wayland/wayland_display_observer.cc
@@ -151,6 +151,10 @@ size.height()); } +void WaylandDisplayHandler::XdgOutputSendDescription(const std::string& desc) { + zxdg_output_v1_send_description(xdg_output_resource_, desc.c_str()); +} + bool WaylandDisplayHandler::SendDisplayMetrics(const display::Display& display, uint32_t changed_metrics) { if (!output_resource_) @@ -219,6 +223,7 @@ if (xdg_output_resource_) { XdgOutputSendLogicalPosition(origin); XdgOutputSendLogicalSize(display.bounds().size()); + XdgOutputSendDescription(display.label()); } else { if (wl_resource_get_version(output_resource_) >= WL_OUTPUT_SCALE_SINCE_VERSION) {
diff --git a/components/exo/wayland/wayland_display_observer.h b/components/exo/wayland/wayland_display_observer.h index 5796e4e..9645e6a 100644 --- a/components/exo/wayland/wayland_display_observer.h +++ b/components/exo/wayland/wayland_display_observer.h
@@ -71,6 +71,7 @@ // Overridable for testing. virtual void XdgOutputSendLogicalPosition(const gfx::Point& position); virtual void XdgOutputSendLogicalSize(const gfx::Size& size); + virtual void XdgOutputSendDescription(const std::string& desc); private: // Overridden from WaylandDisplayObserver:
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc index f1a03ecd..33e8bf0 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc
@@ -15,6 +15,7 @@ #include "base/strings/strcat.h" #include "base/trace_event/trace_event.h" #include "components/password_manager/core/browser/password_store_backend.h" +#include "components/password_manager/core/browser/password_sync_util.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" @@ -24,6 +25,8 @@ namespace { +using sync_util::IsPasswordSyncEnabled; + // Threshold for the next migration attempt. This is needed in order to prevent // clients from spamming GMS Core API. constexpr base::TimeDelta kMigrationThreshold = base::Days(1); @@ -95,12 +98,10 @@ BuiltInBackendToAndroidBackendMigrator::BuiltInBackendToAndroidBackendMigrator( PasswordStoreBackend* built_in_backend, PasswordStoreBackend* android_backend, - PrefService* prefs, - PasswordStoreBackend::SyncDelegate* sync_delegate) + PrefService* prefs) : built_in_backend_(built_in_backend), android_backend_(android_backend), - prefs_(prefs), - sync_delegate_(sync_delegate) { + prefs_(prefs) { DCHECK(built_in_backend_); DCHECK(android_backend_); base::UmaHistogramBoolean( @@ -132,9 +133,13 @@ } } +void BuiltInBackendToAndroidBackendMigrator::OnSyncServiceInitialized( + syncer::SyncService* sync_service) { + sync_service_ = sync_service; +} + void BuiltInBackendToAndroidBackendMigrator::UpdateMigrationVersionInPref() { - if (IsMigrationNeeded(prefs_) && - sync_delegate_->IsSyncingPasswordsEnabled()) { + if (IsMigrationNeeded(prefs_) && IsPasswordSyncEnabled(sync_service_)) { // TODO(crbug.com/1302299): Drop metadata and only then update pref. } prefs_->SetInteger(prefs::kCurrentMigrationVersionToGoogleMobileServices, @@ -161,7 +166,7 @@ // identical. Update calls don't fail because they would add a password in // the rare case that it doesn't exist in the target backend. if (IsMigrationNeeded(prefs_)) { - if (sync_delegate_->IsSyncingPasswordsEnabled()) { + if (IsPasswordSyncEnabled(sync_service_)) { // Sync is enabled. Migrate non-syncable data from the built-in backend // to android backend. built_in_backend_->GetAllLoginsAsync(base::BindOnce( @@ -492,7 +497,7 @@ // non-syncable data (e.g. after enrolling into the experiment). return IsMigrationNeeded(prefs_) && (prefs_->GetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange) || - sync_delegate_->IsSyncingPasswordsEnabled()); + IsPasswordSyncEnabled(sync_service_)); } } // namespace password_manager
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h index 2e13817..243902f 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h
@@ -19,11 +19,9 @@ public: // |built_in_backend| and |android_backend| must not be null and must outlive // the migrator. - BuiltInBackendToAndroidBackendMigrator( - PasswordStoreBackend* built_in_backend, - PasswordStoreBackend* android_backend, - PrefService* prefs, - PasswordStoreBackend::SyncDelegate* sync_delegate); + BuiltInBackendToAndroidBackendMigrator(PasswordStoreBackend* built_in_backend, + PasswordStoreBackend* android_backend, + PrefService* prefs); BuiltInBackendToAndroidBackendMigrator( const BuiltInBackendToAndroidBackendMigrator&) = delete; @@ -37,6 +35,8 @@ void StartMigrationIfNecessary(); + void OnSyncServiceInitialized(syncer::SyncService* sync_service); + private: struct IsPasswordLess; struct BackendAndLoginsResults; @@ -111,7 +111,7 @@ std::unique_ptr<MigrationMetricsReporter> metrics_reporter_; - const raw_ptr<PasswordStoreBackend::SyncDelegate> sync_delegate_; + raw_ptr<const syncer::SyncService> sync_service_ = nullptr; bool non_syncable_data_migration_in_progress_ = false;
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc index f35ad15..45cbda25 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc
@@ -22,6 +22,7 @@ #include "components/prefs/pref_service.h" #include "components/prefs/testing_pref_service.h" #include "components/signin/public/base/signin_pref_names.h" +#include "components/sync/driver/test_sync_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -69,11 +70,28 @@ prefs::kRequiresMigrationAfterSyncStatusChange, false); prefs_.registry()->RegisterStringPref(::prefs::kGoogleServicesLastUsername, "testaccount@gmail.com"); - migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>( - &built_in_backend_, &android_backend_, &prefs_, &sync_delegate_); + CreateMigrator(&built_in_backend_, &android_backend_, &prefs_); } - MockPasswordBackendSyncDelegate& sync_delegate() { return sync_delegate_; } + void InitSyncService(bool is_password_sync_enabled) { + if (is_password_sync_enabled) { + sync_service_.GetUserSettings()->SetSelectedTypes( + /*sync_everything=*/false, + /*types=*/{syncer::UserSelectableType::kPasswords}); + } else { + sync_service_.GetUserSettings()->SetSelectedTypes( + /*sync_everything=*/false, /*types=*/{}); + } + migrator()->OnSyncServiceInitialized(&sync_service_); + } + + void CreateMigrator(PasswordStoreBackend* built_in_backend, + PasswordStoreBackend* android_backend, + PrefService* prefs) { + migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>( + built_in_backend, android_backend, prefs); + } + PasswordStoreBackend& built_in_backend() { return built_in_backend_; } PasswordStoreBackend& android_backend() { return android_backend_; } @@ -84,14 +102,12 @@ void RunUntilIdle() { task_env_.RunUntilIdle(); } void FastForwardBy(base::TimeDelta delta) { task_env_.FastForwardBy(delta); } - protected: - testing::StrictMock<MockPasswordBackendSyncDelegate> sync_delegate_; - private: base::test::SingleThreadTaskEnvironment task_env_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::test::ScopedFeatureList feature_list_; TestingPrefServiceSimple prefs_; + syncer::TestSyncService sync_service_; FakePasswordStoreBackend built_in_backend_; FakePasswordStoreBackend android_backend_{ IsAccountStore(false), @@ -105,8 +121,7 @@ /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid, {{"migration_version", "1"}, {"stage", "0"}}); Init(); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(true)); + InitSyncService(/*is_password_sync_enabled=*/true); migrator()->StartMigrationIfNecessary(); RunUntilIdle(); @@ -125,8 +140,7 @@ {{"migration_version", "1"}, {"stage", "0"}}); Init(); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); + InitSyncService(/*is_password_sync_enabled=*/false); migrator()->StartMigrationIfNecessary(); RunUntilIdle(); @@ -144,8 +158,7 @@ {{"migration_version", "1"}, {"stage", "3"}}); Init(); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); + InitSyncService(/*is_password_sync_enabled=*/false); migrator()->StartMigrationIfNecessary(); RunUntilIdle(); @@ -265,10 +278,10 @@ feature_list().InitAndEnableFeatureWithParameters( /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid, {{"migration_version", "1"}, {"stage", "0"}}); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(true)); Init(); + InitSyncService(/*is_password_sync_enabled=*/true); + PasswordForm form = CreateTestPasswordForm(); android_backend().AddLoginAsync(form, base::DoNothing()); @@ -300,8 +313,7 @@ // Simulate sync being recently disabled. prefs()->SetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange, true); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); + InitSyncService(/*is_password_sync_enabled=*/false); PasswordForm form = CreateTestPasswordForm(); built_in_backend().AddLoginAsync(form, base::DoNothing()); @@ -387,8 +399,7 @@ InitialMigrationForSyncingUsers) { BuiltInBackendToAndroidBackendMigratorTest::Init(); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(true)); + InitSyncService(/*is_password_sync_enabled=*/true); feature_list().InitAndEnableFeatureWithParameters( /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid, @@ -426,8 +437,7 @@ InitialMigration) { BuiltInBackendToAndroidBackendMigratorTest::Init(); - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); + InitSyncService(/*is_password_sync_enabled=*/false); feature_list().InitAndEnableFeatureWithParameters( /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid, @@ -570,15 +580,13 @@ "PasswordManager.UnifiedPasswordManager.RollingMigration.Success"; } - migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>( - &built_in_backend_, &android_backend_, prefs(), &sync_delegate()); + CreateMigrator(&built_in_backend_, &android_backend_, prefs()); } std::string latency_metric_; std::string success_metric_; ::testing::StrictMock<MockPasswordStoreBackend> built_in_backend_; ::testing::StrictMock<MockPasswordStoreBackend> android_backend_; - std::unique_ptr<BuiltInBackendToAndroidBackendMigrator> migrator_; }; TEST_P(BuiltInBackendToAndroidBackendMigratorTestMetrics, @@ -586,8 +594,7 @@ base::HistogramTester histogram_tester; // Initial migration only happens with sync enabled for now. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(GetParam().is_sync_enabled)); + InitSyncService(/*is_password_sync_enabled=*/GetParam().is_sync_enabled); EXPECT_CALL(built_in_backend_, GetAllLoginsAsync) .WillOnce(WithArg<0>(Invoke([](LoginsOrErrorReply reply) -> void { @@ -610,7 +617,7 @@ }))); } - migrator_->StartMigrationIfNecessary(); + migrator()->StartMigrationIfNecessary(); FastForwardBy(kLatencyDelta); histogram_tester.ExpectTotalCount(latency_metric_, 1); @@ -649,14 +656,12 @@ /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid, {{"migration_version", "1"}, {"stage", "0"}}); - migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>( - &built_in_backend_, &android_backend_, prefs(), &sync_delegate_); + CreateMigrator(&built_in_backend_, &android_backend_, prefs()); } PasswordStoreBackend& built_in_backend() { return built_in_backend_; } ::testing::NiceMock<MockPasswordStoreBackend> android_backend_; - std::unique_ptr<BuiltInBackendToAndroidBackendMigrator> migrator_; private: FakePasswordStoreBackend built_in_backend_; @@ -664,8 +669,7 @@ TEST_F(BuiltInBackendToAndroidBackendMigratorWithMockAndroidBackendTest, DoesNotCompleteMigrationWhenWritingToAndroidBackendFails_SyncOn) { - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(true)); + InitSyncService(/*is_password_sync_enabled=*/true); // Add two credentials to the built-in backend. built_in_backend().AddLoginAsync(CreateTestPasswordForm(/*index=*/1), @@ -687,7 +691,7 @@ // executed. Check that exactly one UpdateLoginAsync() is called. EXPECT_CALL(android_backend_, UpdateLoginAsync).Times(1); - migrator_->StartMigrationIfNecessary(); + migrator()->StartMigrationIfNecessary(); // Migration version is still 0 since migration didn't complete. EXPECT_EQ(0, prefs()->GetInteger( @@ -704,8 +708,7 @@ // Sync state doesn't affect this test, run it arbitrarily for non-sync'ing // users. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); + InitSyncService(/*is_password_sync_enabled=*/false); // Add two credentials to the built-in backend. built_in_backend().AddLoginAsync(CreateTestPasswordForm(/*index=*/1), @@ -734,7 +737,7 @@ // executed. Check that exactly one AddLoginAsync() is called. EXPECT_CALL(android_backend_, AddLoginAsync).Times(1); - migrator_->StartMigrationIfNecessary(); + migrator()->StartMigrationIfNecessary(); // Migration version is still 0 since migration didn't complete. EXPECT_EQ(0, prefs()->GetInteger(
diff --git a/components/password_manager/core/browser/mock_password_store_backend.cc b/components/password_manager/core/browser/mock_password_store_backend.cc index 4a5abb3f..86faa6f 100644 --- a/components/password_manager/core/browser/mock_password_store_backend.cc +++ b/components/password_manager/core/browser/mock_password_store_backend.cc
@@ -6,9 +6,6 @@ namespace password_manager { -MockPasswordBackendSyncDelegate::MockPasswordBackendSyncDelegate() = default; -MockPasswordBackendSyncDelegate::~MockPasswordBackendSyncDelegate() = default; - MockPasswordStoreBackend::MockPasswordStoreBackend() = default; MockPasswordStoreBackend::~MockPasswordStoreBackend() = default;
diff --git a/components/password_manager/core/browser/mock_password_store_backend.h b/components/password_manager/core/browser/mock_password_store_backend.h index 4707ff3..c687f45 100644 --- a/components/password_manager/core/browser/mock_password_store_backend.h +++ b/components/password_manager/core/browser/mock_password_store_backend.h
@@ -19,15 +19,6 @@ namespace password_manager { -class MockPasswordBackendSyncDelegate - : public PasswordStoreBackend::SyncDelegate { - public: - MockPasswordBackendSyncDelegate(); - ~MockPasswordBackendSyncDelegate() override; - - MOCK_METHOD(bool, IsSyncingPasswordsEnabled, (), (override)); -}; - class MockPasswordStoreBackend : public PasswordStoreBackend { public: MockPasswordStoreBackend();
diff --git a/components/password_manager/core/browser/password_store_backend.h b/components/password_manager/core/browser/password_store_backend.h index 727cce924..38be22eb 100644 --- a/components/password_manager/core/browser/password_store_backend.h +++ b/components/password_manager/core/browser/password_store_backend.h
@@ -56,22 +56,6 @@ // IO operation from possibly blocking the main thread. class PasswordStoreBackend { public: - // Delegate which provides information about current sync status and an - // account used for syncing. It can be called only after Sync service was - // instantiated. - class SyncDelegate { - public: - SyncDelegate() = default; - SyncDelegate(const SyncDelegate&) = delete; - SyncDelegate(SyncDelegate&&) = delete; - SyncDelegate& operator=(const SyncDelegate&) = delete; - SyncDelegate& operator=(SyncDelegate&&) = delete; - virtual ~SyncDelegate() = default; - - // Tells whether sync enabled or not. - virtual bool IsSyncingPasswordsEnabled() = 0; - }; - using RemoteChangesReceived = base::RepeatingCallback<void(absl::optional<PasswordStoreChangeList>)>; @@ -167,11 +151,10 @@ // Factory function for creating the backend. The Local backend requires the // provided `login_db_path` for storage and Android backend for migration - // purposes. |sync_delegate| is also required for migration purposes. + // purposes. static std::unique_ptr<PasswordStoreBackend> Create( const base::FilePath& login_db_path, - PrefService* prefs, - std::unique_ptr<SyncDelegate> sync_delegate); + PrefService* prefs); }; } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store_backend_migration_decorator.cc b/components/password_manager/core/browser/password_store_backend_migration_decorator.cc index 7def0d87..5945ff7 100644 --- a/components/password_manager/core/browser/password_store_backend_migration_decorator.cc +++ b/components/password_manager/core/browser/password_store_backend_migration_decorator.cc
@@ -20,6 +20,8 @@ namespace { +using sync_util::IsPasswordSyncEnabled; + // Time in seconds by which the passwords migration from the built-in backend to // the Android backend is delayed. constexpr int kMigrationToAndroidBackendDelay = 30; @@ -37,12 +39,10 @@ PasswordStoreBackendMigrationDecorator::PasswordStoreBackendMigrationDecorator( std::unique_ptr<PasswordStoreBackend> built_in_backend, std::unique_ptr<PasswordStoreBackend> android_backend, - PrefService* prefs, - std::unique_ptr<SyncDelegate> sync_delegate) + PrefService* prefs) : built_in_backend_(std::move(built_in_backend)), android_backend_(std::move(android_backend)), prefs_(prefs), - sync_delegate_(std::move(sync_delegate)), sync_settings_helper_(prefs) { DCHECK(built_in_backend_); DCHECK(android_backend_); @@ -151,8 +151,7 @@ // data in the remote store. For shadow traffic, this doesn't matter. if (ShouldAttemptMigration(prefs_)) { migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>( - built_in_backend_.get(), android_backend_.get(), prefs_, - sync_delegate_.get()); + built_in_backend_.get(), android_backend_.get(), prefs_); base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce( @@ -282,12 +281,17 @@ sync_settings_helper_.CachePasswordSyncSettingOnStartup(sync_service); sync_service->AddObserver(&sync_settings_helper_); active_backend_->OnSyncServiceInitialized(sync_service); + if (migrator_) { + // The migrator exists only if prefs allow the migration. + DCHECK(ShouldAttemptMigration(prefs_)); + migrator_->OnSyncServiceInitialized(sync_service); + } } void PasswordStoreBackendMigrationDecorator::StartMigrationAfterInit() { DCHECK(migrator_); if (prefs_->GetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange) && - !sync_delegate_->IsSyncingPasswordsEnabled()) { + !IsPasswordSyncEnabled(sync_service_)) { // Sync was disabled at the end of the last session, but migration from // the android backend to the built-in backend didn't happen. It's not // safe to attempt to call the android backend to migrate logins. Disable
diff --git a/components/password_manager/core/browser/password_store_backend_migration_decorator.h b/components/password_manager/core/browser/password_store_backend_migration_decorator.h index 2dcab70..0296e5a2 100644 --- a/components/password_manager/core/browser/password_store_backend_migration_decorator.h +++ b/components/password_manager/core/browser/password_store_backend_migration_decorator.h
@@ -30,8 +30,7 @@ PasswordStoreBackendMigrationDecorator( std::unique_ptr<PasswordStoreBackend> built_in_backend, std::unique_ptr<PasswordStoreBackend> android_backend, - PrefService* prefs, - std::unique_ptr<SyncDelegate> sync_delegate); + PrefService* prefs); PasswordStoreBackendMigrationDecorator( const PasswordStoreBackendMigrationDecorator&) = delete; PasswordStoreBackendMigrationDecorator( @@ -151,8 +150,7 @@ const raw_ptr<PrefService> prefs_ = nullptr; - // A delegate used to retrieve sync status. - std::unique_ptr<SyncDelegate> sync_delegate_; + raw_ptr<const syncer::SyncService> sync_service_ = nullptr; std::unique_ptr<BuiltInBackendToAndroidBackendMigrator> migrator_;
diff --git a/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc b/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc index 03a7d30..490eded 100644 --- a/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc +++ b/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc
@@ -51,13 +51,9 @@ /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid, {{"migration_version", "1"}, {"stage", "0"}}); - std::unique_ptr<MockPasswordBackendSyncDelegate> sync_delegate = - std::make_unique<MockPasswordBackendSyncDelegate>(); - sync_delegate_ = sync_delegate.get(); backend_migration_decorator_ = std::make_unique<PasswordStoreBackendMigrationDecorator>( - CreateBuiltInBackend(), CreateAndroidBackend(), &prefs_, - std::move(sync_delegate)); + CreateBuiltInBackend(), CreateAndroidBackend(), &prefs_); } ~PasswordStoreBackendMigrationDecoratorTest() override { @@ -89,7 +85,6 @@ RunUntilIdle(); } - MockPasswordBackendSyncDelegate& sync_delegate() { return *sync_delegate_; } PasswordStoreBackend* backend_migration_decorator() { return backend_migration_decorator_.get(); } @@ -123,7 +118,6 @@ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::test::ScopedFeatureList feature_list_; TestingPrefServiceSimple prefs_; - raw_ptr<MockPasswordBackendSyncDelegate> sync_delegate_; raw_ptr<MockPasswordStoreBackend> built_in_backend_; raw_ptr<MockPasswordStoreBackend> android_backend_; syncer::TestSyncService sync_service_; @@ -224,10 +218,11 @@ /*sync_enabled_or_disabled_cb=*/base::DoNothing(), /*completion=*/mock_completion_callback.Get()); - // Invoke sync callback to simulate a change in sync status. Set expectation - // for sync to be turned off. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillOnce(Return(true)); + InitSyncService(/*is_password_sync_enabled=*/true); + + // Disable password sync in settings. + ChangeSyncSetting(/*is_password_sync_enabled=*/false); + // Invoke sync callback to simulate a change in sync status. EXPECT_CALL(*android_backend(), ClearAllLocalPasswords); sync_status_changed_closure.Run(); @@ -267,15 +262,15 @@ InitSyncService(/*is_password_sync_enabled=*/false); - // Invoke sync callback to simulate a change in sync status. Set expectation - // for sync to be turned on. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(true)); + // Enable password sync in settings. + ChangeSyncSetting(/*is_password_sync_enabled=*/true); + // Migration of non-syncable data to the android backend will trigger // login retrieval from the built-in backend first. EXPECT_CALL(*built_in_backend(), GetAllLoginsAsync); EXPECT_CALL(*android_backend(), GetAllLoginsAsync).Times(0); + // Invoke sync callback to simulate a change in sync status. sync_status_changed_closure.Run(); RunUntilIdle(); @@ -315,8 +310,6 @@ // Invoke sync callback to simulate appliying new setting. Set expectation // for sync to be turned off. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); // Migration of non-syncable data to the built-in backend will trigger // retrieval of logins for the last sync account from the android backend // first. @@ -337,9 +330,6 @@ PasswordStoreBackendMigrationDecoratorTest, ResetAutoSignInWhenInitBackendAfterSyncWasDisabledButSettingWasNotApplied) { prefs().SetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange, true); - // Set expectation for sync to be turned off. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); // Init backend. base::MockCallback<base::OnceCallback<void(bool)>> mock_completion_callback; @@ -363,6 +353,9 @@ /*sync_enabled_or_disabled_cb=*/base::DoNothing(), /*completion=*/mock_completion_callback.Get()); + // Set expectation for sync to be turned off. + InitSyncService(/*is_password_sync_enabled=*/false); + // Expect that autosignin will be disabled for logins in the buil-in backend. EXPECT_CALL(*built_in_backend(), DisableAutoSignInForOriginsAsync); FastForwardUntilNoTasksRemain(); @@ -400,8 +393,6 @@ ChangeSyncSetting(/*is_password_sync_enabled=*/false); // Invoke sync callback to simulate appliying new setting. Set expectation // for sync to be turned off. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(false)); // Migration of non-syncable data to the built-in backend will trigger // retrieval of logins for the last sync account from the android backend // first. @@ -431,9 +422,6 @@ ChangeSyncSetting(/*is_password_sync_enabled=*/true); // Invoke sync callback to simulate appliying new setting. Set expectation // for sync to be turned on. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(true)); - // Migration of non-syncable data should not start, as the previous // migration attempt is still running. EXPECT_CALL(*built_in_backend(), GetAllLoginsAsync).Times(0); @@ -471,15 +459,15 @@ InitSyncService(/*is_password_sync_enabled=*/false); - // Invoke sync callback to simulate a change in sync status. Set expectation - // for sync to be turned on. - EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled) - .WillRepeatedly(Return(true)); + // Enable password sync in settings. + ChangeSyncSetting(/*is_password_sync_enabled=*/true); + // Migration of non-syncable data to the android backend will not start and // therefore will not trigger any logins retrieval. EXPECT_CALL(*built_in_backend(), GetAllLoginsAsync).Times(0); EXPECT_CALL(*android_backend(), GetAllLoginsAsync).Times(0); + // Invoke sync callback to simulate a change in sync status. sync_status_changed_closure.Run(); RunUntilIdle();
diff --git a/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc b/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc index 3d80977..0d8d74f8 100644 --- a/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc +++ b/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc
@@ -134,7 +134,6 @@ base::test::ScopedFeatureList feature_list_; TestingPrefServiceSimple prefs_; std::unique_ptr<PasswordStoreProxyBackend> proxy_backend_; - testing::NiceMock<MockPasswordBackendSyncDelegate> sync_delegate_; StrictMock<MockPasswordStoreBackend> built_in_backend_; StrictMock<MockPasswordStoreBackend> android_backend_; syncer::TestSyncService sync_service_;
diff --git a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc index 5ce5177..7347dcc 100644 --- a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc +++ b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc
@@ -15,6 +15,7 @@ #include "base/metrics/histogram_functions.h" #include "base/scoped_observation.h" #include "base/stl_util.h" +#include "base/values.h" #include "components/password_manager/core/browser/password_store_interface.h" #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h" #include "components/password_manager/core/common/password_manager_features.h" @@ -324,10 +325,12 @@ base::Value::List SavedPasswordsCapabilitiesFetcher::GetCacheEntries() const { base::Value::List cache_entries; - for (const auto& [origin, capabilities] : cache_) { + for (const auto& [origin, _] : cache_) { base::Value::Dict entry; entry.Set("url", origin.Serialize()); - entry.Set("has_script", capabilities.has_script); + // Use `IsScriptAvailable` instead of reading it from the value directly + // to allow overriding by `kForceEnablePasswordDomainCapabilities`. + entry.Set("has_script", IsScriptAvailable(origin)); cache_entries.Append(std::move(entry)); }
diff --git a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc index 2d3a57c..5c9f085c 100644 --- a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc +++ b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc
@@ -5,12 +5,14 @@ #include "components/password_manager/core/browser/saved_passwords_capabilities_fetcher.h" #include "base/callback.h" +#include "base/ranges/algorithm.h" #include "base/test/gmock_callback_support.h" #include "base/test/gmock_move_support.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "base/values.h" #include "components/password_manager/core/browser/capabilities_service.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/test_password_store.h" @@ -28,6 +30,7 @@ using ::testing::Pair; using ::testing::SaveArg; using ::testing::SaveArgPointee; +using ::testing::StaticAssertTypeEq; using ::testing::UnorderedElementsAre; using testing::WithArgs; @@ -608,8 +611,8 @@ std::vector<std::string> urls; // Only `kOriginWithoutScript` is not expected to have a script. - for (auto it = cache_entries.begin(); it != cache_entries.end(); ++it) { - base::Value::Dict& entry = it->GetDict(); + for (const auto& element : cache_entries) { + const base::Value::Dict& entry = element.GetDict(); const std::string* url = entry.FindString("url"); absl::optional<bool> has_script = entry.FindBool("has_script"); EXPECT_TRUE(url); @@ -622,6 +625,18 @@ EXPECT_THAT(urls, UnorderedElementsAre(kOriginWithoutScript, kOriginWithScript1, kOriginWithScript2, kOriginWithScript3)); + + base::test::ScopedFeatureList features; + features.InitAndEnableFeature( + password_manager::features::kForceEnablePasswordDomainCapabilities); + // Now all domains should return available scripts. + cache_entries = fetcher_->GetCacheEntries(); + EXPECT_EQ(cache_entries.size(), 4u); + EXPECT_TRUE(base::ranges::all_of( + cache_entries.cbegin(), cache_entries.cend(), + [](const base::Value& element) { + return element.GetDict().FindBool("has_script").value_or(false); + })); } } // namespace password_manager
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn index ca123ef39..bd71040 100644 --- a/components/permissions/BUILD.gn +++ b/components/permissions/BUILD.gn
@@ -80,6 +80,8 @@ "permission_request_id.h", "permission_request_manager.cc", "permission_request_manager.h", + "permission_request_queue.cc", + "permission_request_queue.h", "permission_result.cc", "permission_result.h", "permission_ui_selector.cc", @@ -260,6 +262,7 @@ "permission_decision_auto_blocker_unittest.cc", "permission_manager_unittest.cc", "permission_request_manager_unittest.cc", + "permission_request_queue_unittest.cc", "permission_uma_util_unittest.cc", ] if (!is_android) {
diff --git a/components/permissions/permission_request_manager.cc b/components/permissions/permission_request_manager.cc index 55344b2..ca6f86a 100644 --- a/components/permissions/permission_request_manager.cc +++ b/components/permissions/permission_request_manager.cc
@@ -10,22 +10,18 @@ #include "base/auto_reset.h" #include "base/bind.h" #include "base/command_line.h" -#include "base/containers/circular_deque.h" -#include "base/feature_list.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" #include "base/observer_list.h" #include "base/stl_util.h" #include "base/threading/sequenced_task_runner_handle.h" -#include "build/build_config.h" #include "components/autofill_assistant/browser/public/runtime_manager.h" #include "components/back_forward_cache/back_forward_cache_disable.h" #include "components/permissions/features.h" #include "components/permissions/permission_decision_auto_blocker.h" #include "components/permissions/permission_prompt.h" #include "components/permissions/permission_request.h" -#include "components/permissions/permission_request_id.h" #include "components/permissions/permissions_client.h" #include "components/permissions/request_type.h" #include "components/permissions/switches.h" @@ -76,10 +72,10 @@ namespace { -// When there are multiple permissions requests in `queued_requests_`, we try to -// reorder them based on the acceptance rates. Notifications and Geolocations -// have one of the lowest acceptance, hence they have the lowest priority and -// will be shown the last. +// When there are multiple permissions requests in +// `pending_permission_requests_`, we try to prioritize them based on the +// acceptance rates. Notifications and Geolocations have one of the lowest +// acceptance, hence they have the lowest priority and will be shown the last. bool IsLowPriorityRequest(PermissionRequest* request) { return request->request_type() == RequestType::kNotifications || request->request_type() == RequestType::kGeolocation; @@ -140,7 +136,7 @@ PermissionRequestManager::~PermissionRequestManager() { DCHECK(!IsRequestInProgress()); DCHECK(duplicate_requests_.empty()); - DCHECK(queued_requests_.empty()); + DCHECK(pending_permission_requests_.IsEmpty()); } void PermissionRequestManager::AddRequest( @@ -325,7 +321,7 @@ void PermissionRequestManager::QueueRequest( content::RenderFrameHost* source_frame, PermissionRequest* request) { - PushQueuedRequest(request); + pending_permission_requests_.Push(request); request_sources_map_.emplace( request, PermissionRequestSource({source_frame->GetProcess()->GetID(), source_frame->GetRoutingID()})); @@ -334,7 +330,7 @@ void PermissionRequestManager::PreemptAndRequeueCurrentRequest() { ResetViewStateForCurrentRequest(); for (auto* current_request : requests_) { - PushQueuedRequest(current_request); + pending_permission_requests_.Push(current_request); } requests_.clear(); } @@ -377,12 +373,11 @@ return; } - if (!queued_requests_.empty() || IsRequestInProgress()) { - // |queued_requests_| and |requests_| will be deleted below, which - // might be a problem for back-forward cache — the page might be restored - // later, but the requests won't be. - // Disable bfcache here if we have any requests here to prevent this - // from happening. + if (!pending_permission_requests_.IsEmpty() || IsRequestInProgress()) { + // |pending_permission_requests_| and |requests_| will be deleted below, + // which might be a problem for back-forward cache — the page might be + // restored later, but the requests won't be. Disable bfcache here if we + // have any requests here to prevent this from happening. content::BackForwardCache::DisableForRenderFrameHost( navigation_handle->GetPreviousRenderFrameHostId(), back_forward_cache::DisabledReason( @@ -615,8 +610,8 @@ } // Find first valid request. - while (!queued_requests_.empty()) { - PermissionRequest* next = PopNextQueuedRequest(); + while (!pending_permission_requests_.IsEmpty()) { + PermissionRequest* next = pending_permission_requests_.Pop(); PermissionRequestSource& source = request_sources_map_.find(next)->second; if (!source.IsSourceFrameInactiveAndDisallowActivation()) { requests_.push_back(next); @@ -632,8 +627,9 @@ } // Find additional requests that can be grouped with the first one. - for (; !queued_requests_.empty(); PopNextQueuedRequest()) { - PermissionRequest* front = PeekNextQueuedRequest(); + for (; !pending_permission_requests_.IsEmpty(); + pending_permission_requests_.Pop()) { + PermissionRequest* front = pending_permission_requests_.Peek(); PermissionRequestSource& source = request_sources_map_.find(front)->second; if (source.IsSourceFrameInactiveAndDisallowActivation()) { front->Cancelled(); @@ -847,12 +843,13 @@ } void PermissionRequestManager::CleanUpRequests() { - for (auto* queued_request : queued_requests_) { - CancelledIncludingDuplicates(queued_request); - RequestFinishedIncludingDuplicates(queued_request); - request_sources_map_.erase(request_sources_map_.find(queued_request)); + for (; !pending_permission_requests_.IsEmpty(); + pending_permission_requests_.Pop()) { + auto* pending_request = pending_permission_requests_.Peek(); + CancelledIncludingDuplicates(pending_request); + RequestFinishedIncludingDuplicates(pending_request); + request_sources_map_.erase(request_sources_map_.find(pending_request)); } - queued_requests_.clear(); if (IsRequestInProgress()) { std::vector<PermissionRequest*>::iterator requests_iter; @@ -874,19 +871,15 @@ if (request->IsDuplicateOf(existing_request)) return existing_request; } - for (PermissionRequest* queued_request : queued_requests_) { - if (request->IsDuplicateOf(queued_request)) - return queued_request; - } - return nullptr; + return pending_permission_requests_.FindDuplicate(request); } void PermissionRequestManager::PermissionGrantedIncludingDuplicates( PermissionRequest* request, bool is_one_time) { - DCHECK_EQ(1, base::STLCount(requests_, request) + - base::STLCount(queued_requests_, request)) - << "Only requests in [queued_[frame_]]requests_ can have duplicates"; + DCHECK_EQ(1ul, base::STLCount(requests_, request) + + pending_permission_requests_.Count(request)) + << "Only requests in [pending_permission_]requests_ can have duplicates"; request->PermissionGranted(is_one_time); auto range = duplicate_requests_.equal_range(request); for (auto it = range.first; it != range.second; ++it) @@ -895,9 +888,9 @@ void PermissionRequestManager::PermissionDeniedIncludingDuplicates( PermissionRequest* request) { - DCHECK_EQ(1, base::STLCount(requests_, request) + - base::STLCount(queued_requests_, request)) - << "Only requests in [queued_]requests_ can have duplicates"; + DCHECK_EQ(1ul, base::STLCount(requests_, request) + + pending_permission_requests_.Count(request)) + << "Only requests in [pending_permission_]requests_ can have duplicates"; request->PermissionDenied(); auto range = duplicate_requests_.equal_range(request); for (auto it = range.first; it != range.second; ++it) @@ -906,9 +899,9 @@ void PermissionRequestManager::CancelledIncludingDuplicates( PermissionRequest* request) { - DCHECK_EQ(1, base::STLCount(requests_, request) + - base::STLCount(queued_requests_, request)) - << "Only requests in [queued_]requests_ can have duplicates"; + DCHECK_EQ(1ul, base::STLCount(requests_, request) + + pending_permission_requests_.Count(request)) + << "Only requests in [pending_permission_]requests_ can have duplicates"; request->Cancelled(); auto range = duplicate_requests_.equal_range(request); for (auto it = range.first; it != range.second; ++it) @@ -917,9 +910,9 @@ void PermissionRequestManager::RequestFinishedIncludingDuplicates( PermissionRequest* request) { - DCHECK_EQ(1, base::STLCount(requests_, request) + - base::STLCount(queued_requests_, request)) - << "Only requests in [queued_]requests_ can have duplicates"; + DCHECK_EQ(1ul, base::STLCount(requests_, request) + + pending_permission_requests_.Count(request)) + << "Only requests in [pending_permission_]requests_ can have duplicates"; request->RequestFinished(); // Beyond this point, |request| has probably been deleted. auto range = duplicate_requests_.equal_range(request); @@ -1093,30 +1086,6 @@ } } -PermissionRequest* PermissionRequestManager::PeekNextQueuedRequest() { - return base::FeatureList::IsEnabled(features::kPermissionChip) - ? queued_requests_.back() - : queued_requests_.front(); -} - -PermissionRequest* PermissionRequestManager::PopNextQueuedRequest() { - PermissionRequest* next = PeekNextQueuedRequest(); - if (base::FeatureList::IsEnabled(features::kPermissionChip)) - queued_requests_.pop_back(); - else - queued_requests_.pop_front(); - return next; -} - -void PermissionRequestManager::PushQueuedRequest(PermissionRequest* request) { - if (base::FeatureList::IsEnabled(features::kPermissionQuietChip) && - !base::FeatureList::IsEnabled(features::kPermissionChip)) { - queued_requests_.push_front(request); - } else { - queued_requests_.push_back(request); - } -} - WEB_CONTENTS_USER_DATA_KEY_IMPL(PermissionRequestManager); } // namespace permissions
diff --git a/components/permissions/permission_request_manager.h b/components/permissions/permission_request_manager.h index 4dd362131..1c19d7f4 100644 --- a/components/permissions/permission_request_manager.h +++ b/components/permissions/permission_request_manager.h
@@ -6,16 +6,14 @@ #define COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_MANAGER_H_ #include <algorithm> -#include <unordered_map> #include <utility> #include <vector> -#include "base/containers/circular_deque.h" -#include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/time/time.h" #include "components/permissions/permission_prompt.h" +#include "components/permissions/permission_request_queue.h" #include "components/permissions/permission_ui_selector.h" #include "components/permissions/permission_uma_util.h" #include "content/public/browser/web_contents_observer.h" @@ -221,14 +219,14 @@ CurrentRequestFate GetCurrentRequestFateInFaceOfNewRequest( PermissionRequest* request); - // Adds `request` into `queued_requests_`, and request's `source_frame` into - // `request_sources_map_`. + // Adds `request` into `pending_permission_requests_`, and request's + // `source_frame` into `request_sources_map_`. void QueueRequest(content::RenderFrameHost* source_frame, PermissionRequest* request); // Because the requests are shown in a different order for Normal and Quiet - // Chip, pending requests are returned back to queued_requests_ to process - // them after the new requests. + // Chip, pending requests are returned back to pending_permission_requests_ to + // process them after the new requests. void PreemptAndRequeueCurrentRequest(); // Posts a task which will allow the bubble to become visible. @@ -264,10 +262,10 @@ // main frame. void CleanUpRequests(); - // Searches |requests_|, |queued_requests_| and |queued_frame_requests_| - but - // *not* |duplicate_requests_| - for a request matching |request|, and returns - // the matching request, or |nullptr| if no match. Note that the matching - // request may or may not be the same object as |request|. + // Searches |requests_| and |pending_permission_requests_| - but *not* + // |duplicate_requests_| - for a request matching |request|, and returns the + // matching request, or |nullptr| if no match. Note that the matching request + // may or may not be the same object as |request|. PermissionRequest* GetExistingRequest(PermissionRequest* request); // Calls PermissionGranted on a request and all its duplicates. @@ -324,28 +322,16 @@ bool IsSourceFrameInactiveAndDisallowActivation() const; }; - PermissionRequest* PeekNextQueuedRequest(); - - PermissionRequest* PopNextQueuedRequest(); - - // Encapsulate enqueuing `request` into `queued_requests_`. Based on the chip - // / quiet chip experiments, the `request` is added into the back or front of - // the queue. - void PushQueuedRequest(PermissionRequest* request); - - // TODO(crbug.com/1221150): Create a separate entity to handle Enqueue / - // Dequeue with all edge cases. Expose to `PermissionRequestManager` only a - // clear API like `Peek()` and `Pop()`, etc. - base::circular_deque<PermissionRequest*> queued_requests_; + PermissionRequestQueue pending_permission_requests_; // Maps from the first request of a kind to subsequent requests that were // duped against it. std::unordered_multimap<PermissionRequest*, PermissionRequest*> duplicate_requests_; - // Maps each PermissionRequest currently in |requests_| or |queued_requests_| - // to which RenderFrameHost it originated from. Note that no date is stored - // for |duplicate_requests_|. + // Maps each PermissionRequest currently in |requests_| or + // |pending_permission_requests_| to which RenderFrameHost it originated from. + // Note that no date is stored for |duplicate_requests_|. std::map<PermissionRequest*, PermissionRequestSource> request_sources_map_; base::ObserverList<Observer>::Unchecked observer_list_;
diff --git a/components/permissions/permission_request_queue.cc b/components/permissions/permission_request_queue.cc new file mode 100644 index 0000000..44e0950 --- /dev/null +++ b/components/permissions/permission_request_queue.cc
@@ -0,0 +1,70 @@ +// 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 "components/permissions/permission_request_queue.h" + +#include "base/stl_util.h" +#include "components/permissions/features.h" + +namespace permissions { + +PermissionRequestQueue::PermissionRequestQueue() = default; + +PermissionRequestQueue::~PermissionRequestQueue() = default; + +bool PermissionRequestQueue::IsEmpty() { + return queued_requests_.empty(); +} + +size_t PermissionRequestQueue::Count() { + return queued_requests_.size(); +} + +size_t PermissionRequestQueue::Count(PermissionRequest* request) { + return base::STLCount(queued_requests_, request); +} + +void PermissionRequestQueue::Push(permissions::PermissionRequest* request) { + if (base::FeatureList::IsEnabled(features::kPermissionQuietChip) && + !base::FeatureList::IsEnabled(features::kPermissionChip)) { + queued_requests_.push_front(request); + } else { + queued_requests_.push_back(request); + } +} + +PermissionRequest* PermissionRequestQueue::Pop() { + PermissionRequest* next = Peek(); + if (base::FeatureList::IsEnabled(features::kPermissionChip)) + queued_requests_.pop_back(); + else + queued_requests_.pop_front(); + return next; +} + +PermissionRequest* PermissionRequestQueue::Peek() { + return base::FeatureList::IsEnabled(features::kPermissionChip) + ? queued_requests_.back() + : queued_requests_.front(); +} + +PermissionRequest* PermissionRequestQueue::FindDuplicate( + PermissionRequest* request) { + for (PermissionRequest* queued_request : queued_requests_) { + if (request->IsDuplicateOf(queued_request)) { + return queued_request; + } + } + return nullptr; +} + +PermissionRequestQueue::iterator PermissionRequestQueue::begin() { + return queued_requests_.begin(); +} + +PermissionRequestQueue::iterator PermissionRequestQueue::end() { + return queued_requests_.end(); +} + +}; // namespace permissions
diff --git a/components/permissions/permission_request_queue.h b/components/permissions/permission_request_queue.h new file mode 100644 index 0000000..8f552b9 --- /dev/null +++ b/components/permissions/permission_request_queue.h
@@ -0,0 +1,48 @@ +// 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 COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_ +#define COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_ + +#include <cstddef> + +#include "base/containers/circular_deque.h" +#include "components/permissions/permission_request.h" + +namespace permissions { + +// Provides a container for holding pending PermissionRequest objects and +// provides access methods respecting the currently applicable feature flag +// configuration. +class PermissionRequestQueue { + public: + using iterator = base::circular_deque<PermissionRequest*>::iterator; + + // Not copyable or movable + PermissionRequestQueue(const PermissionRequestQueue&) = delete; + PermissionRequestQueue& operator=(const PermissionRequestQueue&) = delete; + PermissionRequestQueue(); + ~PermissionRequestQueue(); + + bool IsEmpty(); + size_t Count(); + size_t Count(PermissionRequest* request); + void Push(permissions::PermissionRequest* request); + PermissionRequest* Pop(); + PermissionRequest* Peek(); + + // Searches queued_requests_ and returns the first matching request, or + // nullptr if there is no match. + PermissionRequest* FindDuplicate(PermissionRequest* request); + + private: + iterator begin(); + iterator end(); + + base::circular_deque<PermissionRequest*> queued_requests_; +}; + +} // namespace permissions + +#endif // COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_
diff --git a/components/permissions/permission_request_queue_unittest.cc b/components/permissions/permission_request_queue_unittest.cc new file mode 100644 index 0000000..0a43ada0 --- /dev/null +++ b/components/permissions/permission_request_queue_unittest.cc
@@ -0,0 +1,146 @@ +// 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 <stddef.h> +#include <memory> +#include <string> + +#include "base/bind.h" +#include "base/command_line.h" +#include "base/test/scoped_feature_list.h" +#include "build/build_config.h" +#include "components/permissions/features.h" +#include "components/permissions/permission_request.h" +#include "components/permissions/permission_request_queue.h" +#include "components/permissions/request_type.h" +#include "components/permissions/test/mock_permission_prompt_factory.h" +#include "components/permissions/test/mock_permission_request.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace permissions { + +enum UiFeatureConfig { NoChip, QuietChipOnly, ChipOnly, QuietChipAndChip }; + +class PermissionRequestQueueTest + : public ::testing::Test, + public ::testing::WithParamInterface<UiFeatureConfig> { + public: + PermissionRequestQueueTest() + : request1_(RequestType::kGeolocation, + PermissionRequestGestureType::GESTURE), + request2_(RequestType::kMultipleDownloads, + PermissionRequestGestureType::NO_GESTURE) { + switch (GetParam()) { + case NoChip: + feature_list_.InitWithFeatures( + {}, {permissions::features::kPermissionChip, + permissions::features::kPermissionQuietChip}); + break; + case QuietChipOnly: + feature_list_.InitWithFeatures( + {permissions::features::kPermissionQuietChip}, + {permissions::features::kPermissionChip}); + break; + case ChipOnly: + feature_list_.InitWithFeatures( + {permissions::features::kPermissionChip}, + {permissions::features::kPermissionQuietChip}); + break; + case QuietChipAndChip: + feature_list_.InitWithFeatures( + {permissions::features::kPermissionChip, + permissions::features::kPermissionQuietChip}, + {}); + break; + } + } + + protected: + PermissionRequestQueue permission_request_queue_; + MockPermissionRequest request1_; + MockPermissionRequest request2_; + base::test::ScopedFeatureList feature_list_; +}; + +TEST_P(PermissionRequestQueueTest, CountNumberOfRequestsInQueue) { + EXPECT_EQ(0ul, permission_request_queue_.Count()); + + permission_request_queue_.Push(&request1_); + permission_request_queue_.Push(&request2_); + EXPECT_EQ(2ul, permission_request_queue_.Count()); + + permission_request_queue_.Pop(); + EXPECT_EQ(1ul, permission_request_queue_.Count()); +} + +TEST_P(PermissionRequestQueueTest, CountDuplicateRequests) { + EXPECT_EQ(0ul, permission_request_queue_.Count()); + + permission_request_queue_.Push(&request1_); + permission_request_queue_.Push(&request1_); + EXPECT_EQ(2ul, permission_request_queue_.Count()); +} + +TEST_P(PermissionRequestQueueTest, CountNumberOfRequestOccurencesInQueue) { + EXPECT_EQ(0ul, permission_request_queue_.Count(&request1_)); + + permission_request_queue_.Push(&request1_); + permission_request_queue_.Push(&request1_); + permission_request_queue_.Push(&request2_); + + EXPECT_EQ(2ul, permission_request_queue_.Count(&request1_)); +} + +TEST_P(PermissionRequestQueueTest, OnlyEmptyWithoutRequests) { + EXPECT_TRUE(permission_request_queue_.IsEmpty()); + + permission_request_queue_.Push(&request1_); + EXPECT_FALSE(permission_request_queue_.IsEmpty()); + + permission_request_queue_.Pop(); + EXPECT_TRUE(permission_request_queue_.IsEmpty()); +} + +TEST_P(PermissionRequestQueueTest, ShouldFindDuplicateRequest) { + permission_request_queue_.Push(&request1_); + permission_request_queue_.Push(&request2_); + + EXPECT_EQ(&request2_, permission_request_queue_.FindDuplicate(&request2_)); +} + +TEST_P(PermissionRequestQueueTest, ShouldNotFindDuplicateIfNotPresent) { + permission_request_queue_.Push(&request1_); + + EXPECT_EQ(nullptr, permission_request_queue_.FindDuplicate(&request2_)); +} + +TEST_P(PermissionRequestQueueTest, PeekedElementIsNextPoppedElement) { + permission_request_queue_.Push(&request1_); + permission_request_queue_.Push(&request2_); + PermissionRequest* peekedElement = permission_request_queue_.Peek(); + + EXPECT_EQ(peekedElement, permission_request_queue_.Pop()); +} + +TEST_P(PermissionRequestQueueTest, VerifyPushOrder) { + permission_request_queue_.Push(&request1_); + permission_request_queue_.Push(&request2_); + permission_request_queue_.Push(&request2_); + + if (GetParam() == NoChip) { + EXPECT_EQ(permission_request_queue_.Pop(), &request1_); + EXPECT_EQ(permission_request_queue_.Pop(), &request2_); + EXPECT_EQ(permission_request_queue_.Pop(), &request2_); + } else { // QuietChipOnly, ChipOnly, QuietChipAndChip + EXPECT_EQ(permission_request_queue_.Pop(), &request2_); + EXPECT_EQ(permission_request_queue_.Pop(), &request2_); + EXPECT_EQ(permission_request_queue_.Pop(), &request1_); + } +} + +INSTANTIATE_TEST_SUITE_P( + All, + PermissionRequestQueueTest, + ::testing::Values(NoChip, QuietChipOnly, ChipOnly, QuietChipAndChip)); +} // namespace permissions
diff --git a/components/policy/tools/generate_policy_source.py b/components/policy/tools/generate_policy_source.py index 82e886f13..ae46a935 100755 --- a/components/policy/tools/generate_policy_source.py +++ b/components/policy/tools/generate_policy_source.py
@@ -113,7 +113,8 @@ self.enterprise_default = policy['default_for_enterprise_users'] if self.has_enterprise_default: self.default_policy_level = policy.get('default_policy_level', '') - if self.default_policy_level == 'recommended' and not self.can_be_recommended: + if (self.default_policy_level == 'recommended' + and not self.can_be_recommended): raise RuntimeError('Policy ' + self.name + ' has default_policy_level set to ' + self.default_policy_level + ', ' @@ -503,7 +504,7 @@ # Ensure only windows supported policies are returned when building for windows. # Eventually only supported policies on every platforms will be returned. def _GetSupportedPolicies(policies, target_platform): - if target_platform == 'win': + if target_platform in ['win', 'linux']: return [policy for policy in policies if policy.is_supported] return [
diff --git a/components/policy/tools/generate_policy_source_test.py b/components/policy/tools/generate_policy_source_test.py index 5157be9a..a1ddd2c3 100755 --- a/components/policy/tools/generate_policy_source_test.py +++ b/components/policy/tools/generate_policy_source_test.py
@@ -126,17 +126,22 @@ "desc": "CloudManagementEnrollmentToken desc" }, { - "name": "DeprecatedButGenerated", - "type": "string", + "name": + "DeprecatedButGenerated", + "type": + "string", "schema": { "type": "string" }, "supported_on": ["chrome_os:1-93", "android:1-93", "chrome.*:1-93"], - "id": 7, + "id": + 7, "tags": [], - "caption": "DeprecatedButGenerated caption", - "desc": "DeprecatedButGenerated desc" - }, { + "caption": + "DeprecatedButGenerated caption", + "desc": + "DeprecatedButGenerated desc" + }, { "name": "DeprecatedNotGenerated", "type": "string", "schema": {
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc index f58b807c..1ba2416 100644 --- a/components/printing/test/print_render_frame_helper_browsertest.cc +++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -22,7 +22,6 @@ #include "components/printing/test/mock_printer.h" #include "components/printing/test/print_test_content_renderer_client.h" #include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_view.h" #include "content/public/test/mock_render_thread.h" #include "content/public/test/render_view_test.h" #include "ipc/ipc_listener.h" @@ -838,13 +837,12 @@ // Find the frame and set it as the focused one. This should mean that that // the printout should only contain the contents of that frame. - auto* web_view = view_->GetWebView(); WebFrame* sub1_frame = - web_view->MainFrame()->ToWebLocalFrame()->FindFrameByName( + web_view_->MainFrame()->ToWebLocalFrame()->FindFrameByName( WebString::FromUTF8("sub1")); ASSERT_TRUE(sub1_frame); - web_view->SetFocusedFrame(sub1_frame); - ASSERT_NE(web_view->FocusedFrame(), web_view->MainFrame()); + web_view_->SetFocusedFrame(sub1_frame); + ASSERT_NE(web_view_->FocusedFrame(), web_view_->MainFrame()); // Initiate printing. OnPrintPages();
diff --git a/components/remote_cocoa/app_shim/views_nswindow_delegate.mm b/components/remote_cocoa/app_shim/views_nswindow_delegate.mm index e75bdb1..db01fcf 100644 --- a/components/remote_cocoa/app_shim/views_nswindow_delegate.mm +++ b/components/remote_cocoa/app_shim/views_nswindow_delegate.mm
@@ -119,10 +119,16 @@ gfx::Rect resizedWindowRect(gfx::Point([window frame].origin), gfx::Size(size)); + + absl::optional<gfx::Size> maxSizeParam; + gfx::Size maxSize([window maxSize]); + if (!maxSize.IsEmpty()) + maxSizeParam = maxSize; + gfx::SizeRectToAspectRatio(*_resizingHorizontally ? gfx::ResizeEdge::kRight : gfx::ResizeEdge::kBottom, *_aspectRatio, gfx::Size([window minSize]), - gfx::Size([window maxSize]), &resizedWindowRect); + maxSizeParam, &resizedWindowRect); // Discard any updates to |resizedWindowRect| origin as Cocoa takes care of // that. return resizedWindowRect.size().ToCGSize();
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn index 9b8e9220..11db086 100644 --- a/components/vector_icons/BUILD.gn +++ b/components/vector_icons/BUILD.gn
@@ -110,6 +110,8 @@ "sms.icon", "submenu_arrow.icon", "sync.icon", + "text_decrease.icon", + "text_increase.icon", "troubleshoot.icon", "usb.icon", "videocam.icon",
diff --git a/components/vector_icons/text_decrease.icon b/components/vector_icons/text_decrease.icon new file mode 100644 index 0000000..72f36047 --- /dev/null +++ b/components/vector_icons/text_decrease.icon
@@ -0,0 +1,24 @@ +// 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. + +CANVAS_DIMENSIONS, 24, +MOVE_TO, 1, 19, +LINE_TO, 6.25f, 5, +H_LINE_TO, 8.75f, +LINE_TO, 14, 19, +H_LINE_TO, 11.6f, +LINE_TO, 10.33f, 15.43f, +H_LINE_TO, 4.68f, +LINE_TO, 3.4f, 19, +CLOSE, +MOVE_TO, 5.4f, 13.4f, +H_LINE_TO, 9.6f, +LINE_TO, 7.55f, 7.6f, +H_LINE_TO, 7.45f, +CLOSE, +MOVE_TO, 15, 13, +V_LINE_TO, 11, +H_LINE_TO, 23, +V_LINE_TO, 13, +CLOSE \ No newline at end of file
diff --git a/components/vector_icons/text_increase.icon b/components/vector_icons/text_increase.icon new file mode 100644 index 0000000..edee5e9 --- /dev/null +++ b/components/vector_icons/text_increase.icon
@@ -0,0 +1,32 @@ +// 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. + +CANVAS_DIMENSIONS, 24, +MOVE_TO, 1, 19, +LINE_TO, 6.25f, 5, +H_LINE_TO, 8.75f, +LINE_TO, 14, 19, +H_LINE_TO, 11.6f, +LINE_TO, 10.33f, 15.43f, +H_LINE_TO, 4.68f, +LINE_TO, 3.4f, 19, +CLOSE, +MOVE_TO, 5.4f, 13.4f, +H_LINE_TO, 9.6f, +LINE_TO, 7.55f, 7.6f, +H_LINE_TO, 7.45f, +CLOSE, +MOVE_TO, 18, 16, +V_LINE_TO, 13, +H_LINE_TO, 15, +V_LINE_TO, 11, +H_LINE_TO, 18, +V_LINE_TO, 8, +H_LINE_TO, 20, +V_LINE_TO, 11, +H_LINE_TO, 23, +V_LINE_TO, 13, +H_LINE_TO, 20, +V_LINE_TO, 16, +CLOSE \ No newline at end of file
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc index 6930cc4d..e1befa0 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
@@ -9,7 +9,6 @@ #include "base/time/time.h" #include "sql/database.h" #include "sql/meta_table.h" -#include "sql/statement.h" #include "sql/transaction.h" namespace content { @@ -52,10 +51,7 @@ "aggregation_id,source_id,trigger_time,debug_key,external_report_id," "report_time,failed_send_attempts,report_time " "FROM aggregatable_report_metadata"; - sql::Statement populate_new_aggregatable_report_metadata_statement( - db->GetCachedStatement(SQL_FROM_HERE, - kPopulateNewAggregatableReportMetadataSql)); - if (!populate_new_aggregatable_report_metadata_statement.Run()) + if (!db->Execute(kPopulateNewAggregatableReportMetadataSql)) return false; static constexpr char kDropOldAggregatableReportMetadataTableSql[] =
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc index 63d6ad01..2dc0b3e4 100644 --- a/content/browser/attribution_reporting/attributions_browsertest.cc +++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -401,6 +401,87 @@ } IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest, + AttributionEligibleNavigation_SetsEligibleHeader) { + auto register_response1 = + std::make_unique<net::test_server::ControllableHttpResponse>( + https_server(), "/register_source_redirect"); + auto register_response2 = + std::make_unique<net::test_server::ControllableHttpResponse>( + https_server(), "/register_source_redirect2"); + ASSERT_TRUE(https_server()->Start()); + + GURL impression_url = https_server()->GetURL( + "a.test", "/attribution_reporting/page_with_impression_creator.html"); + EXPECT_TRUE(NavigateToURL(web_contents(), impression_url)); + + GURL register_source_url = + https_server()->GetURL("d.test", "/register_source_redirect"); + + // Don't use `CreateAndClickSource()` as we need to observe navigation + // redirects prior to the navigation finishing. + EXPECT_TRUE(ExecJs(web_contents(), JsReplace(R"( + createAttributionSrcAnchor({id: 'link', + url: $1, + attributionsrc: '', + target: $2});)", + register_source_url, "_top"))); + EXPECT_TRUE(ExecJs(web_contents(), "simulateClick('link');")); + + // Verify the navigation redirects contain the eligibility header. + register_response1->WaitForRequest(); + EXPECT_EQ(register_response1->http_request()->headers.at( + "Attribution-Reporting-Eligible"), + "navigation-source"); + + auto http_response = std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_MOVED_PERMANENTLY); + http_response->AddCustomHeader("Location", "/register_source_redirect2"); + register_response1->Send(http_response->ToResponseString()); + register_response1->Done(); + + // Ensure that redirect requests also contain the header. + register_response2->WaitForRequest(); + ASSERT_EQ(register_response2->http_request()->headers.at( + "Attribution-Reporting-Eligible"), + "navigation-source"); +} + +IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest, + NonAttributionEligibleNavigation_NoEligibleHeader) { + auto register_response1 = + std::make_unique<net::test_server::ControllableHttpResponse>( + https_server(), "/register_source_redirect"); + ASSERT_TRUE(https_server()->Start()); + + GURL impression_url = https_server()->GetURL( + "a.test", "/attribution_reporting/page_with_impression_creator.html"); + EXPECT_TRUE(NavigateToURL(web_contents(), impression_url)); + + GURL register_source_url = + https_server()->GetURL("d.test", "/register_source_redirect"); + + // Create a non-attribution eligible anchor and click. + EXPECT_TRUE(ExecJs(web_contents(), JsReplace(R"( + const anchor = document.createElement('a'); + anchor.href = $1; + anchor.target = '_top'; + anchor.id = 'link'; + document.body.appendChild(anchor);)", + register_source_url))); + EXPECT_TRUE(ExecJs(web_contents(), "simulateClick('link');")); + + // Verify the navigation request does not contain the eligibility header. + register_response1->WaitForRequest(); + EXPECT_FALSE(base::Contains(register_response1->http_request()->headers, + "Attribution-Reporting-Eligible")); + + auto http_response = std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_OK); + register_response1->Send(http_response->ToResponseString()); + register_response1->Done(); +} + +IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest, WindowOpenDeprecatedAPI_NoException) { // Expected reports must be registered before the server starts. ExpectedReportWaiter expected_report(
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc index 87f9b848..c3c3bae 100644 --- a/content/browser/back_forward_cache_features_browsertest.cc +++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -33,6 +33,7 @@ #include "services/device/public/cpp/test/scoped_geolocation_overrider.h" #include "services/device/public/mojom/vibration_manager.mojom.h" #include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/app_banner/app_banner.mojom.h" #include "ui/base/idle/idle_time_provider.h" #include "ui/base/test/idle_test_utils.h" @@ -54,23 +55,59 @@ using NotRestoredReason = BackForwardCacheMetrics::NotRestoredReason; -IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, - PageWithDedicatedWorkerNotCached) { +class BackForwardCacheDedicatedWorkerFlagBrowserTest + : public BackForwardCacheBrowserTest, + public testing::WithParamInterface<bool> { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + EnableFeatureAndSetParams(blink::features::kBackForwardCacheDedicatedWorker, + "", ""); + if (IsDedicatedWorkerEnabled()) { + EnableFeatureAndSetParams( + blink::features::kBackForwardCacheDedicatedWorker, "", ""); + } else { + DisableFeature(blink::features::kBackForwardCacheDedicatedWorker); + } + BackForwardCacheBrowserTest::SetUpCommandLine(command_line); + } + + bool IsDedicatedWorkerEnabled() { return GetParam(); } +}; + +INSTANTIATE_TEST_SUITE_P(All, + BackForwardCacheDedicatedWorkerFlagBrowserTest, + testing::Bool()); + +IN_PROC_BROWSER_TEST_P(BackForwardCacheDedicatedWorkerFlagBrowserTest, + PageWithDedicatedWorkerCachedOrNot) { ASSERT_TRUE(embedded_test_server()->Start()); - EXPECT_TRUE(NavigateToURL( + ASSERT_TRUE(NavigateToURL( shell(), embedded_test_server()->GetURL( "a.com", "/back_forward_cache/page_with_dedicated_worker.html"))); - EXPECT_EQ(42, EvalJs(current_frame_host(), "window.receivedMessagePromise")); - RenderFrameDeletedObserver delete_observer_rfh_a(current_frame_host()); + ASSERT_EQ(42, EvalJs(current_frame_host(), "window.receivedMessagePromise")); + RenderFrameHostWrapper rfh(current_frame_host()); // Navigate away. - EXPECT_TRUE(NavigateToURL( + ASSERT_TRUE(NavigateToURL( shell(), embedded_test_server()->GetURL("b.com", "/title1.html"))); - // The page with the unsupported feature should be deleted (not cached). - delete_observer_rfh_a.WaitUntilDeleted(); + // Go back + ASSERT_TRUE(HistoryGoBack(web_contents())); + + // Check the outcome. + if (IsDedicatedWorkerEnabled()) { + EXPECT_EQ(rfh.get(), current_frame_host()); + ExpectRestored(FROM_HERE); + } else { + // The page with the dedicated worker should be deleted (not cached). + ASSERT_TRUE(rfh.WaitUntilRenderFrameDeleted()); + ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures}, + {blink::scheduler::WebSchedulerTrackedFeature:: + kDedicatedWorkerOrWorklet}, + {}, {}, {}, FROM_HERE); + } } // The bool parameter is used for switching PlzDedicatedWorker.
diff --git a/content/browser/media/media_internals.cc b/content/browser/media/media_internals.cc index 8535682..89c07f9 100644 --- a/content/browser/media/media_internals.cc +++ b/content/browser/media/media_internals.cc
@@ -522,6 +522,10 @@ ", minimize_resampling = ", media::kChromeWideEchoCancellationMinimizeResampling.Get() ? "true" + : "false", + ", allow_all_sample_rates = ", + media::kChromeWideEchoCancellationAllowAllSampleRates.Get() + ? "true" : "false"}) : "Disabled"; audio_info_data.SetKey(
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 55eba05..5a84eb6 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -396,7 +396,8 @@ const std::string& user_agent_override, const absl::optional<url::Origin>& initiator_origin, blink::mojom::Referrer* referrer, - FrameTreeNode* frame_tree_node) { + FrameTreeNode* frame_tree_node, + bool has_attribution_src_token) { if (!url.SchemeIsHTTPOrHTTPS()) return; @@ -452,6 +453,10 @@ headers->SetHeader("Sec-Purpose", "prefetch;prerender"); headers->SetHeader("Purpose", "prefetch"); } + + if (has_attribution_src_token) { + headers->SetHeader("Attribution-Reporting-Eligible", "navigation-source"); + } } bool ShouldPropagateUserActivation(const url::Origin& previous_origin, @@ -1695,7 +1700,8 @@ ui::PageTransitionFromInt(common_params_->transition), controller->GetBrowserContext(), common_params_->method, GetUserAgentOverride(), common_params_->initiator_origin, - common_params_->referrer.get(), frame_tree_node); + common_params_->referrer.get(), frame_tree_node, + begin_params_->impression.has_value()); if (begin_params_->is_form_submission) { if (commit_params_->is_browser_initiated &&
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 9d3ef7d..f66fae5f 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3017,7 +3017,13 @@ creator_location_ = params.creator_location; - pip_initial_aspect_ratio_ = params.initial_picture_in_picture_aspect_ratio; + // An initial aspect ratio of 0.0 implies that the website did not set one and + // therefore we should use a default value. We will also use a default value + // if the website has given an invalid aspect ratio (i.e. a negative one). + pip_initial_aspect_ratio_ = + params.initial_picture_in_picture_aspect_ratio <= 0.0f + ? 1.0f + : params.initial_picture_in_picture_aspect_ratio; pip_lock_aspect_ratio_ = params.lock_picture_in_picture_aspect_ratio;
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 02fbb81..8951bb7b 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -2298,10 +2298,13 @@ // Stores WebContents::CreateParams::creator_location_. base::Location creator_location_; - // Stores WebContents::CreateParams::initial_aspect_ratio. - float pip_initial_aspect_ratio_ = 0; + // The initial aspect ratio (only used for WebContents associated with a + // PictureInPicture window). This value is either the parameter given in + // WebContents::CreateParams::initial_picture_in_picture_aspect_ratio, or a + // default value if the given value is unset or invalid. + float pip_initial_aspect_ratio_ = 1.0f; - // Stores WebContents::CreateParams::lock_aspect_ratio. + // Stores WebContents::CreateParams::lock_picture_in_picture_aspect_ratio. bool pip_lock_aspect_ratio_ = false; VisibleTimeRequestTrigger visible_time_request_trigger_;
diff --git a/content/browser/webid/fedcm_metrics.cc b/content/browser/webid/fedcm_metrics.cc index 6c33ed9..5ee29ea 100644 --- a/content/browser/webid/fedcm_metrics.cc +++ b/content/browser/webid/fedcm_metrics.cc
@@ -8,80 +8,63 @@ #include "base/metrics/histogram_macros.h" #include "base/types/pass_key.h" #include "services/metrics/public/cpp/metrics_utils.h" +#include "url/gurl.h" namespace content { -// The only purpose of this class currently is to be friended by the -// UkmRecorder. It therefore cannot be in the anonymous namespace. -// TODO(crbug.com/1334210): Add sourceId and provider to FedCmMetrics so the -// recording methods do not all have to pass these. -class FedCmMetrics { - public: - // Gets the ukm source id for a web identity provider. - static ukm::SourceId GetUkmSourceIdForWebIdentityFromScope( - const GURL& provider) { - return ukm::UkmRecorder::GetSourceIdForWebIdentityFromScope( - base::PassKey<FedCmMetrics>(), provider); - } -}; +FedCmMetrics::FedCmMetrics(const GURL& provider, ukm::SourceId page_source_id) + : page_source_id_(page_source_id), + provider_source_id_(ukm::UkmRecorder::GetSourceIdForWebIdentityFromScope( + base::PassKey<FedCmMetrics>(), + provider)) {} -void RecordShowAccountsDialogTime(base::TimeDelta duration, - ukm::SourceId source_id, - const GURL& provider) { +void FedCmMetrics::RecordShowAccountsDialogTime(base::TimeDelta duration) { auto RecordUkm = [&](auto& ukm_builder) { ukm_builder.SetTiming_ShowAccountsDialog( ukm::GetExponentialBucketMinForUserTiming(duration.InMilliseconds())); ukm_builder.Record(ukm::UkmRecorder::Get()); }; - ukm::builders::Blink_FedCm fedcm_builder(source_id); + ukm::builders::Blink_FedCm fedcm_builder(page_source_id_); RecordUkm(fedcm_builder); - ukm::builders::Blink_FedCmIdp fedcm_idp_builder( - FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider)); + ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_); RecordUkm(fedcm_idp_builder); UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.ShowAccountsDialog", duration); } -void RecordContinueOnDialogTime(base::TimeDelta duration, - ukm::SourceId source_id, - const GURL& provider) { +void FedCmMetrics::RecordContinueOnDialogTime(base::TimeDelta duration) { auto RecordUkm = [&](auto& ukm_builder) { ukm_builder.SetTiming_ContinueOnDialog( ukm::GetExponentialBucketMinForUserTiming(duration.InMilliseconds())); ukm_builder.Record(ukm::UkmRecorder::Get()); }; - ukm::builders::Blink_FedCm fedcm_builder(source_id); + ukm::builders::Blink_FedCm fedcm_builder(page_source_id_); RecordUkm(fedcm_builder); - ukm::builders::Blink_FedCmIdp fedcm_idp_builder( - FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider)); + ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_); RecordUkm(fedcm_idp_builder); UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.ContinueOnDialog", duration); } -void RecordCancelOnDialogTime(base::TimeDelta duration, - ukm::SourceId source_id, - const GURL& provider) { +void FedCmMetrics::RecordCancelOnDialogTime(base::TimeDelta duration) { auto RecordUkm = [&](auto& ukm_builder) { ukm_builder.SetTiming_CancelOnDialog( ukm::GetExponentialBucketMinForUserTiming(duration.InMilliseconds())); ukm_builder.Record(ukm::UkmRecorder::Get()); }; - ukm::builders::Blink_FedCm fedcm_builder(source_id); + ukm::builders::Blink_FedCm fedcm_builder(page_source_id_); RecordUkm(fedcm_builder); - ukm::builders::Blink_FedCmIdp fedcm_idp_builder( - FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider)); + ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_); RecordUkm(fedcm_idp_builder); UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.CancelOnDialog", duration); } -void RecordTokenResponseAndTurnaroundTime(base::TimeDelta token_response_time, - base::TimeDelta turnaround_time, - ukm::SourceId source_id, - const GURL& provider) { +void FedCmMetrics::RecordTokenResponseAndTurnaroundTime( + base::TimeDelta token_response_time, + base::TimeDelta turnaround_time) { auto RecordUkm = [&](auto& ukm_builder) { ukm_builder .SetTiming_IdTokenResponse(ukm::GetExponentialBucketMinForUserTiming( @@ -90,11 +73,10 @@ turnaround_time.InMilliseconds())); ukm_builder.Record(ukm::UkmRecorder::Get()); }; - ukm::builders::Blink_FedCm fedcm_builder(source_id); + ukm::builders::Blink_FedCm fedcm_builder(page_source_id_); RecordUkm(fedcm_builder); - ukm::builders::Blink_FedCmIdp fedcm_idp_builder( - FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider)); + ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_); RecordUkm(fedcm_idp_builder); UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.IdTokenResponse", @@ -103,18 +85,15 @@ turnaround_time); } -void RecordRequestTokenStatus(FedCmRequestIdTokenStatus status, - ukm::SourceId source_id, - const GURL& provider) { +void FedCmMetrics::RecordRequestTokenStatus(FedCmRequestIdTokenStatus status) { auto RecordUkm = [&](auto& ukm_builder) { ukm_builder.SetStatus_RequestIdToken(static_cast<int>(status)); ukm_builder.Record(ukm::UkmRecorder::Get()); }; - ukm::builders::Blink_FedCm fedcm_builder(source_id); + ukm::builders::Blink_FedCm fedcm_builder(page_source_id_); RecordUkm(fedcm_builder); - ukm::builders::Blink_FedCmIdp fedcm_idp_builder( - FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider)); + ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_); RecordUkm(fedcm_idp_builder); UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.Status.RequestIdToken", status);
diff --git a/content/browser/webid/fedcm_metrics.h b/content/browser/webid/fedcm_metrics.h index c760b92..601bbb8 100644 --- a/content/browser/webid/fedcm_metrics.h +++ b/content/browser/webid/fedcm_metrics.h
@@ -7,6 +7,7 @@ #include "content/common/content_export.h" #include "services/metrics/public/cpp/ukm_builders.h" +#include "services/metrics/public/cpp/ukm_source_id.h" namespace base { class TimeDelta; @@ -52,36 +53,43 @@ kMaxValue = kUserInterfaceTimedOut }; -// Records the time from when a call to the API was made to when the accounts -// dialog is shown. -void RecordShowAccountsDialogTime(base::TimeDelta duration, - ukm::SourceId source_id, - const GURL& provider); +class FedCmMetrics { + public: + FedCmMetrics(const GURL& provider, const ukm::SourceId page_source_id); -// Records the time from when the accounts dialog is shown to when the user -// presses the Continue button. -void RecordContinueOnDialogTime(base::TimeDelta duration, - ukm::SourceId source_id, - const GURL& provider); + ~FedCmMetrics() = default; -// Records the time from when the accounts dialog is shown to when the user -// closes the dialog without selecting any account. -void RecordCancelOnDialogTime(base::TimeDelta duration, - ukm::SourceId source_id, - const GURL& provider); + // Records the time from when a call to the API was made to when the accounts + // dialog is shown. + void RecordShowAccountsDialogTime(base::TimeDelta duration); -// Records the time from when the user presses the Continue button to when the -// token response is received. Also records the overall time from when the API -// is called to when the token response is received. -void RecordTokenResponseAndTurnaroundTime(base::TimeDelta token_response_time, - base::TimeDelta turnaround_time, - ukm::SourceId source_id, - const GURL& provider); + // Records the time from when the accounts dialog is shown to when the user + // presses the Continue button. + void RecordContinueOnDialogTime(base::TimeDelta duration); -// Records the status of the |RequestToken| call. -void RecordRequestTokenStatus(FedCmRequestIdTokenStatus status, - ukm::SourceId source_id, - const GURL& provider); + // Records the time from when the accounts dialog is shown to when the user + // closes the dialog without selecting any account. + void RecordCancelOnDialogTime(base::TimeDelta duration); + + // Records the time from when the user presses the Continue button to when the + // token response is received. Also records the overall time from when the API + // is called to when the token response is received. + void RecordTokenResponseAndTurnaroundTime(base::TimeDelta token_response_time, + base::TimeDelta turnaround_time); + + // Records the status of the |RequestToken| call. + void RecordRequestTokenStatus(FedCmRequestIdTokenStatus status); + + // The page's SourceId. Used to log the UKM event Blink.FedCm. + ukm::SourceId page_source_id_; + + // The SourceId to be used to log the UKM event Blink.FedCmIdp. Uses + // |provider_| as the URL. + ukm::SourceId provider_source_id_; +}; + +// The following are UMA-only recordings, hence do not need to be in the +// FedCmMetrics class. // Records whether the user selected account is for sign-in or not. void RecordIsSignInUser(bool is_sign_in); @@ -95,6 +103,7 @@ // Records the size of the approved clients list if applicable. void RecordApprovedClientsSize(int size); + } // namespace content #endif // CONTENT_BROWSER_WEBID_FEDCM_METRICS_H_
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index f8bc5df..5ee2128 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -13,7 +13,6 @@ #include "content/browser/bad_message.h" #include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/browser/webid/fake_identity_request_dialog_controller.h" -#include "content/browser/webid/fedcm_metrics.h" #include "content/browser/webid/flags.h" #include "content/browser/webid/webid_utils.h" #include "content/public/browser/browser_context.h" @@ -249,9 +248,7 @@ // either. We record `kUnhandledRequest` only when the user refreshed, // closed or left the page while the UI is displayed. if (!errors_logged_to_console_) { - RecordRequestTokenStatus(TokenStatus::kUnhandledRequest, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kUnhandledRequest); } CompleteRequest(FederatedAuthRequestResult::kError, "", /*should_call_callback=*/true); @@ -283,15 +280,15 @@ bool prefer_auto_sign_in, RequestTokenCallback callback) { if (HasPendingRequest()) { - RecordRequestTokenStatus(TokenStatus::kTooManyRequests, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kTooManyRequests); std::move(callback).Run(RequestTokenStatus::kErrorTooManyRequests, ""); return; } auth_request_callback_ = std::move(callback); provider_ = provider; + fedcm_metrics_ = std::make_unique<FedCmMetrics>( + provider_, render_frame_host().GetPageUkmSourceId()); client_id_ = client_id; nonce_ = nonce; prefer_auto_sign_in_ = prefer_auto_sign_in && IsFedCmAutoSigninEnabled(); @@ -307,9 +304,7 @@ network_manager_ = CreateNetworkManager(provider); if (!network_manager_) { - RecordRequestTokenStatus(TokenStatus::kNoNetworkManager, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kNoNetworkManager); // TODO(yigu): this is due to provider url being non-secure. We should // reject early in the renderer process. CompleteRequest(FederatedAuthRequestResult::kError, "", @@ -348,9 +343,7 @@ } if (error_token_status) { - RecordRequestTokenStatus(*error_token_status, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus(*error_token_status); CompleteRequest(request_result, "", /*should_call_callback=*/false); return; } @@ -366,8 +359,7 @@ // Dialog will be hidden by the destructor for request_dialog_controller_, // triggered by CompleteRequest. - RecordRequestTokenStatus(TokenStatus::kAborted, - render_frame_host().GetPageUkmSourceId(), provider_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kAborted); CompleteRequest(FederatedAuthRequestResult::kErrorCanceled, "", /*should_call_callback=*/true); } @@ -481,9 +473,8 @@ const std::set<GURL>& urls) { switch (status) { case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: { - RecordRequestTokenStatus(TokenStatus::kManifestListHttpNotFound, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestListHttpNotFound); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingManifestListHttpNotFound, "", @@ -491,18 +482,16 @@ return; } case IdpNetworkRequestManager::FetchStatus::kNoResponseError: { - RecordRequestTokenStatus(TokenStatus::kManifestListNoResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestListNoResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingManifestListNoResponse, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: { - RecordRequestTokenStatus(TokenStatus::kManifestListInvalidResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestListInvalidResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingManifestListInvalidResponse, "", @@ -519,9 +508,7 @@ } if (urls.size() > kMaxProvidersInManifestList) { - RecordRequestTokenStatus(TokenStatus::kManifestListTooBig, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kManifestListTooBig); CompleteRequest(FederatedAuthRequestResult::kErrorManifestListTooBig, "", /*should_call_callback=*/false); return; @@ -551,9 +538,8 @@ bool provider_url_is_valid = (urls.count(provider_url) != 0); if (!provider_url_is_valid) { - RecordRequestTokenStatus(TokenStatus::kManifestNotInManifestList, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestNotInManifestList); CompleteRequest(FederatedAuthRequestResult::kErrorManifestNotInManifestList, "", /*should_call_callback=*/false); return; @@ -570,27 +556,24 @@ IdentityProviderMetadata idp_metadata) { switch (status) { case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: { - RecordRequestTokenStatus(TokenStatus::kManifestHttpNotFound, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestHttpNotFound); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingManifestHttpNotFound, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kNoResponseError: { - RecordRequestTokenStatus(TokenStatus::kManifestNoResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestNoResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingManifestNoResponse, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: { - RecordRequestTokenStatus(TokenStatus::kManifestInvalidResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestInvalidResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, "", /*should_call_callback=*/false); @@ -630,9 +613,8 @@ } render_frame_host().AddMessageToConsole( blink::mojom::ConsoleMessageLevel::kError, message); - RecordRequestTokenStatus(TokenStatus::kManifestInvalidResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kManifestInvalidResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, "", /*should_call_callback=*/false); @@ -672,27 +654,24 @@ IdpNetworkRequestManager::AccountList accounts) { switch (status) { case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: { - RecordRequestTokenStatus(TokenStatus::kAccountsHttpNotFound, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kAccountsHttpNotFound); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingAccountsHttpNotFound, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kNoResponseError: { - RecordRequestTokenStatus(TokenStatus::kAccountsNoResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kAccountsNoResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingAccountsNoResponse, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: { - RecordRequestTokenStatus(TokenStatus::kAccountsInvalidResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kAccountsInvalidResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingAccountsInvalidResponse, "", /*should_call_callback=*/false); @@ -744,9 +723,8 @@ ClientIdData data{GURL(client_metadata_.terms_of_service_url), GURL(client_metadata_.privacy_policy_url)}; show_accounts_dialog_time_ = base::TimeTicks::Now(); - RecordShowAccountsDialogTime(show_accounts_dialog_time_ - start_time_, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordShowAccountsDialogTime(show_accounts_dialog_time_ - + start_time_); request_dialog_controller_->ShowAccountsDialog( rp_web_contents, provider_, accounts, idp_metadata, data, @@ -771,9 +749,7 @@ // have time to disable the FedCM API in other types of requests. if (GetApiPermissionContext()->GetApiPermissionStatus(origin()) != FederatedApiPermissionStatus::GRANTED) { - RecordRequestTokenStatus(TokenStatus::kDisabledInSettings, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kDisabledInSettings); CompleteRequest(FederatedAuthRequestResult::kErrorDisabledInSettings, "", /*should_call_callback=*/false); @@ -783,12 +759,9 @@ // This could happen if user didn't select any accounts. if (account_id.empty()) { base::TimeTicks dismiss_dialog_time = base::TimeTicks::Now(); - RecordCancelOnDialogTime(dismiss_dialog_time - show_accounts_dialog_time_, - render_frame_host().GetPageUkmSourceId(), - provider_); - RecordRequestTokenStatus(TokenStatus::kNotSelectAccount, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordCancelOnDialogTime(dismiss_dialog_time - + show_accounts_dialog_time_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kNotSelectAccount); if (should_embargo && GetApiPermissionContext()) { GetApiPermissionContext()->RecordDismissAndEmbargo(origin()); @@ -807,9 +780,8 @@ account_id_ = account_id; select_account_time_ = base::TimeTicks::Now(); - RecordContinueOnDialogTime(select_account_time_ - show_accounts_dialog_time_, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordContinueOnDialogTime(select_account_time_ - + show_accounts_dialog_time_); network_manager_->SendTokenRequest( endpoints_.token, account_id_, @@ -850,36 +822,31 @@ DCHECK(!start_time_.is_null()); switch (status) { case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: { - RecordRequestTokenStatus(TokenStatus::kIdTokenHttpNotFound, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kIdTokenHttpNotFound); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingIdTokenHttpNotFound, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kNoResponseError: { - RecordRequestTokenStatus(TokenStatus::kIdTokenNoResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kIdTokenNoResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingIdTokenNoResponse, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kInvalidRequestError: { - RecordRequestTokenStatus(TokenStatus::kIdTokenInvalidRequest, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kIdTokenInvalidRequest); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidRequest, "", /*should_call_callback=*/false); return; } case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: { - RecordRequestTokenStatus(TokenStatus::kIdTokenInvalidResponse, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kIdTokenInvalidResponse); CompleteRequest( FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidResponse, "", /*should_call_callback=*/false); @@ -909,13 +876,10 @@ origin(), url::Origin::Create(provider_), account_id_); } - RecordTokenResponseAndTurnaroundTime( + fedcm_metrics_->RecordTokenResponseAndTurnaroundTime( token_response_time_ - select_account_time_, - token_response_time_ - start_time_, - render_frame_host().GetPageUkmSourceId(), provider_); - RecordRequestTokenStatus(TokenStatus::kSuccess, - render_frame_host().GetPageUkmSourceId(), - provider_); + token_response_time_ - start_time_); + fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kSuccess); CompleteRequest(FederatedAuthRequestResult::kSuccess, token, /*should_call_callback=*/true); return; @@ -1149,9 +1113,8 @@ // either. We record `kUserInterfaceTimedOut` only when the UI is displayed // and then time out without user interaction. if (!errors_logged_to_console_) { - RecordRequestTokenStatus(TokenStatus::kUserInterfaceTimedOut, - render_frame_host().GetPageUkmSourceId(), - provider_); + fedcm_metrics_->RecordRequestTokenStatus( + TokenStatus::kUserInterfaceTimedOut); } CompleteRequest(FederatedAuthRequestResult::kError, "", /*should_call_callback=*/true);
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h index 17f11bab..d6c63716 100644 --- a/content/browser/webid/federated_auth_request_impl.h +++ b/content/browser/webid/federated_auth_request_impl.h
@@ -14,6 +14,7 @@ #include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "content/browser/webid/fedcm_metrics.h" #include "content/browser/webid/idp_network_request_manager.h" #include "content/common/content_export.h" #include "content/public/browser/document_service.h" @@ -153,6 +154,10 @@ std::unique_ptr<IdpNetworkRequestManager> mock_network_manager_; std::unique_ptr<IdentityRequestDialogController> mock_dialog_controller_; + // Helper that records FedCM UMA and UKM metrics. Initialized in the + // RequestToken() method, so all metrics must be recorded after that. + std::unique_ptr<FedCmMetrics> fedcm_metrics_; + // Parameters of auth request. GURL provider_;
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 404e744..86ae9db 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -336,6 +336,9 @@ blink::features::kCancelFormSubmissionInDefaultHandler}, {"ClipboardCustomFormats", blink::features::kClipboardCustomFormats}, {"CSSContainerQueries", blink::features::kCSSContainerQueries}, + {"CSSOverflowForReplacedElements", + blink::features::kCSSOverflowForReplacedElements, + kSetOnlyIfOverridden}, {"ComputePressure", blink::features::kComputePressure, kSetOnlyIfOverridden}, {"DeferredShaping", blink::features::kDeferredFontShaping},
diff --git a/content/public/renderer/BUILD.gn b/content/public/renderer/BUILD.gn index fecca011..5a9b007 100644 --- a/content/public/renderer/BUILD.gn +++ b/content/public/renderer/BUILD.gn
@@ -40,8 +40,6 @@ "render_thread.h", "render_thread_observer.cc", "render_thread_observer.h", - "render_view.h", - "render_view_visitor.h", "v8_value_converter.h", "video_encode_accelerator.cc", "video_encode_accelerator.h",
diff --git a/content/public/renderer/render_view.h b/content/public/renderer/render_view.h deleted file mode 100644 index e1c91c87..0000000 --- a/content/public/renderer/render_view.h +++ /dev/null
@@ -1,57 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_PUBLIC_RENDERER_RENDER_VIEW_H_ -#define CONTENT_PUBLIC_RENDERER_RENDER_VIEW_H_ - -#include <stddef.h> - -#include "build/build_config.h" -#include "content/common/content_export.h" -#include "ui/gfx/native_widget_types.h" - -namespace blink { -class WebView; -} // namespace blink - -namespace content { - -class RenderFrame; -class RenderViewVisitor; - -// RenderView corresponds to the content container of a renderer's subset -// of the frame tree. A frame tree that spans multiple renderers will have a -// RenderView in each renderer, containing the local frames that belong to -// that renderer. The RenderView holds non-frame-related state that is -// replicated across all renderers, and is a fairly shallow object. -// Generally, most APIs care about state related to the document content which -// should be accessed through RenderFrame instead. -// -// WARNING: Historically RenderView was the path to get to the main frame, -// and the entire frame tree, but that is no longer the case. Usually -// RenderFrame is a more appropriate surface for new code, unless the code is -// agnostic of frames and document content or structure. For more context, -// please see https://crbug.com/467770 and -// https://www.chromium.org/developers/design-documents/site-isolation. -class CONTENT_EXPORT RenderView { - public: - // Visit all RenderViews with a live WebView (i.e., RenderViews that have - // been closed but not yet destroyed are excluded). - static void ForEach(RenderViewVisitor* visitor); - - // Returns the associated WebView. May return NULL when the view is closing. - virtual blink::WebView* GetWebView() = 0; - - protected: - virtual ~RenderView() {} - - private: - // This interface should only be implemented inside content. - friend class RenderViewImpl; - RenderView() {} -}; - -} // namespace content - -#endif // CONTENT_PUBLIC_RENDERER_RENDER_VIEW_H_
diff --git a/content/public/renderer/render_view_visitor.h b/content/public/renderer/render_view_visitor.h deleted file mode 100644 index c424af3..0000000 --- a/content/public/renderer/render_view_visitor.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_PUBLIC_RENDERER_RENDER_VIEW_VISITOR_H_ -#define CONTENT_PUBLIC_RENDERER_RENDER_VIEW_VISITOR_H_ - -namespace content { - -class RenderView; - -class RenderViewVisitor { - public: - // Return true to continue visiting RenderViews or false to stop. - virtual bool Visit(RenderView* render_view) = 0; - - protected: - virtual ~RenderViewVisitor() {} -}; - -} // namespace content - -#endif // CONTENT_PUBLIC_RENDERER_RENDER_VIEW_VISITOR_H_
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 95735cf..b85a875 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -27,7 +27,6 @@ #include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" #include "content/public/renderer/content_renderer_client.h" -#include "content/public/renderer/render_view_visitor.h" #include "content/public/test/content_test_suite_base.h" #include "content/public/test/fake_render_widget_host.h" #include "content/public/test/frame_load_waiter.h" @@ -98,37 +97,6 @@ namespace { -// This class records, and then tears down all existing RenderViews. It's -// important to do this in two steps, since tearing down a RenderView will -// mutate the container that RenderView::ForEach() iterates over. -class CloseMessageSendingRenderViewVisitor : public RenderViewVisitor { - public: - CloseMessageSendingRenderViewVisitor() = default; - - CloseMessageSendingRenderViewVisitor( - const CloseMessageSendingRenderViewVisitor&) = delete; - CloseMessageSendingRenderViewVisitor& operator=( - const CloseMessageSendingRenderViewVisitor&) = delete; - - ~CloseMessageSendingRenderViewVisitor() override = default; - - void CloseRenderViews() { - for (RenderView* render_view : live_render_views) { - RenderViewImpl* view_impl = static_cast<RenderViewImpl*>(render_view); - view_impl->Destroy(); - } - } - - protected: - bool Visit(RenderView* render_view) override { - live_render_views.push_back(render_view); - return true; - } - - private: - std::vector<RenderView*> live_render_views; -}; - class FakeWebURLLoader : public blink::WebURLLoader { public: FakeWebURLLoader( @@ -556,7 +524,6 @@ blink::mojom::RecordContentToVisibleTimeRequestPtr()); waiter.Wait(); - view_ = view; web_view_ = view->GetWebView(); } @@ -569,15 +536,10 @@ leak_detector.BindNewPipeAndPassReceiver()); std::ignore = binders_.TryBind(&receiver); - // Close the main |view_| as well as any other windows that might have been + // Close the main view as well as any other windows that might have been // opened by the test. - CloseMessageSendingRenderViewVisitor closing_visitor; - RenderView::ForEach(&closing_visitor); - closing_visitor.CloseRenderViews(); + RenderViewImpl::DestroyAllRenderViewImpls(); - // |view_| is ref-counted and deletes itself during the RunUntilIdle() call - // below. - view_ = nullptr; web_view_ = nullptr; process_.reset();
diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h index e22d8ab3..8841db5 100644 --- a/content/public/test/render_view_test.h +++ b/content/public/test/render_view_test.h
@@ -212,12 +212,8 @@ base::test::TaskEnvironment task_environment_; std::unique_ptr<RenderProcess> process_; - // We use a naked pointer because we don't want to expose RenderViewImpl in - // the embedder's namespace. - raw_ptr<RenderView> view_ = nullptr; - // The WebView is owned by `view_` but provided as a raw pointer here. This - // will provide a transition of eventually removing RenderView and owning - // it directly here. See https://crbug.com/1155202. + // `web_view` is owned by the associated `RenderView` (which we do not store). + // All allocated `RenderView`s will be destroyed in the `TearDown` method. raw_ptr<blink::WebView> web_view_ = nullptr; RendererBlinkPlatformImplTestOverride blink_platform_impl_; std::unique_ptr<ContentClient> content_client_;
diff --git a/content/public/test/test_web_ui.cc b/content/public/test/test_web_ui.cc index c88a2bb..0163e8c 100644 --- a/content/public/test/test_web_ui.cc +++ b/content/public/test/test_web_ui.cc
@@ -189,19 +189,19 @@ } void TestWebUI::CallData::TakeAsArg1(std::unique_ptr<base::Value> arg) { - arg1_ = std::move(arg); + args_[0] = std::move(arg); } void TestWebUI::CallData::TakeAsArg2(std::unique_ptr<base::Value> arg) { - arg2_ = std::move(arg); + args_[1] = std::move(arg); } void TestWebUI::CallData::TakeAsArg3(std::unique_ptr<base::Value> arg) { - arg3_ = std::move(arg); + args_[2] = std::move(arg); } void TestWebUI::CallData::TakeAsArg4(std::unique_ptr<base::Value> arg) { - arg4_ = std::move(arg); + args_[3] = std::move(arg); } } // namespace content
diff --git a/content/public/test/test_web_ui.h b/content/public/test/test_web_ui.h index 2f79095..8bde8d7b 100644 --- a/content/public/test/test_web_ui.h +++ b/content/public/test/test_web_ui.h
@@ -92,17 +92,18 @@ void TakeAsArg4(std::unique_ptr<base::Value> arg); const std::string& function_name() const { return function_name_; } - const base::Value* arg1() const { return arg1_.get(); } - const base::Value* arg2() const { return arg2_.get(); } - const base::Value* arg3() const { return arg3_.get(); } - const base::Value* arg4() const { return arg4_.get(); } + const base::Value* arg1() const { return args_[0].get(); } + const base::Value* arg2() const { return args_[1].get(); } + const base::Value* arg3() const { return args_[2].get(); } + const base::Value* arg4() const { return args_[3].get(); } + + const std::array<std::unique_ptr<base::Value>, 4>& args() const { + return args_; + } private: std::string function_name_; - std::unique_ptr<base::Value> arg1_; - std::unique_ptr<base::Value> arg2_; - std::unique_ptr<base::Value> arg3_; - std::unique_ptr<base::Value> arg4_; + std::array<std::unique_ptr<base::Value>, 4> args_; }; const std::vector<std::unique_ptr<CallData>>& call_data() const {
diff --git a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc index ea549c54..fecec0a 100644 --- a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc +++ b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
@@ -306,10 +306,6 @@ } protected: - RenderViewImpl* view() { - return static_cast<RenderViewImpl*>(view_); - } - RenderFrameImpl* frame() { return static_cast<RenderFrameImpl*>(RenderViewTest::GetMainRenderFrame()); }
diff --git a/content/renderer/pepper/mock_renderer_ppapi_host.cc b/content/renderer/pepper/mock_renderer_ppapi_host.cc index bbfc935..544ddc8 100644 --- a/content/renderer/pepper/mock_renderer_ppapi_host.cc +++ b/content/renderer/pepper/mock_renderer_ppapi_host.cc
@@ -4,7 +4,6 @@ #include "content/renderer/pepper/mock_renderer_ppapi_host.h" -#include "content/public/renderer/render_view.h" #include "content/renderer/pepper/fake_pepper_plugin_instance.h" #include "ui/gfx/geometry/point.h"
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 2826a2d..2f86fff 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -77,7 +77,6 @@ #include "content/public/common/url_constants.h" #include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/render_thread_observer.h" -#include "content/public/renderer/render_view_visitor.h" #include "content/renderer/agent_scheduling_group.h" #include "content/renderer/browser_exposed_renderer_interfaces.h" #include "content/renderer/categorized_worker_pool.h"
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index dbd90c2e..9cd1089a 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -317,8 +317,6 @@ ~RenderViewImplTest() override {} - RenderViewImpl* view() { return static_cast<RenderViewImpl*>(view_); } - blink::WebFrameWidget* main_frame_widget() { return frame()->GetLocalRootWebFrameWidget(); } @@ -961,12 +959,13 @@ popup_request.SetMode(network::mojom::RequestMode::kNavigate); popup_request.SetRedirectMode(network::mojom::RedirectMode::kManual); popup_request.SetRequestContext(blink::mojom::RequestContextType::INTERNAL); - blink::WebView* new_web_view = view()->CreateView( - GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo", - blink::kWebNavigationPolicyNewForegroundTab, - network::mojom::WebSandboxFlags::kNone, - blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture, - absl::nullopt, absl::nullopt); + blink::WebView* new_web_view = + RenderViewImpl::FromWebView(web_view_)->CreateView( + GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo", + blink::kWebNavigationPolicyNewForegroundTab, + network::mojom::WebSandboxFlags::kNone, + blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture, + absl::nullopt, absl::nullopt); auto popup_navigation_info = std::make_unique<blink::WebNavigationInfo>(); popup_navigation_info->url_request = std::move(popup_request); popup_navigation_info->frame_type = @@ -2558,8 +2557,6 @@ return new TestContentRendererClient; } - RenderViewImpl* view() { return static_cast<RenderViewImpl*>(view_); } - RenderFrameImpl* frame() { return static_cast<RenderFrameImpl*>(GetMainRenderFrame()); }
diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm index 6ef4c60d9..07b2136 100644 --- a/content/renderer/render_view_browsertest_mac.mm +++ b/content/renderer/render_view_browsertest_mac.mm
@@ -8,7 +8,6 @@ #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/test/render_view_test.h" #include "content/renderer/render_frame_impl.h" -#include "content/renderer/render_view_impl.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" #include "third_party/blink/public/test/test_web_frame_content_dumper.h" @@ -77,14 +76,10 @@ blink::web_pref::WebPreferences prefs; prefs.enable_scroll_animator = false; - RenderViewImpl* view = static_cast<RenderViewImpl*>(view_); - blink::WebFrameWidget* blink_widget = view->GetWebView() - ->MainFrame() - ->ToWebLocalFrame() - ->LocalRoot() - ->FrameWidget(); + blink::WebFrameWidget* blink_widget = + web_view_->MainFrame()->ToWebLocalFrame()->LocalRoot()->FrameWidget(); - view->GetWebView()->SetWebPreferences(prefs); + web_view_->SetWebPreferences(prefs); const int kMaxOutputCharacters = 1024; std::string output; @@ -94,8 +89,7 @@ NSEvent* arrowUpKeyDown = CmdDeadKeyEvent(NSEventTypeKeyDown, kVK_UpArrow); // First test when javascript does not eat keypresses -- should scroll. - RenderFrameImpl::FromWebFrame( - view->GetWebView()->MainFrame()->ToWebLocalFrame()) + RenderFrameImpl::FromWebFrame(web_view_->MainFrame()->ToWebLocalFrame()) ->set_send_content_state_immediately(true); LoadHTML(kRawHtml); render_thread_->sink().ClearMessages(); @@ -106,7 +100,7 @@ SendNativeKeyEvent(NativeWebKeyboardEvent(arrowDownKeyDown)); base::RunLoop().RunUntilIdle(); ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); - output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(), + output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_, kMaxOutputCharacters) .Ascii(); EXPECT_EQ(kArrowDownScrollDown, output); @@ -118,7 +112,7 @@ SendNativeKeyEvent(NativeWebKeyboardEvent(arrowUpKeyDown)); base::RunLoop().RunUntilIdle(); ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); - output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(), + output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_, kMaxOutputCharacters) .Ascii(); EXPECT_EQ(kArrowUpScrollUp, output); @@ -134,7 +128,7 @@ SendNativeKeyEvent(NativeWebKeyboardEvent(arrowDownKeyDown)); base::RunLoop().RunUntilIdle(); ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); - output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(), + output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_, kMaxOutputCharacters) .Ascii(); EXPECT_EQ(kArrowDownNoScroll, output); @@ -146,7 +140,7 @@ SendNativeKeyEvent(NativeWebKeyboardEvent(arrowUpKeyDown)); base::RunLoop().RunUntilIdle(); ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset"); - output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(), + output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_, kMaxOutputCharacters) .Ascii(); EXPECT_EQ(kArrowUpNoScroll, output);
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index a1e260f..11eaa6b 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -24,7 +24,6 @@ #include "content/public/common/content_switches.h" #include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/render_thread.h" -#include "content/public/renderer/render_view_visitor.h" #include "content/public/renderer/window_features_converter.h" #include "content/renderer/agent_scheduling_group.h" #include "content/renderer/render_frame_impl.h" @@ -209,12 +208,10 @@ } /*static*/ -void RenderView::ForEach(RenderViewVisitor* visitor) { +void RenderViewImpl::DestroyAllRenderViewImpls() { DCHECK(RenderThread::IsMainThread()); - ViewMap* views = g_view_map.Pointer(); - for (auto it = views->begin(); it != views->end(); ++it) { - if (!visitor->Visit(it->second)) - return; + while (!g_view_map.Get().empty()) { + g_view_map.Get().begin()->second->Destroy(); } }
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 792b430..2f07347 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -21,7 +21,6 @@ #include "content/public/common/page_visibility_state.h" #include "content/public/common/page_zoom.h" #include "content/public/common/referrer.h" -#include "content/public/renderer/render_view.h" #include "ipc/ipc_platform_file.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote_set.h" @@ -59,8 +58,7 @@ class CreateViewParams; } -// RenderViewImpl (the implementation of RenderView) is the renderer process -// object that owns the blink frame tree. +// RenderViewImpl is the renderer process object that owns the blink frame tree. // // Each top-level web container has a frame tree, and thus a RenderViewImpl. // Typically such a container is a browser tab, or a tab-less window. It can @@ -71,17 +69,16 @@ // placeholders behind. Each such frame tree also includes a RenderViewImpl as // the owner of it. Thus a tab may have multiple RenderViewImpls, one for the // main frame, and one for each other frame tree generated. -class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient, - public RenderView { +class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient { public: // Creates a new RenderView. Note that if the original opener has been closed, // |params.window_was_created_with_opener| will be true and // |params.opener_frame_route_id| will be MSG_ROUTING_NONE. // When |params.proxy_routing_id| instead of |params.main_frame_routing_id| is - // specified, a RenderFrameProxy will be created for this RenderView's main - // RenderFrame. - // The opener should provide a non-null value for |show_callback| if it needs - // to send an additional IPC to finish making this view visible. + // specified, a RenderFrameProxy will be created for this RenderViewImpl's + // main RenderFrame. The opener should provide a non-null value for + // |show_callback| if it needs to send an additional IPC to finish making this + // view visible. static RenderViewImpl* Create( AgentSchedulingGroup& agent_scheduling_group, mojom::CreateViewParamsPtr params, @@ -117,9 +114,7 @@ const absl::optional<blink::WebPictureInPictureWindowOptions>& pip_options) override; - // RenderView implementation ------------------------------------------------- - - blink::WebView* GetWebView() override; + blink::WebView* GetWebView(); // Please do not add your stuff randomly to the end here. If there is an // appropriate section, add it there. If not, there are some random functions @@ -155,6 +150,9 @@ static WindowOpenDisposition NavigationPolicyToDisposition( blink::WebNavigationPolicy policy); + // Destroy all active RenderViewImpls. + static void DestroyAllRenderViewImpls(); + // --------------------------------------------------------------------------- // ADDING NEW FUNCTIONS? Please keep private functions alphabetized and put // it in the same order in the .cc file as it was in the header. @@ -167,7 +165,7 @@ // RenderViewHost in the parent browser process. const int32_t routing_id_; - // Whether lookup of frames in the created RenderView (e.g. lookup via + // Whether lookup of frames in the created RenderViewImpl (e.g. lookup via // window.open or via <a target=...>) should be renderer-wide (i.e. going // beyond the usual opener-relationship-based BrowsingInstance boundaries). const bool renderer_wide_named_frame_lookup_; @@ -188,7 +186,7 @@ #if BUILDFLAG(IS_ANDROID) // Android Specific ---------------------------------------------------------- - // Whether this was a renderer-created or browser-created RenderView. + // Whether this was a renderer-created or browser-created RenderViewImpl. bool was_created_by_renderer_ = false; #endif @@ -196,7 +194,7 @@ // ADDING NEW DATA? Please see if it fits appropriately in one of the above // sections rather than throwing it randomly at the end. If you're adding a // bunch of stuff, you should probably create a helper class and put your - // data and methods on that to avoid bloating RenderView more. You can + // data and methods on that to avoid bloating RenderViewImpl more. You can // use the Observer interface to filter IPC messages and receive frame change // notifications. // ---------------------------------------------------------------------------
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc index 34a4bb1..e8878a1 100644 --- a/content/web_test/renderer/test_runner.cc +++ b/content/web_test/renderer/test_runner.cc
@@ -23,7 +23,6 @@ #include "cc/paint/paint_canvas.h" #include "content/public/common/isolated_world_ids.h" #include "content/public/renderer/render_frame_observer.h" -#include "content/public/renderer/render_view_visitor.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h" #include "content/web_test/common/web_test_constants.h"
diff --git a/docs/dangling_ptr.md b/docs/dangling_ptr.md index c854b56d..fabfb2dfd 100644 --- a/docs/dangling_ptr.md +++ b/docs/dangling_ptr.md
@@ -43,8 +43,7 @@ ```bash ./out/dangling/content_shell \ - --enable-features=PartitionAllocBackupRefPtr \ - --enable-features=PartitionAllocDanglingPtr + --enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr ``` By default, Chrome will crash on the first dangling raw_ptr detected. @@ -54,8 +53,7 @@ ### Crash (default) ```bash ---enable-features=PartitionAllocBackupRefPtr \ ---enable-features=PartitionAllocDanglingPtr:mode/crash +--enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr:mode/crash ``` ### Record a list of signatures @@ -63,8 +61,7 @@ Example usage: ```bash ./out/dangling/content_shell \ - --enable-features=PartitionAllocBackupRefPtr \ - --enable-features=PartitionAllocDanglingPtr:mode/log_signature \ + --enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr:mode/log_signature \ |& tee output ```
diff --git a/docs/speed/perf_lab_platforms.md b/docs/speed/perf_lab_platforms.md index 58795c6..0ec56edb 100644 --- a/docs/speed/perf_lab_platforms.md +++ b/docs/speed/perf_lab_platforms.md
@@ -26,6 +26,7 @@ ## Chromeos * [lacros-eve-perf](https://ci.chromium.org/p/chrome/builders/ci/lacros-eve-perf): . + * [lacros-x86-perf](https://ci.chromium.org/p/chrome/builders/ci/lacros-x86-perf): . ## Linux
diff --git a/extensions/browser/api/content_settings/content_settings_service.cc b/extensions/browser/api/content_settings/content_settings_service.cc index 37b68f7..109fb0079 100644 --- a/extensions/browser/api/content_settings/content_settings_service.cc +++ b/extensions/browser/api/content_settings/content_settings_service.cc
@@ -46,14 +46,13 @@ if (prefs->ReadPrefAsList( extension_id, pref_names::kPrefContentSettings, &content_settings)) { content_settings_store_->SetExtensionContentSettingFromList( - extension_id, content_settings->GetListDeprecated(), - kExtensionPrefsScopeRegular); + extension_id, content_settings->GetList(), kExtensionPrefsScopeRegular); } if (prefs->ReadPrefAsList(extension_id, pref_names::kPrefIncognitoContentSettings, &content_settings)) { content_settings_store_->SetExtensionContentSettingFromList( - extension_id, content_settings->GetListDeprecated(), + extension_id, content_settings->GetList(), kExtensionPrefsScopeIncognitoPersistent); } }
diff --git a/extensions/browser/api/content_settings/content_settings_store.cc b/extensions/browser/api/content_settings/content_settings_store.cc index bfcfff4a..0d16c3a2 100644 --- a/extensions/browser/api/content_settings/content_settings_store.cc +++ b/extensions/browser/api/content_settings/content_settings_store.cc
@@ -266,7 +266,7 @@ NotifyOfContentSettingChanged(ext_id, scope != kExtensionPrefsScopeRegular); } -std::vector<base::Value> ContentSettingsStore::GetSettingsForExtension( +base::Value::List ContentSettingsStore::GetSettingsForExtension( const std::string& extension_id, ExtensionPrefsScope scope) const { base::AutoLock lock(lock_); @@ -274,7 +274,7 @@ if (!map) return {}; - std::vector<base::Value> settings; + base::Value::List settings; for (const auto& it : *map) { const auto& key = it.first; std::unique_ptr<RuleIterator> rule_iterator( @@ -285,12 +285,10 @@ while (rule_iterator->HasNext()) { const Rule& rule = rule_iterator->Next(); - base::Value setting_dict(base::Value::Type::DICTIONARY); - setting_dict.SetStringKey(kPrimaryPatternKey, - rule.primary_pattern.ToString()); - setting_dict.SetStringKey(kSecondaryPatternKey, - rule.secondary_pattern.ToString()); - setting_dict.SetStringKey( + base::Value::Dict setting_dict; + setting_dict.Set(kPrimaryPatternKey, rule.primary_pattern.ToString()); + setting_dict.Set(kSecondaryPatternKey, rule.secondary_pattern.ToString()); + setting_dict.Set( kContentSettingsTypeKey, content_settings_helpers::ContentSettingsTypeToString(key)); ContentSetting content_setting = @@ -301,29 +299,30 @@ content_settings::ContentSettingToString(content_setting); DCHECK(!setting_string.empty()); - setting_dict.SetStringKey(kContentSettingKey, setting_string); - settings.push_back(std::move(setting_dict)); + setting_dict.Set(kContentSettingKey, setting_string); + settings.Append(std::move(setting_dict)); } } return settings; } -#define LOG_INVALID_EXTENSION_PREFERENCE_DETAILS \ - LOG(ERROR) << "Found invalid extension pref: " << dict \ +#define LOG_INVALID_EXTENSION_PREFERENCE_DETAILS \ + LOG(ERROR) << "Found invalid extension pref: " << value \ << " extension id: " << extension_id void ContentSettingsStore::SetExtensionContentSettingFromList( const std::string& extension_id, - base::Value::ConstListView list, + const base::Value::List& list, ExtensionPrefsScope scope) { - for (const base::Value& dict : list) { - if (!dict.is_dict()) { + for (const base::Value& value : list) { + if (!value.is_dict()) { LOG_INVALID_EXTENSION_PREFERENCE_DETAILS; continue; } + const base::Value::Dict& dict = value.GetDict(); const std::string* primary_pattern_str = - dict.FindStringKey(kPrimaryPatternKey); + dict.FindString(kPrimaryPatternKey); if (!primary_pattern_str) { LOG_INVALID_EXTENSION_PREFERENCE_DETAILS; continue; @@ -336,7 +335,7 @@ } const std::string* secondary_pattern_str = - dict.FindStringKey(kSecondaryPatternKey); + dict.FindString(kSecondaryPatternKey); if (!secondary_pattern_str) { LOG_INVALID_EXTENSION_PREFERENCE_DETAILS; continue; @@ -348,8 +347,7 @@ continue; } - auto* content_settings_type_str = - dict.FindStringKey(kContentSettingsTypeKey); + auto* content_settings_type_str = dict.FindString(kContentSettingsTypeKey); if (!content_settings_type_str) { LOG_INVALID_EXTENSION_PREFERENCE_DETAILS; continue; @@ -392,7 +390,7 @@ ContentSetting setting; const std::string* content_setting_str = - dict.FindStringKey(kContentSettingKey); + dict.FindString(kContentSettingKey); if (!content_setting_str) { LOG_INVALID_EXTENSION_PREFERENCE_DETAILS; continue;
diff --git a/extensions/browser/api/content_settings/content_settings_store.h b/extensions/browser/api/content_settings/content_settings_store.h index 26c8bcb9..85762ca 100644 --- a/extensions/browser/api/content_settings/content_settings_store.h +++ b/extensions/browser/api/content_settings/content_settings_store.h
@@ -15,15 +15,12 @@ #include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" +#include "base/values.h" #include "components/content_settings/core/browser/content_settings_provider.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_pattern.h" #include "extensions/browser/extension_prefs_scope.h" -namespace base { -class Value; -} - namespace content_settings { class OriginIdentifierValueMap; class RuleIterator; @@ -91,14 +88,13 @@ // Serializes all content settings set by the extension with ID |extension_id| // and returns them as a list of Values. - std::vector<base::Value> GetSettingsForExtension( - const std::string& extension_id, - ExtensionPrefsScope scope) const; + base::Value::List GetSettingsForExtension(const std::string& extension_id, + ExtensionPrefsScope scope) const; // Deserializes content settings rules from |list| and applies them as set by // the extension with ID |extension_id|. void SetExtensionContentSettingFromList(const std::string& extension_id, - base::Value::ConstListView list, + const base::Value::List& list, ExtensionPrefsScope scope); // //////////////////////////////////////////////////////////////////////////
diff --git a/extensions/browser/api/content_settings/content_settings_store_unittest.cc b/extensions/browser/api/content_settings/content_settings_store_unittest.cc index c2cec7d..15e8c580 100644 --- a/extensions/browser/api/content_settings/content_settings_store_unittest.cc +++ b/extensions/browser/api/content_settings/content_settings_store_unittest.cc
@@ -243,41 +243,35 @@ EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false)); // Build a preference list in JSON format. - std::vector<base::Value> pref_list; + base::Value::List pref_list; // {"primaryPattern": pattern, "secondaryPattern": pattern, "type": "cookies", // "setting": "allow"} - base::Value dict_value(base::Value::Type::DICTIONARY); - dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, - pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "cookies"); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow"); - pref_list.push_back(std::move(dict_value)); + base::Value::Dict dict_value; + dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, pattern.ToString()); + dict_value.Set(ContentSettingsStore::kSecondaryPatternKey, + pattern.ToString()); + dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "cookies"); + dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); // Test content settings types that have been removed. Should be ignored. // {"primaryPattern": pattern, "secondaryPattern": pattern, // "type": "fullscreen", "setting": "allow"} - dict_value = base::Value(base::Value::Type::DICTIONARY); - dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, - pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "fullscreen"); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow"); - pref_list.push_back(std::move(dict_value)); + dict_value = base::Value::Dict(); + dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, pattern.ToString()); + dict_value.Set(ContentSettingsStore::kSecondaryPatternKey, + pattern.ToString()); + dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "fullscreen"); + dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); // {"primaryPattern": pattern, "secondaryPattern": pattern, // "type": "mouselock", "setting": "allow"} - dict_value = base::Value(base::Value::Type::DICTIONARY); - dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, - pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "mouselock"); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow"); - pref_list.push_back(std::move(dict_value)); + dict_value = base::Value::Dict(); + dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, pattern.ToString()); + dict_value.Set(ContentSettingsStore::kSecondaryPatternKey, + pattern.ToString()); + dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "mouselock"); + dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); store()->SetExtensionContentSettingFromList(ext_id, pref_list, kExtensionPrefsScopeRegular); @@ -312,26 +306,24 @@ EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false)).Times(1); // Build a preference list in JSON format. - std::vector<base::Value> pref_list; - base::Value dict_value(base::Value::Type::DICTIONARY); - dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - primary_pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, - secondary_pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "cookies"); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow"); - pref_list.push_back(std::move(dict_value)); + base::Value::List pref_list; + base::Value::Dict dict_value; + dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, + primary_pattern.ToString()); + dict_value.Set(ContentSettingsStore::kSecondaryPatternKey, + secondary_pattern.ToString()); + dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "cookies"); + dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); - dict_value = base::Value(base::Value::Type::DICTIONARY); - dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - primary_pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, - secondary_pattern.ToString()); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "geolocation"); - dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow"); - pref_list.push_back(std::move(dict_value)); + dict_value = base::Value::Dict(); + dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, + primary_pattern.ToString()); + dict_value.Set(ContentSettingsStore::kSecondaryPatternKey, + secondary_pattern.ToString()); + dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "geolocation"); + dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow"); + pref_list.Append(std::move(dict_value)); store()->SetExtensionContentSettingFromList(ext_id, pref_list, kExtensionPrefsScopeRegular); @@ -355,55 +347,50 @@ std::string extension = "extension_id"; RegisterExtension(extension); - base::Value valid_setting(base::Value::Type::DICTIONARY); - valid_setting.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - "http://example1.com"); - valid_setting.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, "*"); - valid_setting.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "javascript"); - valid_setting.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow"); + base::Value::Dict valid_setting; + valid_setting.Set(ContentSettingsStore::kPrimaryPatternKey, + "http://example1.com"); + valid_setting.Set(ContentSettingsStore::kSecondaryPatternKey, "*"); + valid_setting.Set(ContentSettingsStore::kContentSettingsTypeKey, + "javascript"); + valid_setting.Set(ContentSettingsStore::kContentSettingKey, "allow"); // Missing secondary key. - base::Value invalid_setting1(base::Value::Type::DICTIONARY); - invalid_setting1.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - "http://example2.com"); - invalid_setting1.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "javascript"); - invalid_setting1.SetStringKey(ContentSettingsStore::kContentSettingKey, - "allow"); + base::Value::Dict invalid_setting1; + invalid_setting1.Set(ContentSettingsStore::kPrimaryPatternKey, + "http://example2.com"); + invalid_setting1.Set(ContentSettingsStore::kContentSettingsTypeKey, + "javascript"); + invalid_setting1.Set(ContentSettingsStore::kContentSettingKey, "allow"); // Invalid secondary pattern. - base::Value invalid_setting2(base::Value::Type::DICTIONARY); - invalid_setting2.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - "http://example3.com"); - invalid_setting2.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, - "[*.]."); - invalid_setting2.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "javascript"); - invalid_setting2.SetStringKey(ContentSettingsStore::kContentSettingKey, - "allow"); + base::Value::Dict invalid_setting2; + invalid_setting2.Set(ContentSettingsStore::kPrimaryPatternKey, + "http://example3.com"); + invalid_setting2.Set(ContentSettingsStore::kSecondaryPatternKey, "[*.]."); + invalid_setting2.Set(ContentSettingsStore::kContentSettingsTypeKey, + "javascript"); + invalid_setting2.Set(ContentSettingsStore::kContentSettingKey, "allow"); // Invalid setting. - base::Value invalid_setting3(base::Value::Type::DICTIONARY); - invalid_setting3.SetStringKey(ContentSettingsStore::kPrimaryPatternKey, - "http://example4.com"); - invalid_setting3.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, - "*"); - invalid_setting3.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey, - "javascript"); - invalid_setting3.SetStringKey(ContentSettingsStore::kContentSettingKey, - "notasetting"); + base::Value::Dict invalid_setting3; + invalid_setting3.Set(ContentSettingsStore::kPrimaryPatternKey, + "http://example4.com"); + invalid_setting3.Set(ContentSettingsStore::kSecondaryPatternKey, "*"); + invalid_setting3.Set(ContentSettingsStore::kContentSettingsTypeKey, + "javascript"); + invalid_setting3.Set(ContentSettingsStore::kContentSettingKey, "notasetting"); - std::vector<base::Value> list; - list.push_back(valid_setting.Clone()); - list.push_back(invalid_setting1.Clone()); - list.push_back(invalid_setting2.Clone()); - list.push_back(invalid_setting3.Clone()); + base::Value::List list; + list.Append(valid_setting.Clone()); + list.Append(invalid_setting1.Clone()); + list.Append(invalid_setting2.Clone()); + list.Append(invalid_setting3.Clone()); store()->SetExtensionContentSettingFromList( extension, list, ExtensionPrefsScope::kExtensionPrefsScopeRegular); - std::vector<base::Value> expected; - expected.push_back(valid_setting.Clone()); + base::Value::List expected; + expected.Append(valid_setting.Clone()); EXPECT_EQ(expected, store()->GetSettingsForExtension( extension, ExtensionPrefsScope::kExtensionPrefsScopeRegular));
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index f99ef69c..03cc8dd 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1742,6 +1742,7 @@ FILEMANAGERPRIVATE_OPENMANAGESYNCSETTINGS = 1679, PASSWORDSPRIVATE_STARTAUTOMATEDPASSWORDCHANGE = 1680, OFFSCREEN_CREATEDOCUMENT = 1681, + PASSWORDSPRIVATE_REFRESHSCRIPTSIFNECESSARY = 1682, // Last entry: Add new entries above, then run: // tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/browser/extension_host.cc b/extensions/browser/extension_host.cc index 7c5d80c5..04b9beb 100644 --- a/extensions/browser/extension_host.cc +++ b/extensions/browser/extension_host.cc
@@ -142,8 +142,17 @@ } void ExtensionHost::Close() { - for (auto& observer : observer_list_) - observer.OnExtensionHostShouldClose(this); + // Some ways of closing the host may be asynchronous, which would allow the + // contents to call Close() multiple times. If we've already called the + // handler once, ignore subsequent calls. If we haven't called the handler + // once, the handler should be present. + DCHECK(close_handler_ || called_close_handler_); + if (called_close_handler_) + return; + + called_close_handler_ = true; + std::move(close_handler_).Run(this); + // NOTE: `this` may be deleted at this point! } void ExtensionHost::AddObserver(ExtensionHostObserver* observer) { @@ -172,6 +181,12 @@ observer.OnNetworkRequestDone(this, request_id); } +void ExtensionHost::SetCloseHandler(CloseHandler close_handler) { + DCHECK(!close_handler_); + DCHECK(!called_close_handler_); + close_handler_ = std::move(close_handler); +} + bool ExtensionHost::ShouldAllowNavigations() const { // Don't allow background pages or offscreen documents to navigate. return extension_host_type_ != mojom::ViewType::kExtensionBackgroundPage &&
diff --git a/extensions/browser/extension_host.h b/extensions/browser/extension_host.h index 71599a1..35f6735 100644 --- a/extensions/browser/extension_host.h +++ b/extensions/browser/extension_host.h
@@ -11,6 +11,7 @@ #include <string> #include <unordered_map> +#include "base/callback.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" @@ -49,6 +50,8 @@ public ExtensionFunctionDispatcher::Delegate, public ExtensionRegistryObserver { public: + using CloseHandler = base::OnceCallback<void(ExtensionHost*)>; + ExtensionHost(const Extension* extension, content::SiteInstance* site_instance, const GURL& url, @@ -76,6 +79,14 @@ mojom::ViewType extension_host_type() const { return extension_host_type_; } + // Sets the callback responsible for closing the ExtensionHost in response to + // a WebContents::CloseContents() call (which is triggered from e.g. + // calling `window.close()`). This is done separately from the constructor as + // some callsites create an ExtensionHost prior to the object that is + // responsible for later closing it, but must be done before `CloseContents()` + // can be called. + void SetCloseHandler(CloseHandler close_handler); + // Returns the last committed URL of the associated WebContents. const GURL& GetLastCommittedURL() const; @@ -237,6 +248,10 @@ // started only once the ExtensionHost has exited the ExtensionHostQueue. std::unique_ptr<base::ElapsedTimer> load_start_; + CloseHandler close_handler_; + // Whether the close handler has been previously invoked. + bool called_close_handler_ = false; + base::ObserverList<ExtensionHostObserver>::Unchecked observer_list_; base::WeakPtrFactory<ExtensionHost> weak_ptr_factory_{this};
diff --git a/extensions/browser/extension_host_observer.h b/extensions/browser/extension_host_observer.h index 4fdb002a..ae17d33 100644 --- a/extensions/browser/extension_host_observer.h +++ b/extensions/browser/extension_host_observer.h
@@ -45,9 +45,6 @@ // Called when the network request with |request_id| is done. virtual void OnNetworkRequestDone(const ExtensionHost* host, uint64_t request_id) {} - - // Called when ExtensionHost should be closed. - virtual void OnExtensionHostShouldClose(ExtensionHost* host) {} }; } // namespace extensions
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc index 655b5b5..6cf952b 100644 --- a/extensions/browser/extension_prefs.cc +++ b/extensions/browser/extension_prefs.cc
@@ -2116,12 +2116,12 @@ void ExtensionPrefs::SetDNREnabledStaticRulesets( const ExtensionId& extension_id, const std::set<declarative_net_request::RulesetID>& ids) { - std::vector<base::Value> ids_list; + base::Value::List ids_list; for (const auto& id : ids) - ids_list.push_back(base::Value(id.value())); + ids_list.Append(id.value()); UpdateExtensionPref(extension_id, kDNREnabledStaticRulesetIDs, - std::make_unique<base::Value>(ids_list)); + std::make_unique<base::Value>(std::move(ids_list))); } bool ExtensionPrefs::GetDNRUseActionCountAsBadgeText(
diff --git a/extensions/browser/extensions_browser_client.cc b/extensions/browser/extensions_browser_client.cc index 22a1098..1f7c5cf 100644 --- a/extensions/browser/extensions_browser_client.cc +++ b/extensions/browser/extensions_browser_client.cc
@@ -13,6 +13,7 @@ #include "extensions/browser/extension_api_frame_id_map.h" #include "extensions/browser/extension_error.h" #include "extensions/browser/updater/scoped_extension_updater_keep_alive.h" +#include "extensions/common/permissions/permission_set.h" namespace extensions { @@ -174,4 +175,11 @@ return {browser_context}; } +std::unique_ptr<const PermissionSet> +ExtensionsBrowserClient::AddAdditionalAllowedHosts( + const PermissionSet& desired_permissions, + const PermissionSet& granted_permissions) const { + return granted_permissions.Clone(); +} + } // namespace extensions
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h index aa4e3cc..b060c13 100644 --- a/extensions/browser/extensions_browser_client.h +++ b/extensions/browser/extensions_browser_client.h
@@ -79,6 +79,7 @@ class ExtensionSystemProvider; class ExtensionWebContentsObserver; class KioskDelegate; +class PermissionSet; class ProcessManagerDelegate; class ProcessMap; class RuntimeAPIDelegate; @@ -443,6 +444,12 @@ content::BrowserContext* browser_context, const Extension& extension) const; + // Adds any hosts that should be automatically considered "granted" if + // requested, returning a modified permission set. + virtual std::unique_ptr<const PermissionSet> AddAdditionalAllowedHosts( + const PermissionSet& desired_permissions, + const PermissionSet& granted_permissions) const; + private: std::vector<std::unique_ptr<ExtensionsBrowserAPIProvider>> providers_; };
diff --git a/extensions/browser/permissions_manager.cc b/extensions/browser/permissions_manager.cc index 44554d0..91559c13 100644 --- a/extensions/browser/permissions_manager.cc +++ b/extensions/browser/permissions_manager.cc
@@ -443,6 +443,119 @@ std::move(new_explicit_hosts), permissions->scriptable_hosts().Clone()); } +std::unique_ptr<const PermissionSet> +PermissionsManager::GetExtensionDesiredPermissionsFromPrefs( + const Extension& extension) const { + // Determine the extension's "required" permissions (though even these can + // be withheld). + const PermissionSet& required_permissions = + PermissionsParser::GetRequiredPermissions(&extension); + + // Retrieve the desired permissions from prefs. "Desired permissions" here + // are the permissions the extension most recently set for itself. This + // might not be all granted permissions, since extensions can revoke their + // own permissions via chrome.permissions.remove() (which removes the + // permission from the active set, but not the granted set). + std::unique_ptr<const PermissionSet> desired_active_permissions = + extension_prefs_->GetActivePermissions(extension.id()); + // The stored desired permissions may be null if the extension has never + // used the permissions API to modify its active permissions. In this case, + // the desired permissions are simply the set of required permissions. + if (!desired_active_permissions) + return required_permissions.Clone(); + + // Otherwise, the extension has stored a set of desired permissions. This + // could actually be a superset *or* a subset of requested permissions by the + // extension (depending on how its permissions have changed). + // Start by calculating the set of all current potentially-desired + // permissions by combining the required and optional permissions. + std::unique_ptr<const PermissionSet> requested_permissions = + PermissionSet::CreateUnion( + required_permissions, + PermissionsParser::GetOptionalPermissions(&extension)); + + // Now, take the intersection of the requested permissions and the stored + // permissions. This filters out any previously-stored permissions that are + // no longer used (which we continue to store in prefs in case the extension + // wants them back in the future). + std::unique_ptr<const PermissionSet> bounded_desired = + PermissionSet::CreateIntersection(*desired_active_permissions, + *requested_permissions); + + // Additionally, we ensure that all "required" permissions are included in + // this desired set (to guard against any pref corruption - this ensures at + // least everything is in a "sane" state). + // TODO(https://crbug.com/1341118): Maddeningly, the order of the arguments + // passed to CreateUnion() here is *important*. Passing `bounded_desired` as + // the first param results in the valid schemes being removed. + bounded_desired = + PermissionSet::CreateUnion(required_permissions, *bounded_desired); + + return bounded_desired; +} + +std::unique_ptr<const PermissionSet> +PermissionsManager::GetEffectivePermissionsToGrant( + const Extension& extension, + const PermissionSet& desired_permissions) const { + if (!util::CanWithholdPermissionsFromExtension(extension)) { + // The withhold creation flag should never have been set in cases where + // withholding isn't allowed. + DCHECK(!(extension.creation_flags() & Extension::WITHHOLD_PERMISSIONS)); + return desired_permissions.Clone(); + } + + if (desired_permissions.effective_hosts().is_empty()) + return desired_permissions.Clone(); // No hosts to withhold. + + // Determine if we should withhold host permissions. This is different for + // extensions that are being newly-installed and extensions that have already + // been installed; this is indicated by the extension creation flags. + bool should_withhold = false; + if (extension.creation_flags() & Extension::WITHHOLD_PERMISSIONS) + should_withhold = true; + else + should_withhold = HasWithheldHostPermissions(extension.id()); + + if (!should_withhold) + return desired_permissions.Clone(); + + // Otherwise, permissions should be withheld according to the user-granted + // permission set. + + // Determine the permissions granted by the user at runtime. If none are found + // in prefs, default it to an empty set. + std::unique_ptr<const PermissionSet> granted_permissions = + GetRuntimePermissionsFromPrefs(extension); + if (!granted_permissions) + granted_permissions = std::make_unique<PermissionSet>(); + + // Add any additional hosts that should be auto-granted. + granted_permissions = + ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( + desired_permissions, *granted_permissions); + + // Host permissions may be withheld. The resulting set is the intersection of + // the hosts the extension desires and the user has approved or should always + // be granted. + URLPatternSet new_scriptable_hosts = URLPatternSet::CreateIntersection( + desired_permissions.scriptable_hosts(), + granted_permissions->scriptable_hosts(), + URLPatternSet::IntersectionBehavior::kDetailed); + URLPatternSet new_explicit_hosts = URLPatternSet::CreateIntersection( + desired_permissions.explicit_hosts(), + granted_permissions->explicit_hosts(), + URLPatternSet::IntersectionBehavior::kDetailed); + + // The total resulting permissions set includes the new host permissions and + // the originally-requested API and manifest permissions (which are never + // currently withheld). + return std::make_unique<PermissionSet>( + desired_permissions.apis().Clone(), + desired_permissions.manifest_permissions().Clone(), + std::move(new_explicit_hosts), std::move(new_scriptable_hosts)); +} + void PermissionsManager::AddObserver(Observer* observer) { observers_.AddObserver(observer); }
diff --git a/extensions/browser/permissions_manager.h b/extensions/browser/permissions_manager.h index e9626a7..e6150c4 100644 --- a/extensions/browser/permissions_manager.h +++ b/extensions/browser/permissions_manager.h
@@ -148,6 +148,23 @@ std::unique_ptr<const PermissionSet> GetRuntimePermissionsFromPrefs( const Extension& extension) const; + // Returns the set of permissions that the `extension` wants to have active at + // this time. This does *not* take into account user-granted or runtime- + // withheld permissions. + // TODO(https://crbug.com/1268198): This should be a private method once we + // refactor a bit more and have PermissionsManager handle more of permission + // initialization. + std::unique_ptr<const PermissionSet> GetExtensionDesiredPermissionsFromPrefs( + const Extension& extension) const; + + // Returns the set of permissions that should be granted to the given + // `extension` according to the runtime-granted permissions and current + // preferences, omitting host permissions if the extension supports it and + // the user has withheld permissions. + std::unique_ptr<const PermissionSet> GetEffectivePermissionsToGrant( + const Extension& extension, + const PermissionSet& desired_permissions) const; + // Adds or removes observers. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer);
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc index 9637cfe41..edf33b20 100644 --- a/extensions/browser/process_manager.cc +++ b/extensions/browser/process_manager.cc
@@ -382,6 +382,9 @@ ExtensionHost* host = new ExtensionHost(extension, GetSiteInstanceForURL(url).get(), url, mojom::ViewType::kExtensionBackgroundPage); + host->SetCloseHandler( + base::BindOnce(&ProcessManager::HandleCloseExtensionHost, + weak_ptr_factory_.GetWeakPtr())); host->CreateRendererSoon(); OnBackgroundHostCreated(host); return true; @@ -1017,11 +1020,12 @@ std::make_unique<base::ElapsedTimer>(); } -void ProcessManager::OnExtensionHostShouldClose(ExtensionHost* host) { +void ProcessManager::HandleCloseExtensionHost(ExtensionHost* host) { TRACE_EVENT0("browser,startup", "ProcessManager::OnExtensionHostShouldClose"); - DCHECK(host->extension_host_type() == - mojom::ViewType::kExtensionBackgroundPage); + DCHECK_EQ(mojom::ViewType::kExtensionBackgroundPage, + host->extension_host_type()); CloseBackgroundHost(host); + // WARNING: `host` is deleted at this point! } void ProcessManager::UnregisterServiceWorker(const WorkerId& worker_id) {
diff --git a/extensions/browser/process_manager.h b/extensions/browser/process_manager.h index e54bc65..355a7b1 100644 --- a/extensions/browser/process_manager.h +++ b/extensions/browser/process_manager.h
@@ -283,7 +283,6 @@ // ExtensionHostObserver: void OnExtensionHostDestroyed(ExtensionHost* host) override; - void OnExtensionHostShouldClose(ExtensionHost* host) override; // Extra information we keep for each extension's background page. struct BackgroundPageData; @@ -299,6 +298,10 @@ // Called just after |host| is created so it can be registered in our lists. void OnBackgroundHostCreated(ExtensionHost* host); + // Handles a request from a created extension host to close the contents. + // This happens in cases such as the contents calling `window.close()`. + void HandleCloseExtensionHost(ExtensionHost* host); + // Close the given |host| iff it's a background page. void CloseBackgroundHost(ExtensionHost* host);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index c181699d..64549dfd 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4268,7 +4268,10 @@ bool is_offscreen = !!offscreen_target_frame_buffer_.get(); caps.surface_origin = !is_offscreen ? surface_->GetOrigin() : gfx::SurfaceOrigin::kBottomLeft; - caps.msaa_is_slow = workarounds().msaa_is_slow; + caps.msaa_is_slow = + base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs) + ? workarounds().msaa_is_slow_2 + : workarounds().msaa_is_slow; caps.avoid_stencil_buffers = workarounds().avoid_stencil_buffers; caps.multisample_compatibility = feature_info_->feature_flags().ext_multisample_compatibility;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc index 0906a535..99f67b1 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -1683,7 +1683,10 @@ caps.surfaceless = !offscreen_ && surface_->IsSurfaceless(); caps.surface_origin = !offscreen_ ? surface_->GetOrigin() : gfx::SurfaceOrigin::kBottomLeft; - caps.msaa_is_slow = feature_info_->workarounds().msaa_is_slow; + caps.msaa_is_slow = + base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs) + ? feature_info_->workarounds().msaa_is_slow_2 + : feature_info_->workarounds().msaa_is_slow; caps.avoid_stencil_buffers = feature_info_->workarounds().avoid_stencil_buffers; caps.multisample_compatibility =
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 9c9de76f..aafa913 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -1327,7 +1327,10 @@ feature_info()->workarounds().max_3d_array_texture_size); } caps.sync_query = feature_info()->feature_flags().chromium_sync_query; - caps.msaa_is_slow = feature_info()->workarounds().msaa_is_slow; + caps.msaa_is_slow = + base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs) + ? feature_info()->workarounds().msaa_is_slow_2 + : feature_info()->workarounds().msaa_is_slow; caps.avoid_stencil_buffers = feature_info()->workarounds().avoid_stencil_buffers;
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc index 43987eee..1634157 100644 --- a/gpu/command_buffer/service/shared_image_factory.cc +++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -430,7 +430,7 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #endif // defined(USE_OZONE) -#if !BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_MAC) // TODO(hitawala): Temporary factory that will be replaced with Ozone and // other backings if (use_gl) {
diff --git a/gpu/command_buffer/service/skia_utils.cc b/gpu/command_buffer/service/skia_utils.cc index c2dc1828..2d2529c 100644 --- a/gpu/command_buffer/service/skia_utils.cc +++ b/gpu/command_buffer/service/skia_utils.cc
@@ -11,6 +11,7 @@ #include "components/viz/common/resources/resource_format_utils.h" #include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/shared_context_state.h" +#include "gpu/config/gpu_finch_features.h" #include "gpu/config/gpu_switches.h" #include "gpu/config/skia_limits.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" @@ -90,6 +91,9 @@ // in a more granular way. For OOPR-Canvas we want 8, but for other purposes, // a texture atlas with sample count of 4 would be sufficient options.fInternalMultisampleCount = 8; + options.fAllowMSAAOnNewIntel = + base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs); + if (type == GrContextType::kMetal) options.fRuntimeProgramCacheSize = 1024;
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index c51c171..f5f3360 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -4066,6 +4066,43 @@ "features": [ "disable_accelerated_vp9_decode" ] - } + }, + { + "id": 398, + "description": "On pre-Ice Lake Intel GPUs MSAA performance is not acceptable for GPU rasterization", + "cr_bugs": [527565, 1298585, 1341830], + "vendor_id": "0x8086", + "intel_gpu_generation": { + "op": "<", + "value": "11" + }, + "multi_gpu_category": "active", + "exceptions": [ + { + "os": { + "type": "fuchsia" + } + } + ], + "features": [ + "msaa_is_slow_2" + ] + }, + { + "id": 399, + "description": "On pre-Ice Lake Intel GPUs MSAA performance is not acceptable for GPU rasterization. Duplicate of 398 for Android", + "cr_bugs": [759471], + "os": { + "type": "android" + }, + "gl_vendor": "Intel.*", + "intel_gpu_generation": { + "op": "<", + "value": "11" + }, + "features": [ + "msaa_is_slow_2" + ] + } ] }
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc index 2a9267a..a026e84 100644 --- a/gpu/config/gpu_finch_features.cc +++ b/gpu/config/gpu_finch_features.cc
@@ -146,6 +146,10 @@ const base::Feature kCanvasOopRasterization{"CanvasOopRasterization", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables the use of MSAA in skia on Ice Lake and later intel architectures. +const base::Feature kEnableMSAAOnNewIntelGPUs{ + "EnableMSAAOnNewIntelGPUs", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables the use of ANGLE validation for non-WebGL contexts. const base::Feature kDefaultEnableANGLEValidation{ "DefaultEnableANGLEValidation", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/gpu/config/gpu_finch_features.h b/gpu/config/gpu_finch_features.h index 69f5f96..7bf6498f 100644 --- a/gpu/config/gpu_finch_features.h +++ b/gpu/config/gpu_finch_features.h
@@ -32,6 +32,8 @@ GPU_EXPORT extern const base::Feature kCanvasOopRasterization; +GPU_EXPORT extern const base::Feature kEnableMSAAOnNewIntelGPUs; + GPU_EXPORT extern const base::Feature kDefaultEnableANGLEValidation; GPU_EXPORT extern const base::Feature kCanvasContextLostInBackground;
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt index c11de6c..82c0e2a 100644 --- a/gpu/config/gpu_workaround_list.txt +++ b/gpu/config/gpu_workaround_list.txt
@@ -101,6 +101,7 @@ max_msaa_sample_count_4 max_texture_size_limit_4096 msaa_is_slow +msaa_is_slow_2 multisample_renderbuffer_resize_emulation needs_offscreen_buffer_workaround no_downscaled_overlay_promotion
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 539f65a2..df4ea3c 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -2133,10 +2133,10 @@ dimensions: "builderless:1" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" + dimensions: "ssd:1" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" cipd_version: "latest" @@ -3994,7 +3994,7 @@ dimensions: "builderless:1" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Windows-10" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:0" @@ -4074,7 +4074,7 @@ dimensions: "builderless:1" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Windows-10" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:0" @@ -4154,7 +4154,7 @@ dimensions: "builderless:1" dimensions: "cores:32" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Windows-10" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:0" @@ -7026,10 +7026,10 @@ dimensions: "builderless:1" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" + dimensions: "ssd:1" exe { cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/main" @@ -19226,7 +19226,7 @@ dimensions: "free_space:high" dimensions: "os:Windows" dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:1" + dimensions: "ssd:0" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" cipd_version: "latest" @@ -19553,7 +19553,7 @@ dimensions: "builderless:1" dimensions: "cores:32" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Windows" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:0" @@ -19636,7 +19636,7 @@ dimensions: "builderless:1" dimensions: "cores:32" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Windows" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:0" @@ -43559,7 +43559,7 @@ dimensions: "builderless:1" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "free_space:standard" + dimensions: "free_space:high" dimensions: "os:Windows-10" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:0"
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index d20670c6..df3551f 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -5,7 +5,7 @@ load("//lib/args.star", "args") load("//lib/builder_config.star", "builder_config") -load("//lib/builders.star", "goma", "os", "sheriff_rotations") +load("//lib/builders.star", "builders", "goma", "os", "sheriff_rotations") load("//lib/branches.star", "branches") load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs") load("//lib/consoles.star", "consoles") @@ -392,6 +392,8 @@ ), cq_mirrors_console_view = "mirrors", execution_timeout = 6 * time.hour, + free_space = builders.free_space.high, + ssd = True, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.clang.star b/infra/config/subprojects/chromium/ci/chromium.clang.star index d510e46..785b93f 100644 --- a/infra/config/subprojects/chromium/ci/chromium.clang.star +++ b/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -302,7 +302,6 @@ ), os = os.WINDOWS_ANY, free_space = builders.free_space.high, - ssd = True, ) ci.builder( @@ -340,6 +339,7 @@ short_name = "dbg", ), os = os.WINDOWS_ANY, + free_space = builders.free_space.high, ) ci.builder( @@ -349,6 +349,7 @@ short_name = "dll", ), os = os.WINDOWS_ANY, + free_space = builders.free_space.high, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 3ede471..fadfd362 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -5,7 +5,7 @@ load("//lib/branches.star", "branches") load("//lib/builder_config.star", "builder_config") -load("//lib/builders.star", "cpu", "goma", "os", "xcode") +load("//lib/builders.star", "builders", "cpu", "goma", "os", "xcode") load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs") load("//lib/consoles.star", "consoles") load("//lib/structs.star", "structs") @@ -880,6 +880,7 @@ reclient_instance = rbe_instance.DEFAULT, reclient_jobs = 80, os = os.WINDOWS_DEFAULT, + free_space = builders.free_space.high, ) ci.builder( @@ -897,6 +898,7 @@ reclient_instance = rbe_instance.DEFAULT, reclient_jobs = 250, os = os.WINDOWS_DEFAULT, + free_space = builders.free_space.high, ) ci.builder( @@ -994,6 +996,7 @@ reclient_instance = rbe_instance.TEST_CQ, reclient_jobs = 80, os = os.WINDOWS_DEFAULT, + free_space = builders.free_space.high, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.linux.star b/infra/config/subprojects/chromium/ci/chromium.linux.star index d1a411d85..5ade1b1 100644 --- a/infra/config/subprojects/chromium/ci/chromium.linux.star +++ b/infra/config/subprojects/chromium/ci/chromium.linux.star
@@ -5,7 +5,7 @@ load("//lib/args.star", "args") load("//lib/builder_config.star", "builder_config") -load("//lib/builders.star", "os", "sheriff_rotations") +load("//lib/builders.star", "builders", "os", "sheriff_rotations") load("//lib/branches.star", "branches") load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs") load("//lib/consoles.star", "consoles") @@ -164,6 +164,8 @@ tree_closing = False, notifies = ["Deterministic Linux", "close-on-any-step-failure"], reclient_jobs = rbe_jobs.DEFAULT, + free_space = builders.free_space.high, + ssd = True, ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.updater.star b/infra/config/subprojects/chromium/ci/chromium.updater.star index 02b1282..f29f3e0 100644 --- a/infra/config/subprojects/chromium/ci/chromium.updater.star +++ b/infra/config/subprojects/chromium/ci/chromium.updater.star
@@ -5,7 +5,7 @@ load("//lib/branches.star", "branches") load("//lib/builder_config.star", "builder_config") -load("//lib/builders.star", "cpu", "goma", "os") +load("//lib/builders.star", "builders", "cpu", "goma", "os") load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs") load("//lib/consoles.star", "consoles") @@ -419,6 +419,7 @@ goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, + free_space = builders.free_space.high, ) ci.builder(
diff --git a/ios/chrome/browser/tabs_search/tabs_search_service.h b/ios/chrome/browser/tabs_search/tabs_search_service.h index c533f35a1..6fcc106 100644 --- a/ios/chrome/browser/tabs_search/tabs_search_service.h +++ b/ios/chrome/browser/tabs_search/tabs_search_service.h
@@ -120,8 +120,7 @@ // A callback to return history search results once the current in progress // history search completes. Will be null if no search is in progress. base::OnceCallback<void(size_t result_count)> history_search_callback_; - // A history service instance for the current in progress history search. - // This service be null when no history search is in progress. + // A history service instance for the associated |browser_state_|. std::unique_ptr<history::BrowsingHistoryService> history_service_; // Provides dependencies and funnels callbacks from BrowsingHistoryService. std::unique_ptr<IOSBrowsingHistoryDriver> history_driver_;
diff --git a/ios/chrome/browser/tabs_search/tabs_search_service.mm b/ios/chrome/browser/tabs_search/tabs_search_service.mm index 7ce6a2c..87a3d004 100644 --- a/ios/chrome/browser/tabs_search/tabs_search_service.mm +++ b/ios/chrome/browser/tabs_search/tabs_search_service.mm
@@ -157,18 +157,20 @@ DCHECK(!browser_state_->IsOffTheRecord()); DCHECK(completion); + if (!history_service_.get()) { + history_driver_ = + std::make_unique<IOSBrowsingHistoryDriver>(browser_state_, this); + + history_service_ = std::make_unique<history::BrowsingHistoryService>( + history_driver_.get(), + ios::HistoryServiceFactory::GetForBrowserState( + browser_state_, ServiceAccessType::EXPLICIT_ACCESS), + SyncServiceFactory::GetForBrowserState(browser_state_)); + } + ongoing_history_search_term_ = term; history_search_callback_ = std::move(completion); - history_driver_ = - std::make_unique<IOSBrowsingHistoryDriver>(browser_state_, this); - - history_service_ = std::make_unique<history::BrowsingHistoryService>( - history_driver_.get(), - ios::HistoryServiceFactory::GetForBrowserState( - browser_state_, ServiceAccessType::EXPLICIT_ACCESS), - SyncServiceFactory::GetForBrowserState(browser_state_)); - history::QueryOptions options; options.duplicate_policy = history::QueryOptions::REMOVE_ALL_DUPLICATES; options.matching_algorithm = @@ -229,5 +231,4 @@ std::move(history_search_callback_).Run(results.size()); ongoing_history_search_term_ = std::u16string(); - history_service_.reset(); }
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn index e939697a..23cf143 100644 --- a/ios/chrome/browser/ui/browser_view/BUILD.gn +++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -250,6 +250,7 @@ "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/download", "//ios/chrome/browser/favicon", + "//ios/chrome/browser/find_in_page", "//ios/chrome/browser/history", "//ios/chrome/browser/main:test_support", "//ios/chrome/browser/prerender", @@ -274,6 +275,7 @@ "//ios/chrome/browser/ui/fullscreen:internal", "//ios/chrome/browser/ui/fullscreen/test", "//ios/chrome/browser/ui/incognito_reauth:incognito_reauth_scene_agent", + "//ios/chrome/browser/ui/keyboard", "//ios/chrome/browser/ui/main:scene_state_header", "//ios/chrome/browser/ui/popup_menu", "//ios/chrome/browser/ui/sharing", @@ -295,6 +297,7 @@ "//ios/chrome/test:block_cleanup_test", "//ios/chrome/test:test_support", "//ios/net", + "//ios/web/find_in_page", "//ios/web/public", "//ios/web/public/test", "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/ui/browser_view/DEPS b/ios/chrome/browser/ui/browser_view/DEPS new file mode 100644 index 0000000..f92d39e --- /dev/null +++ b/ios/chrome/browser/ui/browser_view/DEPS
@@ -0,0 +1,9 @@ +include_rules = [ + "+ios/chrome/browser/ui/browser_view", +] + +specific_include_rules = { + "key_commands_provider_unittest\.mm": [ + "+ios/web/find_in_page/find_in_page_manager_impl.h", + ], +}
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index 9b6ca2c0..045650c 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -339,6 +339,7 @@ std::unique_ptr<base::ScopedObservation<WebStateList, WebStateListObserver>> _scopedWebStateListObservation; BrowserViewControllerDependencies _viewControllerDependencies; + KeyCommandsProvider* _keyCommandsProvider; PrerenderService* _prerenderService; BubblePresenter* _bubblePresenter; NewTabPageCoordinator* _ntpCoordinator; @@ -511,7 +512,6 @@ BrowserViewControllerHelper* browserViewControllerHelper = [[BrowserViewControllerHelper alloc] init]; - KeyCommandsProvider* keyCommandsProvider = [[KeyCommandsProvider alloc] init]; _viewController = [[BrowserViewController alloc] initWithBrowser:self.browser @@ -519,7 +519,7 @@ .viewController browserViewControllerHelper:browserViewControllerHelper dispatcher:self.dispatcher - keyCommandsProvider:keyCommandsProvider + keyCommandsProvider:_keyCommandsProvider dependencies:_viewControllerDependencies]; WebNavigationBrowserAgent::FromBrowser(self.browser) @@ -567,6 +567,15 @@ ChromeBrowserState* browserState = self.browser->GetBrowserState(); + _keyCommandsProvider = + [[KeyCommandsProvider alloc] initWithBrowser:self.browser]; + _keyCommandsProvider.dispatcher = + static_cast<id<ApplicationCommands, BrowserCommands, + BrowserCoordinatorCommands, FindInPageCommands>>( + _dispatcher); + _keyCommandsProvider.omniboxHandler = + static_cast<id<OmniboxCommands>>(_dispatcher); + _prerenderService = PrerenderServiceFactory::GetForBrowserState(browserState); if (!browserState->IsOffTheRecord()) { DCHECK(_prerenderService); @@ -684,6 +693,8 @@ } - (void)updateViewControllerDependencies { + _keyCommandsProvider.baseViewController = self.viewController; + _bookmarkInteractionController.parentController = self.viewController; _bubblePresenter.delegate = self.viewController; @@ -755,6 +766,7 @@ [_ntpCoordinator stop]; _ntpCoordinator = nil; + _keyCommandsProvider = nil; _dispatcher = nil; }
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.h b/ios/chrome/browser/ui/browser_view/browser_view_controller.h index d8b8ab12..897888d 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.h +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
@@ -10,6 +10,7 @@ #import "base/ios/block_types.h" #import "ios/chrome/browser/ui/authentication/signin_presenter.h" +#import "ios/chrome/browser/ui/browser_view/key_commands_provider.h" #import "ios/chrome/browser/ui/commands/browser_commands.h" #import "ios/chrome/browser/ui/commands/new_tab_page_commands.h" #import "ios/chrome/browser/ui/find_bar/find_bar_coordinator.h"
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index cdacb4c..f483ffa 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -17,7 +17,6 @@ #import "components/feature_engagement/public/event_constants.h" #import "components/feature_engagement/public/tracker.h" #import "components/reading_list/core/reading_list_model.h" -#import "components/sessions/core/tab_restore_service_helper.h" #import "components/strings/grit/components_strings.h" #import "components/ukm/ios/ukm_url_recorder.h" #import "ios/chrome/app/application_delegate/app_state.h" @@ -27,7 +26,6 @@ #import "ios/chrome/browser/crash_report/crash_keys_helper.h" #import "ios/chrome/browser/discover_feed/feed_constants.h" #import "ios/chrome/browser/feature_engagement/tracker_util.h" -#import "ios/chrome/browser/find_in_page/find_tab_helper.h" #import "ios/chrome/browser/infobars/infobar_manager_impl.h" #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/metrics/new_tab_page_uma.h" @@ -41,7 +39,6 @@ #import "ios/chrome/browser/prerender/prerender_service_factory.h" #import "ios/chrome/browser/reading_list/offline_page_tab_helper.h" #import "ios/chrome/browser/reading_list/reading_list_model_factory.h" -#import "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" #import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" #import "ios/chrome/browser/signin/authentication_service.h" #import "ios/chrome/browser/signin/authentication_service_factory.h" @@ -51,7 +48,6 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.h" #import "ios/chrome/browser/ui/browser_container/browser_container_view_controller.h" #import "ios/chrome/browser/ui/browser_view/browser_view_controller_helper.h" -#import "ios/chrome/browser/ui/browser_view/key_commands_provider.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter_delegate.h" #import "ios/chrome/browser/ui/commands/browser_commands.h" @@ -122,7 +118,6 @@ #import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_observer_bridge.h" #import "ios/chrome/browser/url_loading/url_loading_params.h" -#import "ios/chrome/browser/url_loading/url_loading_util.h" #import "ios/chrome/browser/voice/voice_search_navigations_tab_helper.h" #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" #import "ios/chrome/browser/web/sad_tab_tab_helper.h" @@ -241,7 +236,6 @@ @interface BrowserViewController () <CRWWebStateObserver, FindBarPresentationDelegate, FullscreenUIElement, - KeyCommandsPlumbing, MainContentUI, SideSwipeControllerDelegate, TabStripPresentation, @@ -790,7 +784,7 @@ focusOmnibox:(BOOL)focusOmnibox inheritOpener:(BOOL)inheritOpener { NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate]; - BOOL offTheRecord = self.isOffTheRecord; + BOOL offTheRecord = _isOffTheRecord; ProceduralBlock oldForegroundTabWasAddedCompletionBlock = self.foregroundTabWasAddedCompletionBlock; id<OmniboxCommands> omniboxCommandHandler = self.omniboxHandler; @@ -831,7 +825,7 @@ UrlLoadParams params = UrlLoadParams::InNewTab(GURL(kChromeUINewTabURL)); params.web_params.transition_type = ui::PAGE_TRANSITION_TYPED; - params.in_incognito = self.isOffTheRecord; + params.in_incognito = _isOffTheRecord; params.inherit_opener = inheritOpener; UrlLoadingBrowserAgent::FromBrowser(self.browser)->Load(params); } @@ -981,7 +975,7 @@ BackgroundTabAnimationView* animatedView = [[BackgroundTabAnimationView alloc] initWithFrame:CGRectMake(0, 0, kAnimatedViewSize, kAnimatedViewSize) - incognito:self.isOffTheRecord]; + incognito:_isOffTheRecord]; __weak UIView* weakAnimatedView = animatedView; auto completionBlock = ^() { self.inNewTabAnimation = NO; @@ -1051,27 +1045,18 @@ return YES; } -- (NSArray*)keyCommands { +- (NSArray<UIKeyCommand*>*)keyCommands { if (![self shouldRegisterKeyboardCommands]) { return nil; } UIResponder* firstResponder = GetFirstResponder(); - // TODO(crbug.com/1329100): Inject the key commands provider. - WebNavigationBrowserAgent* navigationAgent = - WebNavigationBrowserAgent::FromBrowser(self.browser); - return [_keyCommandsProvider - keyCommandsForConsumer:self - baseViewController:self - dispatcher:self.dispatcher - navigationAgent:navigationAgent - omniboxHandler:self.omniboxHandler - editingText:[firstResponder - isKindOfClass:[UITextField class]] || - [firstResponder - isKindOfClass:[UITextView class]] || - [[KeyboardObserverHelper sharedKeyboardObserver] - isKeyboardOnScreen]]; + BOOL isEditingText = + [firstResponder isKindOfClass:[UITextField class]] || + [firstResponder isKindOfClass:[UITextView class]] || + [[KeyboardObserverHelper sharedKeyboardObserver] isKeyboardOnScreen]; + + return [_keyCommandsProvider keyCommandsWithEditingText:isEditingText]; } #pragma mark - UIResponder helpers @@ -2181,7 +2166,7 @@ // Add toolbar margin to the frame for every scenario except compact-width // non-otr, as that is the only case where there isn't a primary toolbar. // (see crbug.com/1063173) - if (!IsSplitToolbarMode(self) || self.isOffTheRecord) { + if (!IsSplitToolbarMode(self) || _isOffTheRecord) { viewportInsets.top = [self expandedTopToolbarHeight]; } return UIEdgeInsetsInsetRect(self.contentArea.bounds, viewportInsets); @@ -2742,7 +2727,7 @@ // If the NTP is active, then it's used as the base view for snapshotting. // When the tab strip is visible, or for the incognito NTP, the NTP is laid // out between the toolbars, so it should not be inset while snapshotting. - if ([self canShowTabStrip] || self.isOffTheRecord) { + if ([self canShowTabStrip] || _isOffTheRecord) { return UIEdgeInsetsZero; } @@ -2931,8 +2916,7 @@ if (isUserInitiated) { // Send either the "New Tab Opened" or "New Incognito Tab" opened to the // feature_engagement::Tracker based on `inIncognito`. - feature_engagement::NotifyNewTabEvent(self.browserState, - self.isOffTheRecord); + feature_engagement::NotifyNewTabEvent(self.browserState, _isOffTheRecord); } } @@ -3044,7 +3028,7 @@ base::RecordAction(base::UserMetricsAction("MobilePullGestureNewTab")); [self.dispatcher openURLInNewTab:[OpenNewTabCommand - commandWithIncognito:self.isOffTheRecord]]; + commandWithIncognito:_isOffTheRecord]]; break; case OverscrollAction::CLOSE_TAB: base::RecordAction(base::UserMetricsAction("MobilePullGestureCloseTab")); @@ -3332,102 +3316,6 @@ CGRectGetMaxX(view.bounds) - CGRectGetMaxX(viewportFrame)); } -#pragma mark - KeyCommandsPlumbing - -// TODO(crbug.com/1329100): Add isOffTheRecord as a property of the key commands -// provider. -- (BOOL)isOffTheRecord { - return _isOffTheRecord; -} - -// TODO(crbug.com/1329100): Add isFindInPageAvailable as a property of the key -// commands provider. -- (BOOL)isFindInPageAvailable { - if (!self.currentWebState) { - return NO; - } - - FindTabHelper* helper = FindTabHelper::FromWebState(self.currentWebState); - return (helper && helper->CurrentPageSupportsFindInPage()); -} - -// TODO(crbug.com/1329100): Add tabsCount as a property of the key commands -// provider. -- (NSUInteger)tabsCount { - if (_isShutdown) - return 0; - return self.browser->GetWebStateList()->count(); -} - -// TODO(crbug.com/1329100): FocusTabAtIndex can be executed by the key command -// provider directly. -- (void)focusTabAtIndex:(NSUInteger)index { - WebStateList* webStateList = self.browser->GetWebStateList(); - if (webStateList->ContainsIndex(index)) { - webStateList->ActivateWebStateAt(static_cast<int>(index)); - } -} - -// TODO(crbug.com/1329100): focusNextTab can be executed by the key command -// provider directly. -- (void)focusNextTab { - WebStateList* webStateList = self.browser->GetWebStateList(); - if (!webStateList) - return; - - int activeIndex = webStateList->active_index(); - if (activeIndex == WebStateList::kInvalidIndex) - return; - - // If the active index isn't the last index, activate the next index. - // (the last index is always `count() - 1`). - // Otherwise activate the first index. - if (activeIndex < (webStateList->count() - 1)) { - webStateList->ActivateWebStateAt(activeIndex + 1); - } else { - webStateList->ActivateWebStateAt(0); - } -} - -// TODO(crbug.com/1329100): focusPreviousTab can be executed by the key command -// provider directly. -- (void)focusPreviousTab { - WebStateList* webStateList = self.browser->GetWebStateList(); - if (!webStateList) - return; - - int activeIndex = webStateList->active_index(); - if (activeIndex == WebStateList::kInvalidIndex) - return; - - // If the active index isn't the first index, activate the prior index. - // Otherwise index the last index (`count() - 1`). - if (activeIndex > 0) { - webStateList->ActivateWebStateAt(activeIndex - 1); - } else { - webStateList->ActivateWebStateAt(webStateList->count() - 1); - } -} - -// TODO(crbug.com/1329100): reopenClosedTab can be executed by the key command -// provider directly. -- (void)reopenClosedTab { - sessions::TabRestoreService* const tabRestoreService = - IOSChromeTabRestoreServiceFactory::GetForBrowserState(self.browserState); - if (!tabRestoreService || tabRestoreService->entries().empty()) - return; - - const std::unique_ptr<sessions::TabRestoreService::Entry>& entry = - tabRestoreService->entries().front(); - // Only handle the TAB type. - // TODO(crbug.com/1056596) : Support WINDOW restoration under multi-window. - if (entry->type != sessions::TabRestoreService::TAB) - return; - - [self.dispatcher openURLInNewTab:[OpenNewTabCommand command]]; - RestoreTab(entry->id, WindowOpenDisposition::CURRENT_TAB, self.browser); -} - #pragma mark - MainContentUI - (MainContentUIState*)mainContentUIState {
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm index f6a9359..447f66a 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
@@ -194,7 +194,8 @@ container_ = [[BrowserContainerViewController alloc] init]; bvc_helper_ = [[BrowserViewControllerHelper alloc] init]; - key_commands_provider_ = [[KeyCommandsProvider alloc] init]; + key_commands_provider_ = + [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()]; fake_prerender_service_ = std::make_unique<FakePrerenderService>(); @@ -315,32 +316,6 @@ dismissOmnibox:YES]; } -// Verifies the the next/previous tab commands from the keyboard work OK. -TEST_F(BrowserViewControllerTest, TestFocusNextPrevious) { - // Add more web states. - WebStateList* web_state_list = browser_->GetWebStateList(); - // This test assumes there are exactly three web states in the list. - ASSERT_EQ(web_state_list->count(), 3); - - ASSERT_TRUE([bvc_ conformsToProtocol:@protocol(KeyCommandsPlumbing)]); - - id<KeyCommandsPlumbing> keyHandler = - static_cast<id<KeyCommandsPlumbing>>(bvc_); - - [keyHandler focusNextTab]; - EXPECT_EQ(web_state_list->active_index(), 1); - [keyHandler focusNextTab]; - EXPECT_EQ(web_state_list->active_index(), 2); - [keyHandler focusNextTab]; - EXPECT_EQ(web_state_list->active_index(), 0); - [keyHandler focusPreviousTab]; - EXPECT_EQ(web_state_list->active_index(), 2); - [keyHandler focusPreviousTab]; - EXPECT_EQ(web_state_list->active_index(), 1); - [keyHandler focusPreviousTab]; - EXPECT_EQ(web_state_list->active_index(), 0); -} - // Tests that WebState::WasShown() and WebState::WasHidden() is properly called // for WebState activations in the BrowserViewController's WebStateList. TEST_F(BrowserViewControllerTest, UpdateWebStateVisibility) {
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider.h b/ios/chrome/browser/ui/browser_view/key_commands_provider.h index 4084258..c7972ea 100644 --- a/ios/chrome/browser/ui/browser_view/key_commands_provider.h +++ b/ios/chrome/browser/ui/browser_view/key_commands_provider.h
@@ -13,56 +13,30 @@ #import "ios/chrome/browser/ui/commands/find_in_page_commands.h" #import "ios/chrome/browser/ui/commands/omnibox_commands.h" -class WebNavigationBrowserAgent; - -@protocol KeyCommandsPlumbing <NSObject> - -#pragma mark Query information - -// Whether the current profile is off-the-record. -- (BOOL)isOffTheRecord; - -// Whether the Find in Page is available on current page. For example it's not -// supported on NTP and other native content pages. -- (BOOL)isFindInPageAvailable; - -// Returns the current number of tabs. -- (NSUInteger)tabsCount; - -#pragma mark Call for action - -// Called to put the tab at index in focus. -- (void)focusTabAtIndex:(NSUInteger)index; - -// Called to focus the next tab. -- (void)focusNextTab; - -// Called to focus the previous tab. -- (void)focusPreviousTab; - -// Called to reopen the last closed tab. -- (void)reopenClosedTab; - -@end +class Browser; // Handles the keyboard commands registration and handling for the // BrowserViewController. @interface KeyCommandsProvider : NSObject -- (NSArray*)keyCommandsForConsumer:(id<KeyCommandsPlumbing>)consumer - baseViewController:(UIViewController*)baseViewController - dispatcher:(id<ApplicationCommands, - BrowserCommands, - BrowserCoordinatorCommands, - FindInPageCommands>)dispatcher - navigationAgent:(WebNavigationBrowserAgent*)navigationAgent - omniboxHandler:(id<OmniboxCommands>)omniboxHandler - editingText:(BOOL)editingText; +@property(nonatomic, weak) UIViewController* baseViewController; +@property(nonatomic, weak) id<ApplicationCommands, + BrowserCommands, + BrowserCoordinatorCommands, + FindInPageCommands> + dispatcher; +@property(nonatomic, weak) id<OmniboxCommands> omniboxHandler; // Set this flag to YES when the key shortcut bound to Escape key that dismisses // modals should be enabled. @property(nonatomic, assign) BOOL canDismissModals; +- (instancetype)initWithBrowser:(Browser*)browser NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +- (NSArray*)keyCommandsWithEditingText:(BOOL)editingText; + @end #endif // IOS_CHROME_BROWSER_UI_BROWSER_VIEW_KEY_COMMANDS_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider.mm b/ios/chrome/browser/ui/browser_view/key_commands_provider.mm index b51cfe7..a5c20965 100644 --- a/ios/chrome/browser/ui/browser_view/key_commands_provider.mm +++ b/ios/chrome/browser/ui/browser_view/key_commands_provider.mm
@@ -4,46 +4,56 @@ #import "ios/chrome/browser/ui/browser_view/key_commands_provider.h" -#include "components/strings/grit/components_strings.h" +#import "components/sessions/core/tab_restore_service_helper.h" +#import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/find_in_page/find_tab_helper.h" +#import "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" #import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h" #import "ios/chrome/browser/ui/util/keyboard_observer_helper.h" #import "ios/chrome/browser/ui/util/named_guide.h" -#include "ios/chrome/browser/ui/util/rtl_geometry.h" +#import "ios/chrome/browser/ui/util/rtl_geometry.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/browser/url_loading/url_loading_util.h" #import "ios/chrome/browser/web/web_navigation_browser_agent.h" -#include "ios/chrome/grit/ios_strings.h" -#include "ui/base/l10n/l10n_util_mac.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ios/web/public/web_state.h" +#import "ui/base/l10n/l10n_util_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +@interface KeyCommandsProvider () + +@property(nonatomic, assign) Browser* browser; +@property(nonatomic, assign, readonly) + WebNavigationBrowserAgent* navigationAgent; + +@end + @implementation KeyCommandsProvider -- (NSArray*)keyCommandsForConsumer:(id<KeyCommandsPlumbing>)consumer - baseViewController:(UIViewController*)baseViewController - dispatcher:(id<ApplicationCommands, - BrowserCommands, - BrowserCoordinatorCommands, - FindInPageCommands, - OmniboxCommands>)dispatcher - navigationAgent:(WebNavigationBrowserAgent*)navigationAgent - omniboxHandler:(id<OmniboxCommands>)omniboxHandler - editingText:(BOOL)editingText { - __weak id<KeyCommandsPlumbing> weakConsumer = consumer; - __weak UIViewController* weakBaseViewController = baseViewController; - __weak id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands, - FindInPageCommands> - weakDispatcher = dispatcher; - __weak id<OmniboxCommands> weakOmniboxHandler = omniboxHandler; +- (instancetype)initWithBrowser:(Browser*)browser { + DCHECK(browser); + self = [super init]; + if (self) { + _browser = browser; + } + return self; +} + +- (NSArray<UIKeyCommand*>*)keyCommandsWithEditingText:(BOOL)editingText { + __weak __typeof(self) weakSelf = self; // Block to have the tab model open the tab at `index`, if there is one. void (^focusTab)(NSUInteger) = ^(NSUInteger index) { - [weakConsumer focusTabAtIndex:index]; + [weakSelf focusTabAtIndex:index]; }; - const BOOL hasTabs = [consumer tabsCount] > 0; + const BOOL hasTabs = [self tabsCount] > 0; const BOOL useRTLLayout = UseRTLLayout(); @@ -52,21 +62,25 @@ void (^browseRight)(); if (useRTLLayout) { browseLeft = ^{ - if (navigationAgent->CanGoForward()) - navigationAgent->GoForward(); + __typeof(self) strongSelf = weakSelf; + if (strongSelf.navigationAgent->CanGoForward()) + strongSelf.navigationAgent->GoForward(); }; browseRight = ^{ - if (navigationAgent->CanGoBack()) - navigationAgent->GoBack(); + __typeof(self) strongSelf = weakSelf; + if (strongSelf.navigationAgent->CanGoBack()) + strongSelf.navigationAgent->GoBack(); }; } else { browseLeft = ^{ - if (navigationAgent->CanGoBack()) - navigationAgent->GoBack(); + __typeof(self) strongSelf = weakSelf; + if (strongSelf.navigationAgent->CanGoBack()) + strongSelf.navigationAgent->GoBack(); }; browseRight = ^{ - if (navigationAgent->CanGoForward()) - navigationAgent->GoForward(); + __typeof(self) strongSelf = weakSelf; + if (strongSelf.navigationAgent->CanGoForward()) + strongSelf.navigationAgent->GoForward(); }; } @@ -75,17 +89,17 @@ void (^focusTabRight)(); if (useRTLLayout) { focusTabLeft = ^{ - [weakConsumer focusNextTab]; + [weakSelf focusNextTab]; }; focusTabRight = ^{ - [weakConsumer focusPreviousTab]; + [weakSelf focusPreviousTab]; }; } else { focusTabLeft = ^{ - [weakConsumer focusPreviousTab]; + [weakSelf focusPreviousTab]; }; focusTabRight = ^{ - [weakConsumer focusNextTab]; + [weakSelf focusNextTab]; }; } @@ -93,14 +107,14 @@ void (^newTab)() = ^{ OpenNewTabCommand* newTabCommand = [OpenNewTabCommand command]; newTabCommand.shouldFocusOmnibox = YES; - [weakDispatcher openURLInNewTab:newTabCommand]; + [weakSelf.dispatcher openURLInNewTab:newTabCommand]; }; void (^newIncognitoTab)() = ^{ OpenNewTabCommand* newIncognitoTabCommand = [OpenNewTabCommand incognitoTabCommand]; newIncognitoTabCommand.shouldFocusOmnibox = YES; - [weakDispatcher openURLInNewTab:newIncognitoTabCommand]; + [weakSelf.dispatcher openURLInNewTab:newIncognitoTabCommand]; }; const int browseLeftDescriptionID = useRTLLayout @@ -111,7 +125,8 @@ : IDS_IOS_KEYBOARD_HISTORY_FORWARD; // Initialize the array of commands with an estimated capacity. - NSMutableArray* keyCommands = [NSMutableArray arrayWithCapacity:32]; + NSMutableArray<UIKeyCommand*>* keyCommands = + [NSMutableArray arrayWithCapacity:32]; // List the commands that always appear in the HUD. They appear in the HUD // since they have titles. @@ -133,14 +148,14 @@ title:l10n_util::GetNSStringWithFixup( IDS_IOS_KEYBOARD_REOPEN_CLOSED_TAB) action:^{ - [weakConsumer reopenClosedTab]; + [weakSelf reopenClosedTab]; }], ]]; // List the commands that only appear when there is at least a tab. When they // appear, they are in the HUD since they have titles. if (hasTabs) { - if ([consumer isFindInPageAvailable]) { + if ([self isFindInPageAvailable]) { [keyCommands addObjectsFromArray:@[ [UIKeyCommand @@ -149,20 +164,21 @@ title:l10n_util::GetNSStringWithFixup( IDS_IOS_TOOLS_MENU_FIND_IN_PAGE) action:^{ - [weakDispatcher openFindInPage]; + [weakSelf.dispatcher openFindInPage]; }], - [UIKeyCommand cr_keyCommandWithInput:@"g" - modifierFlags:UIKeyModifierCommand - title:nil - action:^{ - [weakDispatcher findNextStringInPage]; - }], + [UIKeyCommand + cr_keyCommandWithInput:@"g" + modifierFlags:UIKeyModifierCommand + title:nil + action:^{ + [weakSelf.dispatcher findNextStringInPage]; + }], [UIKeyCommand cr_keyCommandWithInput:@"g" modifierFlags:UIKeyModifierCommand | UIKeyModifierShift title:nil action:^{ - [weakDispatcher findPreviousStringInPage]; + [weakSelf.dispatcher findPreviousStringInPage]; }] ]]; } @@ -173,7 +189,7 @@ title:l10n_util::GetNSStringWithFixup( IDS_IOS_KEYBOARD_OPEN_LOCATION) action:^{ - [weakOmniboxHandler focusOmnibox]; + [weakSelf.omniboxHandler focusOmnibox]; }], [UIKeyCommand cr_keyCommandWithInput:@"w" modifierFlags:UIKeyModifierCommand @@ -186,10 +202,10 @@ // registered with the dispatcher anymore. // Check if it's still available. See // crbug.com/967637 for context. - if ([weakDispatcher + if ([weakSelf.dispatcher respondsToSelector:@selector (closeCurrentTab)]) { - [weakDispatcher closeCurrentTab]; + [weakSelf.dispatcher closeCurrentTab]; } }], ]]; @@ -236,14 +252,14 @@ title:l10n_util::GetNSStringWithFixup( IDS_IOS_KEYBOARD_BOOKMARK_THIS_PAGE) action:^{ - [weakDispatcher bookmarkCurrentPage]; + [weakSelf.dispatcher bookmarkCurrentPage]; }], [UIKeyCommand cr_keyCommandWithInput:@"r" modifierFlags:UIKeyModifierCommand title:l10n_util::GetNSStringWithFixup( IDS_IOS_ACCNAME_RELOAD) action:^{ - navigationAgent->Reload(); + weakSelf.navigationAgent->Reload(); }], ]]; @@ -272,31 +288,31 @@ title:l10n_util::GetNSStringWithFixup( IDS_HISTORY_SHOW_HISTORY) action:^{ - [weakDispatcher showHistory]; + [weakSelf.dispatcher showHistory]; }], [UIKeyCommand cr_keyCommandWithInput:@"." modifierFlags:UIKeyModifierCommand | UIKeyModifierShift title:voiceSearchTitle action:^{ - UIView* baseView = baseViewController.view; + UIView* baseView = weakSelf.baseViewController.view; [[NamedGuide guideWithName:kVoiceSearchButtonGuide view:baseView] resetConstraints]; - [weakDispatcher startVoiceSearch]; + [weakSelf.dispatcher startVoiceSearch]; }], ]]; } if (self.canDismissModals) { [keyCommands - addObject:[UIKeyCommand - cr_keyCommandWithInput:UIKeyInputEscape - modifierFlags:Cr_UIKeyModifierNone - title:nil - action:^{ - [weakDispatcher dismissModalDialogs]; - }]]; + addObject:[UIKeyCommand cr_keyCommandWithInput:UIKeyInputEscape + modifierFlags:Cr_UIKeyModifierNone + title:nil + action:^{ + [weakSelf.dispatcher + dismissModalDialogs]; + }]]; } // List the commands that don't appear in the HUD but are always present. @@ -309,9 +325,9 @@ modifierFlags:UIKeyModifierCommand title:nil action:^{ - [weakDispatcher + [weakSelf.dispatcher showSettingsFromViewController: - weakBaseViewController]; + weakSelf.baseViewController]; }], ]]; @@ -331,20 +347,20 @@ modifierFlags:UIKeyModifierCommand title:nil action:^{ - navigationAgent->StopLoading(); + weakSelf.navigationAgent->StopLoading(); }], [UIKeyCommand cr_keyCommandWithInput:@"?" modifierFlags:UIKeyModifierCommand title:nil action:^{ - [weakDispatcher showHelpPage]; + [weakSelf.dispatcher showHelpPage]; }], [UIKeyCommand cr_keyCommandWithInput:@"l" modifierFlags:UIKeyModifierCommand | UIKeyModifierAlternate title:nil action:^{ - [weakDispatcher showDownloadsFolder]; + [weakSelf.dispatcher showDownloadsFolder]; }], [UIKeyCommand cr_keyCommandWithInput:@"1" modifierFlags:UIKeyModifierCommand @@ -398,25 +414,108 @@ modifierFlags:UIKeyModifierCommand title:nil action:^{ - focusTab([weakConsumer tabsCount] - 1); + focusTab([weakSelf tabsCount] - 1); }], [UIKeyCommand cr_keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierControl | UIKeyModifierShift title:nil action:^{ - [weakConsumer focusPreviousTab]; + [weakSelf focusPreviousTab]; }], [UIKeyCommand cr_keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierControl title:nil action:^{ - [weakConsumer focusNextTab]; + [weakSelf focusNextTab]; }], ]]; } - return keyCommands; + return [keyCommands copy]; +} + +#pragma mark - Private + +- (WebNavigationBrowserAgent*)navigationAgent { + return WebNavigationBrowserAgent::FromBrowser(self.browser); +} + +- (BOOL)isFindInPageAvailable { + web::WebState* currentWebState = + self.browser->GetWebStateList()->GetActiveWebState(); + if (!currentWebState) { + return NO; + } + + FindTabHelper* helper = FindTabHelper::FromWebState(currentWebState); + return (helper && helper->CurrentPageSupportsFindInPage()); +} + +- (NSUInteger)tabsCount { + return self.browser->GetWebStateList()->count(); +} + +- (void)focusTabAtIndex:(NSUInteger)index { + WebStateList* webStateList = self.browser->GetWebStateList(); + if (webStateList->ContainsIndex(index)) { + webStateList->ActivateWebStateAt(static_cast<int>(index)); + } +} + +- (void)focusNextTab { + WebStateList* webStateList = self.browser->GetWebStateList(); + if (!webStateList) + return; + + int activeIndex = webStateList->active_index(); + if (activeIndex == WebStateList::kInvalidIndex) + return; + + // If the active index isn't the last index, activate the next index. + // (the last index is always `count() - 1`). + // Otherwise activate the first index. + if (activeIndex < (webStateList->count() - 1)) { + webStateList->ActivateWebStateAt(activeIndex + 1); + } else { + webStateList->ActivateWebStateAt(0); + } +} + +- (void)focusPreviousTab { + WebStateList* webStateList = self.browser->GetWebStateList(); + if (!webStateList) + return; + + int activeIndex = webStateList->active_index(); + if (activeIndex == WebStateList::kInvalidIndex) + return; + + // If the active index isn't the first index, activate the prior index. + // Otherwise index the last index (`count() - 1`). + if (activeIndex > 0) { + webStateList->ActivateWebStateAt(activeIndex - 1); + } else { + webStateList->ActivateWebStateAt(webStateList->count() - 1); + } +} + +- (void)reopenClosedTab { + ChromeBrowserState* browserState = self.browser->GetBrowserState(); + sessions::TabRestoreService* const tabRestoreService = + IOSChromeTabRestoreServiceFactory::GetForBrowserState(browserState); + if (!tabRestoreService || tabRestoreService->entries().empty()) + return; + + const std::unique_ptr<sessions::TabRestoreService::Entry>& entry = + tabRestoreService->entries().front(); + // Only handle the TAB type. + // TODO(crbug.com/1056596) : Support WINDOW restoration under multi-window. + if (entry->type != sessions::TabRestoreService::TAB) + return; + + [self.dispatcher openURLInNewTab:[OpenNewTabCommand command]]; + RestoreTab(entry->id, WindowOpenDisposition::CURRENT_TAB, self.browser); } @end
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm b/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm index 6e99ca1..52d33590 100644 --- a/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm +++ b/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm
@@ -4,10 +4,19 @@ #import "ios/chrome/browser/ui/browser_view/key_commands_provider.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" -#include "third_party/ocmock/OCMock/OCMock.h" -#include "third_party/ocmock/gtest_support.h" +#import "base/test/task_environment.h" +#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" +#import "ios/chrome/browser/find_in_page/find_tab_helper.h" +#import "ios/chrome/browser/main/test_browser.h" +#import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" +#import "ios/chrome/browser/web_state_list/web_state_opener.h" +#import "ios/web/find_in_page/find_in_page_manager_impl.h" +#import "ios/web/public/test/fakes/fake_web_state.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#import "third_party/ocmock/gtest_support.h" #import "third_party/ocmock/ocmock_extensions.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -16,144 +25,190 @@ namespace { -typedef PlatformTest KeyCommandsProviderTest; +class KeyCommandsProviderTest : public PlatformTest { + protected: + KeyCommandsProviderTest() { + browser_state_ = TestChromeBrowserState::Builder().Build(); + browser_ = std::make_unique<TestBrowser>(browser_state_.get()); + web_state_list_ = browser_->GetWebStateList(); + } + ~KeyCommandsProviderTest() override {} -using KeyCommandsProviderTest = PlatformTest; + web::FakeWebState* InsertNewWebState(int index) { + auto web_state = std::make_unique<web::FakeWebState>(); + web_state->SetBrowserState(browser_state_.get()); + int insertedIndex = web_state_list_->InsertWebState( + index, std::move(web_state), WebStateList::INSERT_ACTIVATE, + WebStateOpener()); + return static_cast<web::FakeWebState*>( + web_state_list_->GetWebStateAt(insertedIndex)); + } + + base::test::TaskEnvironment task_environment_; + std::unique_ptr<TestChromeBrowserState> browser_state_; + std::unique_ptr<TestBrowser> browser_; + WebStateList* web_state_list_; +}; TEST_F(KeyCommandsProviderTest, NoTabs_EditingText_ReturnsObjects) { - KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init]; - id mockConsumer = - [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)]; id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands, FindInPageCommands> dispatcher = nil; - [[[mockConsumer expect] andReturnUnsignedInteger:0] tabsCount]; - EXPECT_NE(nil, [provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:YES]); + KeyCommandsProvider* provider = + [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()]; + provider.dispatcher = dispatcher; + + // No tabs. + EXPECT_EQ(web_state_list_->count(), 0); + + EXPECT_NE(nil, [provider keyCommandsWithEditingText:YES]); } TEST_F(KeyCommandsProviderTest, ReturnsKeyCommandsObjects) { - KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init]; - id mockConsumer = - [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)]; id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands, FindInPageCommands> dispatcher = nil; - [[[mockConsumer expect] andReturnUnsignedInteger:0] tabsCount]; + KeyCommandsProvider* provider = + [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()]; + provider.dispatcher = dispatcher; - for (id element in [provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:YES]) { + // No tabs. + EXPECT_EQ(web_state_list_->count(), 0); + + for (id element in [provider keyCommandsWithEditingText:YES]) { EXPECT_TRUE([element isKindOfClass:[UIKeyCommand class]]); } } TEST_F(KeyCommandsProviderTest, MoreKeyboardCommandsWhenTabs) { - KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init]; - id mockConsumer = - [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)]; id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands, FindInPageCommands> dispatcher = nil; + KeyCommandsProvider* provider = + [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()]; + provider.dispatcher = dispatcher; + // No tabs. - [[[mockConsumer expect] andReturnUnsignedInteger:0] tabsCount]; + EXPECT_EQ(web_state_list_->count(), 0); + NSUInteger numberOfKeyCommandsWithoutTabs = - [[provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:NO] count]; + [[provider keyCommandsWithEditingText:NO] count]; + + InsertNewWebState(0); // Tabs. - [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount]; - [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable]; + EXPECT_EQ(web_state_list_->count(), 1); NSUInteger numberOfKeyCommandsWithTabs = - [[provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:NO] count]; + [[provider keyCommandsWithEditingText:NO] count]; EXPECT_GT(numberOfKeyCommandsWithTabs, numberOfKeyCommandsWithoutTabs); } TEST_F(KeyCommandsProviderTest, LessKeyCommandsWhenTabsAndEditingText) { - KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init]; - id mockConsumer = - [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)]; id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands, FindInPageCommands> dispatcher = nil; + KeyCommandsProvider* provider = + [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()]; + provider.dispatcher = dispatcher; + + // No tabs. + EXPECT_EQ(web_state_list_->count(), 0); + + InsertNewWebState(0); + + // Tabs. + EXPECT_EQ(web_state_list_->count(), 1); + // Not editing text. - [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount]; - [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable]; NSUInteger numberOfKeyCommandsWhenNotEditingText = - [[provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:NO] count]; + [[provider keyCommandsWithEditingText:NO] count]; // Editing text. - [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount]; - [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable]; NSUInteger numberOfKeyCommandsWhenEditingText = - [[provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:YES] count]; + [[provider keyCommandsWithEditingText:YES] count]; EXPECT_LT(numberOfKeyCommandsWhenEditingText, numberOfKeyCommandsWhenNotEditingText); } TEST_F(KeyCommandsProviderTest, MoreKeyboardCommandsWhenFindInPageAvailable) { - KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init]; - id mockConsumer = - [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)]; id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands, FindInPageCommands> dispatcher = nil; - // No Find in Page. - [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount]; - [[[mockConsumer expect] andReturnBool:NO] isFindInPageAvailable]; - NSUInteger numberOfKeyCommandsWithoutFIP = - [[provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:NO] count]; + KeyCommandsProvider* provider = + [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()]; + provider.dispatcher = dispatcher; + + // No tabs. + EXPECT_EQ(web_state_list_->count(), 0); + + web::FakeWebState* web_state = InsertNewWebState(0); + web::FindInPageManagerImpl::CreateForWebState(web_state); + FindTabHelper::CreateForWebState(web_state); // Tabs. - [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount]; - [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable]; + EXPECT_EQ(web_state_list_->count(), 1); + + // No Find in Page. + web_state->SetContentIsHTML(false); + NSUInteger numberOfKeyCommandsWithoutFIP = + [[provider keyCommandsWithEditingText:NO] count]; + + // Can Find in Page. + web_state->SetContentIsHTML(true); NSUInteger numberOfKeyCommandsWithFIP = - [[provider keyCommandsForConsumer:mockConsumer - baseViewController:nil - dispatcher:dispatcher - navigationAgent:nullptr - omniboxHandler:nil - editingText:NO] count]; + [[provider keyCommandsWithEditingText:NO] count]; EXPECT_GT(numberOfKeyCommandsWithFIP, numberOfKeyCommandsWithoutFIP); } +//// Verifies the the next/previous tab commands from the keyboard work OK. +TEST_F(KeyCommandsProviderTest, TestFocusNextPrevious) { + // Add more web states. + InsertNewWebState(0); + InsertNewWebState(1); + InsertNewWebState(2); + + // This test assumes there are exactly three web states in the list. + ASSERT_EQ(web_state_list_->count(), 3); + + KeyCommandsProvider* provider = + [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()]; + + UIKeyCommandAction focusNextTabAction; + UIKeyCommandAction focusPreviousTabAction; + + NSArray<UIKeyCommand*>* commands = [provider keyCommandsWithEditingText:NO]; + for (UIKeyCommand* command in commands) { + if (([command.input isEqualToString:@"\t"]) && + (command.modifierFlags & UIKeyModifierControl)) { + if (command.modifierFlags & UIKeyModifierShift) { + focusPreviousTabAction = command.cr_action; + } else { + focusNextTabAction = command.cr_action; + } + } + } + focusNextTabAction(); + EXPECT_EQ(web_state_list_->active_index(), 0); + focusNextTabAction(); + EXPECT_EQ(web_state_list_->active_index(), 1); + focusNextTabAction(); + EXPECT_EQ(web_state_list_->active_index(), 2); + focusNextTabAction(); + EXPECT_EQ(web_state_list_->active_index(), 0); + focusPreviousTabAction(); + EXPECT_EQ(web_state_list_->active_index(), 2); + focusPreviousTabAction(); + EXPECT_EQ(web_state_list_->active_index(), 1); + focusPreviousTabAction(); + EXPECT_EQ(web_state_list_->active_index(), 0); +} + } // namespace
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 5eb016f..715a404 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -385,6 +385,13 @@ const base::FeatureParam<double> kChromeWideEchoCancellationDynamicMixingTimeout{ &kChromeWideEchoCancellation, "mixing_buffer_duration_percent", -1.0}; + +// Allows all sample rates to be used for audio processing. If disabled, only +// sample rates divisible by 100 are allowed; a request for a media stream with +// enabled audio processing will fail otherwise. For context see +// https://crbug.com/1332484. +const base::FeatureParam<bool> kChromeWideEchoCancellationAllowAllSampleRates{ + &kChromeWideEchoCancellation, "allow_all_sample_rates", true}; #endif // Make MSE garbage collection algorithm more aggressive when we are under
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 0f87c18d..8947112 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -131,6 +131,8 @@ kChromeWideEchoCancellationMinimizeResampling; MEDIA_EXPORT extern const base::FeatureParam<double> kChromeWideEchoCancellationDynamicMixingTimeout; +MEDIA_EXPORT extern const base::FeatureParam<bool> + kChromeWideEchoCancellationAllowAllSampleRates; #endif MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderUseSharedHandle; MEDIA_EXPORT extern const base::Feature kEnableTabMuting;
diff --git a/media/gpu/android/codec_wrapper.cc b/media/gpu/android/codec_wrapper.cc index 62744a4c..85ffc4c 100644 --- a/media/gpu/android/codec_wrapper.cc +++ b/media/gpu/android/codec_wrapper.cc
@@ -11,6 +11,7 @@ #include <vector> #include "base/bind.h" +#include "base/debug/crash_logging.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "media/base/android/media_codec_util.h" @@ -441,6 +442,14 @@ } base::AutoLock l(lock_); + + // Adding a scoped crash key here to detect the cause of gpu hang. + // crbug.com/1292936. + static auto* kCrashKey_1 = base::debug::AllocateCrashKeyString( + "acquired_lock_inside_codecwrapperimpl_releasecodecoutputbuffer", + base::debug::CrashKeySize::Size256); + base::debug::ScopedCrashKeyString scoped_crash_key_1(kCrashKey_1, "1"); + if (!codec_ || state_ == State::kError) return false; @@ -452,7 +461,17 @@ return false; int index = buffer_it->second; - codec_->ReleaseOutputBuffer(index, render); + + { + // Adding another scoped crash key here to detect the cause of gpu hang. + // crbug.com/1292936. + static auto* kCrashKey_2 = base::debug::AllocateCrashKeyString( + "executing_mediacodec_releaseoutputbuffer", + base::debug::CrashKeySize::Size256); + base::debug::ScopedCrashKeyString scoped_crash_key_2(kCrashKey_2, "1"); + codec_->ReleaseOutputBuffer(index, render); + } + buffer_ids_.erase(buffer_it); if (output_buffer_release_cb_) { output_buffer_release_cb_.Run(state_ == State::kDrained ||
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc index cc442ad..5a051ee9 100644 --- a/media/gpu/test/video_player/video_decoder_client.cc +++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -380,12 +380,25 @@ num_outstanding_decode_requests_--; // Queue the next fragment to be decoded. - decoder_client_thread_.task_runner()->PostTask( + // TODO(mcasas): Introduce a minor delay here to avoid overrunning the driver; + // this is a provision for Mediatek devices and for the erroneous behaviour + // of feeding more encoded chunk here (the driver has likely not seen any + // encoded chunk enqueued at this point) and not in FrameReadyTask as it + // should (naively moving this task there doesn't work because it prevents the + // V4L2VideoDecoder backend from polling the device driver). + decoder_client_thread_.task_runner()->PostDelayedTask( FROM_HERE, - base::BindOnce(&VideoDecoderClient::DecodeNextFragmentTask, weak_this_)); + base::BindOnce(&VideoDecoderClient::DecodeNextFragmentTask, weak_this_), +#if BUILDFLAG(USE_V4L2_CODEC) + base::Milliseconds(1) +#else + base::Milliseconds(0) +#endif + ); } void VideoDecoderClient::FrameReadyTask(scoped_refptr<VideoFrame> video_frame) { + DVLOGF(4) << current_frame_index_; DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); DCHECK(video_frame->metadata().power_efficient);
diff --git a/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h index f3d8eee..16b6246 100644 --- a/media/gpu/test/video_player/video_decoder_client.h +++ b/media/gpu/test/video_player/video_decoder_client.h
@@ -164,9 +164,10 @@ // Decoder client state, should only be accessed on the decoder client thread. VideoDecoderClientState decoder_client_state_; - // Index of the frame that's currently being decoded. + // Decoded video frame index. size_t current_frame_index_ = 0; - // The current number of outgoing bitstream buffers decode requests. + // The current number of decode requests in |decoder_|, for DCHECK purposes. + // Increased in DecodeNextFragmentTask() and decreased in DecodeDoneTask(). size_t num_outstanding_decode_requests_ = 0; // TODO(dstaessens@) Replace with StreamParser.
diff --git a/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/video_player.cc index 044456864..f7fd9dc0 100644 --- a/media/gpu/test/video_player/video_player.cc +++ b/media/gpu/test/video_player/video_player.cc
@@ -102,7 +102,6 @@ if (!WaitForEvent(VideoPlayerEvent::kInitialized)) return false; - video_ = video; video_player_state_ = VideoPlayerState::kIdle; return true; } @@ -119,7 +118,6 @@ void VideoPlayer::PlayUntil(VideoPlayerEvent event, size_t event_count) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_EQ(video_player_state_, VideoPlayerState::kIdle); - DCHECK(video_); DVLOGF(4); // Start decoding the video. @@ -142,23 +140,6 @@ decoder_client_->Flush(); } -base::TimeDelta VideoPlayer::GetCurrentTime() const { - NOTIMPLEMENTED(); - return base::TimeDelta(); -} - -size_t VideoPlayer::GetCurrentFrame() const { - NOTIMPLEMENTED(); - return 0; -} - -VideoPlayerState VideoPlayer::GetState() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - base::AutoLock auto_lock(event_lock_); - return video_player_state_; -} - bool VideoPlayer::WaitForEvent(VideoPlayerEvent event, size_t times) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_GE(times, 1u);
diff --git a/media/gpu/test/video_player/video_player.h b/media/gpu/test/video_player/video_player.h index d16b05ee..0703eff 100644 --- a/media/gpu/test/video_player/video_player.h +++ b/media/gpu/test/video_player/video_player.h
@@ -92,13 +92,6 @@ // Flush the decoder. void Flush(); - // Get current media time. - base::TimeDelta GetCurrentTime() const; - // Get the current frame number. - size_t GetCurrentFrame() const; - // Get the current state of the video player. - VideoPlayerState GetState() const; - // Wait for an event to occur the specified number of times. All events that // occurred since last calling this function will be taken into account. All // events with different types will be consumed. Will return false if the @@ -132,7 +125,6 @@ // whether the decoder client should continue decoding frames. bool NotifyEvent(VideoPlayerEvent event); - raw_ptr<const Video> video_ = nullptr; VideoPlayerState video_player_state_ = VideoPlayerState::kUninitialized; std::unique_ptr<VideoDecoderClient> decoder_client_;
diff --git a/media/mojo/mojom/remoting_common.mojom b/media/mojo/mojom/remoting_common.mojom index 6031ebc0..8be37e8 100644 --- a/media/mojo/mojom/remoting_common.mojom +++ b/media/mojo/mojom/remoting_common.mojom
@@ -15,11 +15,13 @@ USER_DISABLED, // Media Remoting was disabled by user. }; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. enum RemotingStartFailReason { - CANNOT_START_MULTIPLE, // Remoting was already active. - ROUTE_TERMINATED, // User-initated disconnect while starting remoting. - INVALID_ANSWER_MESSAGE, // Invalid ANSWER message. - REMOTING_NOT_PERMITTED, // Remoter does not have dialog permission. + CANNOT_START_MULTIPLE = 0, // Remoting was already active. + ROUTE_TERMINATED = 1, // User-initated disconnect while starting remoting. + INVALID_ANSWER_MESSAGE = 2, // Invalid ANSWER message. + REMOTING_NOT_PERMITTED = 3, // Remoter does not have dialog permission. }; enum RemotingSinkFeature {
diff --git a/media/remoting/metrics.cc b/media/remoting/metrics.cc index 164674c1..784da9fb 100644 --- a/media/remoting/metrics.cc +++ b/media/remoting/metrics.cc
@@ -64,6 +64,11 @@ RecordTrackConfiguration(); } +void SessionMetricsRecorder::StartSessionFailed( + mojom::RemotingStartFailReason reason) { + UMA_HISTOGRAM_ENUMERATION("Media.Remoting.SessionStartFailReason", reason); +} + void SessionMetricsRecorder::WillStopSession(StopTrigger trigger) { if (!start_trigger_) return;
diff --git a/media/remoting/metrics.h b/media/remoting/metrics.h index fbeaf82..343904a 100644 --- a/media/remoting/metrics.h +++ b/media/remoting/metrics.h
@@ -7,6 +7,7 @@ #include "base/time/time.h" #include "media/base/pipeline_metadata.h" +#include "media/mojo/mojom/remoting_common.mojom.h" #include "media/remoting/triggers.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/size.h" @@ -62,6 +63,7 @@ // session ends. void WillStartSession(StartTrigger trigger); void DidStartSession(); + void StartSessionFailed(mojom::RemotingStartFailReason reason); void WillStopSession(StopTrigger trigger); // These may be called before, during, or after a remoting session.
diff --git a/media/remoting/renderer_controller.cc b/media/remoting/renderer_controller.cc index 002f8aa..2f72a512 100644 --- a/media/remoting/renderer_controller.cc +++ b/media/remoting/renderer_controller.cc
@@ -164,6 +164,7 @@ VLOG(1) << "Failed to start remoting:" << reason; if (remote_rendering_started_) { metrics_recorder_.WillStopSession(START_RACE); + metrics_recorder_.StartSessionFailed(reason); remote_rendering_started_ = false; } }
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 5a0f852..d1dcaab4 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2022-06-30 12:53 UTC +# Last updated: 2022-07-07 12:54 UTC PinsListTimestamp -1656593634 +1657198484 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/remoting/base/service_urls.cc b/remoting/base/service_urls.cc index b4af901..2462b2e 100644 --- a/remoting/base/service_urls.cc +++ b/remoting/base/service_urls.cc
@@ -6,7 +6,7 @@ #include "base/check.h" #include "base/command_line.h" -#include "google_apis/google_api_keys.h" +#include "base/logging.h" // Configurable service data. // Debug builds should default to the autopush environment (can be configured @@ -41,10 +41,14 @@ if (command_line->HasSwitch(kFtlServerEndpointSwitch)) { ftl_server_endpoint_ = command_line->GetSwitchValueASCII(kFtlServerEndpointSwitch); + } else { + LOG(WARNING) << "CRD: Using autopush (non prod) FTL server"; } if (command_line->HasSwitch(kRemotingServerEndpointSwitch)) { remoting_server_endpoint_ = command_line->GetSwitchValueASCII(kRemotingServerEndpointSwitch); + } else { + LOG(WARNING) << "CRD: Using autopush (non prod) remoting server"; } } #endif // !defined(NDEBUG)
diff --git a/remoting/host/policy_watcher_unittest.cc b/remoting/host/policy_watcher_unittest.cc index 10d3a342..968da96 100644 --- a/remoting/host/policy_watcher_unittest.cc +++ b/remoting/host/policy_watcher_unittest.cc
@@ -177,10 +177,13 @@ third_party_auth_cert_empty_.MergeDictionary(&third_party_auth_partial_); third_party_auth_cert_empty_.SetStringKey( key::kRemoteAccessHostTokenValidationCertificateIssuer, ""); + +#if BUILDFLAG(IS_WIN) remote_assistance_uiaccess_true_.SetBoolKey( key::kRemoteAccessHostAllowUiAccessForRemoteAssistance, true); remote_assistance_uiaccess_false_.SetBoolKey( key::kRemoteAccessHostAllowUiAccessForRemoteAssistance, false); +#endif deprecated_policies_.SetStringKey(key::kRemoteAccessHostDomain, kHostDomain); @@ -727,10 +730,6 @@ expected_schema.erase(key::kRemoteAccessHostTokenUrl); expected_schema.erase(key::kRemoteAccessHostTokenValidationUrl); expected_schema.erase(key::kRemoteAccessHostTokenValidationCertificateIssuer); - expected_schema.erase(key::kRemoteAccessHostAllowUiAccessForRemoteAssistance); -#elif !BUILDFLAG(IS_WIN) - // RemoteAssistanceHostAllowUiAccess does not exist on non-Windows platforms. - expected_schema.erase(key::kRemoteAccessHostAllowUiAccessForRemoteAssistance); #endif std::map<std::string, base::Value::Type> actual_schema;
diff --git a/remoting/proto/video_stats.proto b/remoting/proto/video_stats.proto index 185afef8..125e8f3 100644 --- a/remoting/proto/video_stats.proto +++ b/remoting/proto/video_stats.proto
@@ -11,7 +11,7 @@ package remoting; -// Next Id: 14 +// Next Id: 15 message FrameStatsMessage { // Frame ID. optional uint32 frame_id = 1; @@ -53,4 +53,8 @@ // A simple indication of the quality of the frame, scored between 0 and 100, // with 100 representing a lossless encoded frame. optional uint32 frame_quality = 13; + + // The screen ID of the desktop-capturer that captured this frame. The value + // matches the corresponding field of the VideoTrackLayout for the stream. + optional int64 screen_id = 14; }
diff --git a/remoting/protocol/frame_stats.cc b/remoting/protocol/frame_stats.cc index 06b80e62..df995e3a 100644 --- a/remoting/protocol/frame_stats.cc +++ b/remoting/protocol/frame_stats.cc
@@ -96,6 +96,9 @@ if (message.has_frame_quality()) { result.frame_quality = message.frame_quality(); } + if (message.has_screen_id()) { + result.screen_id = message.screen_id(); + } return result; } @@ -140,6 +143,9 @@ if (frame_quality != -1) { message_out->set_frame_quality(frame_quality); } + if (screen_id != webrtc::kInvalidScreenId) { + message_out->set_screen_id(screen_id); + } } FrameStats::FrameStats() = default;
diff --git a/remoting/protocol/frame_stats.h b/remoting/protocol/frame_stats.h index fbd83ea..6e33cfa 100644 --- a/remoting/protocol/frame_stats.h +++ b/remoting/protocol/frame_stats.h
@@ -44,6 +44,7 @@ int bandwidth_estimate_kbps = -1; uint32_t capturer_id = webrtc::DesktopCapturerId::kUnknown; int frame_quality = -1; + webrtc::ScreenId screen_id = webrtc::kInvalidScreenId; }; struct ClientFrameStats {
diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc index e7ae6df..b960107 100644 --- a/remoting/protocol/webrtc_video_stream.cc +++ b/remoting/protocol/webrtc_video_stream.cc
@@ -38,6 +38,7 @@ base::TimeDelta capture_delay; uint32_t capturer_id = 0; + webrtc::ScreenId screen_id = webrtc::kInvalidScreenId; }; WebrtcVideoStream::WebrtcVideoStream(const std::string& stream_name, @@ -96,6 +97,7 @@ } void WebrtcVideoStream::SelectSource(webrtc::ScreenId id) { + screen_id_ = id; capturer_->SelectSource(id); } @@ -176,6 +178,7 @@ current_frame_stats_->capture_started_time = base::TimeTicks::Now(); current_frame_stats_->input_event_timestamps = event_timestamps_source_->TakeLastEventTimestamps(); + current_frame_stats_->screen_id = screen_id_; capturer_->CaptureFrame(); } @@ -252,6 +255,8 @@ // interface, and move this logic to the encoders. stats.frame_quality = (63 - frame.quantizer) * 100 / 63; + stats.screen_id = current_frame_stats->screen_id; + video_stats_dispatcher_->OnVideoFrameStats(result.frame_id, stats); } }
diff --git a/remoting/protocol/webrtc_video_stream.h b/remoting/protocol/webrtc_video_stream.h index bfb31d04..e8b99131 100644 --- a/remoting/protocol/webrtc_video_stream.h +++ b/remoting/protocol/webrtc_video_stream.h
@@ -87,6 +87,9 @@ // Called by |video_track_source_|. void OnSinkAddedOrUpdated(const rtc::VideoSinkWants& wants); + // Screen ID of the monitor being captured, from SelectSource(). + webrtc::ScreenId screen_id_ = webrtc::kInvalidScreenId; + // Label of the associated WebRTC video-stream. std::string stream_name_;
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 0913cf3..2996d506 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5688,21 +5688,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -5715,7 +5715,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "isolate_profile_data": true, @@ -5853,21 +5853,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -5879,7 +5879,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "args": [ @@ -5999,21 +5999,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -6025,7 +6025,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.dev.json b/testing/buildbot/chromium.dev.json index 4aa7be59..3998d52 100644 --- a/testing/buildbot/chromium.dev.json +++ b/testing/buildbot/chromium.dev.json
@@ -302,7 +302,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com" @@ -320,7 +320,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com" @@ -338,7 +338,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com" @@ -356,7 +356,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com" @@ -374,7 +374,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com" @@ -392,7 +392,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index dcc5234c..9ea56908 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -25744,7 +25744,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -25798,7 +25798,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -25852,7 +25852,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -25907,7 +25907,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -25962,7 +25962,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26017,7 +26017,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26072,7 +26072,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26127,7 +26127,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26182,7 +26182,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26236,7 +26236,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26290,7 +26290,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26345,7 +26345,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26400,7 +26400,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26454,7 +26454,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26508,7 +26508,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26562,7 +26562,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26616,7 +26616,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26670,7 +26670,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26729,7 +26729,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26781,7 +26781,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26833,7 +26833,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26885,7 +26885,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26937,7 +26937,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -26989,7 +26989,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27041,7 +27041,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27093,7 +27093,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27145,7 +27145,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27197,7 +27197,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27249,7 +27249,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27301,7 +27301,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27353,7 +27353,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27405,7 +27405,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27457,7 +27457,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27509,7 +27509,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27561,7 +27561,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27613,7 +27613,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27666,7 +27666,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27719,7 +27719,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27772,7 +27772,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27825,7 +27825,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27879,7 +27879,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27933,7 +27933,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -27987,7 +27987,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28041,7 +28041,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28095,7 +28095,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28149,7 +28149,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28203,7 +28203,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28257,7 +28257,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28311,7 +28311,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28364,7 +28364,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28417,7 +28417,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28470,7 +28470,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28524,7 +28524,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28578,7 +28578,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28631,7 +28631,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28683,7 +28683,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28735,7 +28735,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28787,7 +28787,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28840,7 +28840,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28893,7 +28893,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28946,7 +28946,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -28998,7 +28998,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29050,7 +29050,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29103,7 +29103,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29156,7 +29156,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29209,7 +29209,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29262,7 +29262,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29314,7 +29314,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29366,7 +29366,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29418,7 +29418,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29470,7 +29470,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29522,7 +29522,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29575,7 +29575,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29628,7 +29628,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29681,7 +29681,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29733,7 +29733,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29785,7 +29785,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29837,7 +29837,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29889,7 +29889,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29941,7 +29941,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -29993,7 +29993,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30045,7 +30045,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30097,7 +30097,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30149,7 +30149,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30201,7 +30201,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30253,7 +30253,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30305,7 +30305,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30357,7 +30357,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30409,7 +30409,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30461,7 +30461,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30513,7 +30513,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30565,7 +30565,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30617,7 +30617,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30669,7 +30669,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30721,7 +30721,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30773,7 +30773,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30825,7 +30825,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30877,7 +30877,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30929,7 +30929,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -30985,7 +30985,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31044,7 +31044,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31096,7 +31096,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31148,7 +31148,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31200,7 +31200,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31252,7 +31252,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31304,7 +31304,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31356,7 +31356,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31408,7 +31408,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31460,7 +31460,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31512,7 +31512,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31564,7 +31564,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31616,7 +31616,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31668,7 +31668,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31720,7 +31720,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31772,7 +31772,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31824,7 +31824,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31876,7 +31876,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31928,7 +31928,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -31980,7 +31980,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32032,7 +32032,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32084,7 +32084,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32136,7 +32136,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32188,7 +32188,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32240,7 +32240,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32292,7 +32292,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32344,7 +32344,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32396,7 +32396,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32448,7 +32448,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32500,7 +32500,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32552,7 +32552,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32604,7 +32604,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32656,7 +32656,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32708,7 +32708,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32760,7 +32760,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32813,7 +32813,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32866,7 +32866,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32919,7 +32919,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -32972,7 +32972,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33025,7 +33025,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33078,7 +33078,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33131,7 +33131,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33185,7 +33185,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33239,7 +33239,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33293,7 +33293,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33347,7 +33347,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33401,7 +33401,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33455,7 +33455,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33509,7 +33509,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33563,7 +33563,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33617,7 +33617,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33671,7 +33671,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33725,7 +33725,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33779,7 +33779,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33833,7 +33833,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33887,7 +33887,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33941,7 +33941,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -33995,7 +33995,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34049,7 +34049,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34103,7 +34103,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34156,7 +34156,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34209,7 +34209,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34262,7 +34262,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34315,7 +34315,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34368,7 +34368,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34421,7 +34421,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34475,7 +34475,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34529,7 +34529,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34583,7 +34583,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34637,7 +34637,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34691,7 +34691,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34744,7 +34744,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34796,7 +34796,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34848,7 +34848,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34900,7 +34900,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -34952,7 +34952,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35004,7 +35004,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35056,7 +35056,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35108,7 +35108,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35161,7 +35161,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35214,7 +35214,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35267,7 +35267,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35320,7 +35320,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35373,7 +35373,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35426,7 +35426,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35478,7 +35478,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35530,7 +35530,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35582,7 +35582,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35635,7 +35635,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35688,7 +35688,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35740,7 +35740,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35793,7 +35793,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35846,7 +35846,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35899,7 +35899,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -35952,7 +35952,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36005,7 +36005,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36058,7 +36058,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36110,7 +36110,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36162,7 +36162,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36214,7 +36214,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36266,7 +36266,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36318,7 +36318,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36370,7 +36370,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36422,7 +36422,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36474,7 +36474,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36526,7 +36526,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36578,7 +36578,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36631,7 +36631,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36684,7 +36684,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36737,7 +36737,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36790,7 +36790,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36843,7 +36843,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36896,7 +36896,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -36948,7 +36948,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37000,7 +37000,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37052,7 +37052,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37104,7 +37104,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37156,7 +37156,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37208,7 +37208,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37260,7 +37260,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37312,7 +37312,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37364,7 +37364,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37416,7 +37416,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37468,7 +37468,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37520,7 +37520,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37572,7 +37572,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37624,7 +37624,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37676,7 +37676,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37728,7 +37728,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37780,7 +37780,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37832,7 +37832,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37884,7 +37884,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37936,7 +37936,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -37988,7 +37988,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38040,7 +38040,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38092,7 +38092,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38144,7 +38144,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38196,7 +38196,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38248,7 +38248,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38300,7 +38300,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38352,7 +38352,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38404,7 +38404,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38456,7 +38456,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38508,7 +38508,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38560,7 +38560,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38612,7 +38612,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38664,7 +38664,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38716,7 +38716,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38768,7 +38768,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38820,7 +38820,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38872,7 +38872,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38924,7 +38924,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -38976,7 +38976,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39028,7 +39028,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39080,7 +39080,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39132,7 +39132,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39184,7 +39184,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39236,7 +39236,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39288,7 +39288,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39340,7 +39340,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39392,7 +39392,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39451,7 +39451,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39506,7 +39506,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39561,7 +39561,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39616,7 +39616,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39671,7 +39671,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39726,7 +39726,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39781,7 +39781,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39836,7 +39836,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39891,7 +39891,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -39946,7 +39946,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40001,7 +40001,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40056,7 +40056,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40111,7 +40111,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40166,7 +40166,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40221,7 +40221,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40276,7 +40276,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40331,7 +40331,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40386,7 +40386,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40441,7 +40441,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40496,7 +40496,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40551,7 +40551,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40606,7 +40606,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40661,7 +40661,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40716,7 +40716,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40771,7 +40771,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40826,7 +40826,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40881,7 +40881,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40936,7 +40936,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -40991,7 +40991,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41046,7 +41046,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41101,7 +41101,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41156,7 +41156,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41211,7 +41211,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41266,7 +41266,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41322,7 +41322,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41378,7 +41378,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41434,7 +41434,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41490,7 +41490,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41546,7 +41546,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41602,7 +41602,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41658,7 +41658,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41715,7 +41715,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41772,7 +41772,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41829,7 +41829,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41886,7 +41886,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -41943,7 +41943,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42000,7 +42000,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42057,7 +42057,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42114,7 +42114,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42171,7 +42171,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42228,7 +42228,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42285,7 +42285,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42342,7 +42342,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42399,7 +42399,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42456,7 +42456,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42513,7 +42513,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42570,7 +42570,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42627,7 +42627,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42684,7 +42684,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42740,7 +42740,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42796,7 +42796,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42852,7 +42852,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42908,7 +42908,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -42964,7 +42964,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43020,7 +43020,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43077,7 +43077,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43134,7 +43134,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43191,7 +43191,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43248,7 +43248,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43305,7 +43305,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43361,7 +43361,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43416,7 +43416,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43471,7 +43471,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43526,7 +43526,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43581,7 +43581,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43636,7 +43636,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43691,7 +43691,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43746,7 +43746,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43802,7 +43802,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43858,7 +43858,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43914,7 +43914,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -43970,7 +43970,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44026,7 +44026,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44082,7 +44082,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44137,7 +44137,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44192,7 +44192,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44247,7 +44247,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44303,7 +44303,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44359,7 +44359,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44414,7 +44414,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44470,7 +44470,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44526,7 +44526,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44582,7 +44582,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44638,7 +44638,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44694,7 +44694,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44750,7 +44750,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44805,7 +44805,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44860,7 +44860,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44915,7 +44915,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -44970,7 +44970,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45025,7 +45025,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45080,7 +45080,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45135,7 +45135,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45190,7 +45190,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45245,7 +45245,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45300,7 +45300,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45356,7 +45356,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45412,7 +45412,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45468,7 +45468,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45524,7 +45524,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45580,7 +45580,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45636,7 +45636,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45691,7 +45691,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45746,7 +45746,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45801,7 +45801,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45856,7 +45856,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45911,7 +45911,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -45966,7 +45966,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46021,7 +46021,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46076,7 +46076,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46131,7 +46131,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46186,7 +46186,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46241,7 +46241,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46296,7 +46296,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46351,7 +46351,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46406,7 +46406,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46461,7 +46461,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46516,7 +46516,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46571,7 +46571,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46626,7 +46626,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46681,7 +46681,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46736,7 +46736,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46791,7 +46791,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46846,7 +46846,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46901,7 +46901,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -46956,7 +46956,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47011,7 +47011,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47066,7 +47066,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47121,7 +47121,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47176,7 +47176,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47231,7 +47231,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47286,7 +47286,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47341,7 +47341,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47396,7 +47396,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47451,7 +47451,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47506,7 +47506,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47561,7 +47561,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47616,7 +47616,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47671,7 +47671,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47726,7 +47726,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47781,7 +47781,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47836,7 +47836,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47891,7 +47891,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -47946,7 +47946,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48001,7 +48001,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48056,7 +48056,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48111,7 +48111,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48166,7 +48166,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48221,7 +48221,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48276,7 +48276,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48332,7 +48332,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48388,7 +48388,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48440,7 +48440,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48492,7 +48492,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48544,7 +48544,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48596,7 +48596,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48648,7 +48648,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48700,7 +48700,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48752,7 +48752,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48805,7 +48805,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48858,7 +48858,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48912,7 +48912,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -48966,7 +48966,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49020,7 +49020,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49073,7 +49073,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49126,7 +49126,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49179,7 +49179,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49231,7 +49231,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49283,7 +49283,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49336,7 +49336,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49389,7 +49389,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49441,7 +49441,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49493,7 +49493,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49546,7 +49546,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49598,7 +49598,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49650,7 +49650,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49702,7 +49702,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49754,7 +49754,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49806,7 +49806,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49858,7 +49858,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49910,7 +49910,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -49962,7 +49962,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50014,7 +50014,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50072,7 +50072,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50126,7 +50126,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50180,7 +50180,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50234,7 +50234,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50288,7 +50288,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50342,7 +50342,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50396,7 +50396,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50450,7 +50450,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50504,7 +50504,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50558,7 +50558,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50612,7 +50612,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50666,7 +50666,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50720,7 +50720,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50774,7 +50774,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50828,7 +50828,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50882,7 +50882,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50937,7 +50937,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -50992,7 +50992,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51047,7 +51047,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51103,7 +51103,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51159,7 +51159,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51215,7 +51215,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51271,7 +51271,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51327,7 +51327,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51383,7 +51383,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51438,7 +51438,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51493,7 +51493,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51549,7 +51549,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51604,7 +51604,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51658,7 +51658,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51713,7 +51713,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51768,7 +51768,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51822,7 +51822,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51876,7 +51876,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51930,7 +51930,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -51985,7 +51985,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52040,7 +52040,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52094,7 +52094,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52149,7 +52149,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52204,7 +52204,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52258,7 +52258,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52312,7 +52312,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52366,7 +52366,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52420,7 +52420,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52475,7 +52475,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52530,7 +52530,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52584,7 +52584,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52638,7 +52638,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52692,7 +52692,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52746,7 +52746,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52800,7 +52800,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52854,7 +52854,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52908,7 +52908,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -52962,7 +52962,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53016,7 +53016,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53070,7 +53070,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53124,7 +53124,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53178,7 +53178,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53232,7 +53232,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53286,7 +53286,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53340,7 +53340,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53394,7 +53394,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53448,7 +53448,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -53502,7 +53502,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -92905,21 +92905,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -92927,7 +92927,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "isolate_profile_data": true, @@ -93040,28 +93040,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "args": [ @@ -93161,28 +93161,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "isolate_profile_data": true, @@ -94520,20 +94520,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -94547,7 +94547,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "merge": { @@ -94685,20 +94685,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -94711,7 +94711,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "args": [ @@ -94831,20 +94831,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -94857,7 +94857,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "merge": { @@ -96353,20 +96353,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -96380,7 +96380,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "merge": { @@ -96518,20 +96518,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -96544,7 +96544,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "args": [ @@ -96664,20 +96664,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -96690,7 +96690,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "merge": { @@ -97425,20 +97425,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -97451,7 +97451,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" } ] }, @@ -97664,7 +97664,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97683,7 +97683,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97705,7 +97705,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97725,7 +97725,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97744,7 +97744,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97763,7 +97763,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97782,7 +97782,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97801,7 +97801,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97820,7 +97820,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97840,7 +97840,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97859,7 +97859,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97878,7 +97878,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97900,7 +97900,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97919,7 +97919,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97938,7 +97938,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97957,7 +97957,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97976,7 +97976,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -97995,7 +97995,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98014,7 +98014,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98033,7 +98033,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98055,7 +98055,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -98075,7 +98075,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98094,7 +98094,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98113,7 +98113,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98132,7 +98132,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98151,7 +98151,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98170,7 +98170,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98189,7 +98189,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98208,7 +98208,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98227,7 +98227,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98246,7 +98246,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98265,7 +98265,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98284,7 +98284,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98303,7 +98303,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98322,7 +98322,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98341,7 +98341,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98360,7 +98360,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98379,7 +98379,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98398,7 +98398,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98417,7 +98417,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98436,7 +98436,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98458,7 +98458,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -98478,7 +98478,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98497,7 +98497,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98516,7 +98516,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98535,7 +98535,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98554,7 +98554,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98573,7 +98573,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98592,7 +98592,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98611,7 +98611,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98630,7 +98630,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98649,7 +98649,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98668,7 +98668,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98687,7 +98687,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98706,7 +98706,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98725,7 +98725,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98744,7 +98744,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98763,7 +98763,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98782,7 +98782,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98801,7 +98801,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98820,7 +98820,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98839,7 +98839,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98858,7 +98858,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98877,7 +98877,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98896,7 +98896,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98915,7 +98915,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98934,7 +98934,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98953,7 +98953,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98975,7 +98975,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -98994,7 +98994,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99013,7 +99013,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99032,7 +99032,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99056,7 +99056,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99075,7 +99075,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99094,7 +99094,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99113,7 +99113,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99132,7 +99132,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99152,7 +99152,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99171,7 +99171,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99197,7 +99197,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -99220,7 +99220,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99242,7 +99242,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99264,7 +99264,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99286,7 +99286,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99308,7 +99308,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -99338,7 +99338,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "idempotent": false, @@ -99366,7 +99366,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-12" } ], "idempotent": false,
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index 476e7e99..59614a0 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -5409,7 +5409,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5428,7 +5428,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5450,7 +5450,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5470,7 +5470,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5489,7 +5489,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5508,7 +5508,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5527,7 +5527,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5546,7 +5546,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5565,7 +5565,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5585,7 +5585,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5604,7 +5604,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5623,7 +5623,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5643,7 +5643,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5666,7 +5666,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5685,7 +5685,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5704,7 +5704,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5723,7 +5723,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5742,7 +5742,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5761,7 +5761,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5780,7 +5780,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5799,7 +5799,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5818,7 +5818,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "quickrun_shards": 10, @@ -5839,7 +5839,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5858,7 +5858,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5877,7 +5877,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5896,7 +5896,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5915,7 +5915,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5934,7 +5934,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5953,7 +5953,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5972,7 +5972,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5991,7 +5991,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6010,7 +6010,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6029,7 +6029,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6048,7 +6048,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6067,7 +6067,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6086,7 +6086,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6105,7 +6105,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6124,7 +6124,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6143,7 +6143,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6162,7 +6162,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6181,7 +6181,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6200,7 +6200,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6219,7 +6219,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "quickrun_shards": 6, @@ -6240,7 +6240,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6259,7 +6259,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6278,7 +6278,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6297,7 +6297,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6316,7 +6316,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6335,7 +6335,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6354,7 +6354,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6373,7 +6373,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6392,7 +6392,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6411,7 +6411,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6430,7 +6430,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6449,7 +6449,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6468,7 +6468,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6487,7 +6487,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6506,7 +6506,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6525,7 +6525,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6544,7 +6544,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6563,7 +6563,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6582,7 +6582,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6601,7 +6601,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6620,7 +6620,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6639,7 +6639,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6658,7 +6658,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6677,7 +6677,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6696,7 +6696,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6715,7 +6715,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6735,7 +6735,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6754,7 +6754,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6773,7 +6773,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6797,7 +6797,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6816,7 +6816,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6835,7 +6835,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6854,7 +6854,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6873,7 +6873,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6893,7 +6893,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6912,7 +6912,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6938,7 +6938,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6974,7 +6974,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "quickrun_shards": 10, @@ -7012,7 +7012,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "quickrun_shards": 16, @@ -7041,7 +7041,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7061,7 +7061,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7086,7 +7086,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7110,7 +7110,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7134,7 +7134,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7157,7 +7157,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7177,7 +7177,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7200,7 +7200,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7223,7 +7223,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "idempotent": false, @@ -7251,7 +7251,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "idempotent": false, @@ -7280,7 +7280,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "idempotent": false, @@ -7307,7 +7307,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-11|Mac-10.16" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -11010,7 +11010,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11063,7 +11063,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11116,7 +11116,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11169,7 +11169,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11222,7 +11222,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11275,7 +11275,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11328,7 +11328,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11381,7 +11381,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11434,7 +11434,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11487,7 +11487,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11540,7 +11540,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11593,7 +11593,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11646,7 +11646,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11699,7 +11699,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11752,7 +11752,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11805,7 +11805,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11858,7 +11858,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11911,7 +11911,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -11964,7 +11964,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12017,7 +12017,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12070,7 +12070,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12123,7 +12123,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12176,7 +12176,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12229,7 +12229,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12282,7 +12282,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12335,7 +12335,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12388,7 +12388,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12441,7 +12441,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12494,7 +12494,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12547,7 +12547,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12600,7 +12600,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12653,7 +12653,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12706,7 +12706,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12759,7 +12759,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12813,7 +12813,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12868,7 +12868,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12923,7 +12923,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -12978,7 +12978,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13033,7 +13033,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13088,7 +13088,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13142,7 +13142,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13195,7 +13195,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13248,7 +13248,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13301,7 +13301,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13354,7 +13354,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13407,7 +13407,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13460,7 +13460,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13513,7 +13513,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13566,7 +13566,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13619,7 +13619,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13672,7 +13672,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13726,7 +13726,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13780,7 +13780,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13833,7 +13833,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13886,7 +13886,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13939,7 +13939,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -13992,7 +13992,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14045,7 +14045,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14098,7 +14098,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14151,7 +14151,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14204,7 +14204,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14257,7 +14257,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14310,7 +14310,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14363,7 +14363,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14417,7 +14417,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14471,7 +14471,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14524,7 +14524,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14577,7 +14577,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14630,7 +14630,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14683,7 +14683,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14736,7 +14736,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14789,7 +14789,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14842,7 +14842,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14895,7 +14895,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -14948,7 +14948,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15001,7 +15001,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15054,7 +15054,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15107,7 +15107,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15160,7 +15160,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15213,7 +15213,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15266,7 +15266,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15319,7 +15319,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15372,7 +15372,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15425,7 +15425,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15478,7 +15478,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15531,7 +15531,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15584,7 +15584,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15637,7 +15637,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15690,7 +15690,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15743,7 +15743,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15796,7 +15796,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15849,7 +15849,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15902,7 +15902,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -15955,7 +15955,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16008,7 +16008,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16061,7 +16061,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16114,7 +16114,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16167,7 +16167,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16220,7 +16220,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16273,7 +16273,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16326,7 +16326,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16379,7 +16379,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16432,7 +16432,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16485,7 +16485,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16538,7 +16538,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16591,7 +16591,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16644,7 +16644,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16697,7 +16697,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16750,7 +16750,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16803,7 +16803,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16856,7 +16856,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16909,7 +16909,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -16962,7 +16962,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17015,7 +17015,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17076,7 +17076,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17130,7 +17130,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17184,7 +17184,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17238,7 +17238,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17292,7 +17292,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17346,7 +17346,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17400,7 +17400,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17455,7 +17455,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17510,7 +17510,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17565,7 +17565,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17620,7 +17620,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17675,7 +17675,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17730,7 +17730,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17785,7 +17785,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17840,7 +17840,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17895,7 +17895,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17950,7 +17950,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18005,7 +18005,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18060,7 +18060,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18115,7 +18115,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18170,7 +18170,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18224,7 +18224,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18278,7 +18278,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18332,7 +18332,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18386,7 +18386,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18440,7 +18440,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18494,7 +18494,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18549,7 +18549,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18604,7 +18604,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18659,7 +18659,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18714,7 +18714,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18768,7 +18768,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18822,7 +18822,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18876,7 +18876,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18930,7 +18930,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18984,7 +18984,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19038,7 +19038,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19092,7 +19092,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19146,7 +19146,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19200,7 +19200,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19254,7 +19254,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19308,7 +19308,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19362,7 +19362,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19416,7 +19416,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19470,7 +19470,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19524,7 +19524,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19583,7 +19583,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19635,7 +19635,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19687,7 +19687,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19739,7 +19739,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19791,7 +19791,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19844,7 +19844,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19897,7 +19897,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19951,7 +19951,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20005,7 +20005,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20059,7 +20059,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20113,7 +20113,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20167,7 +20167,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20221,7 +20221,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20275,7 +20275,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20329,7 +20329,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20383,7 +20383,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20436,7 +20436,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20490,7 +20490,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20544,7 +20544,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20598,7 +20598,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20652,7 +20652,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20704,7 +20704,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20757,7 +20757,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20810,7 +20810,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20862,7 +20862,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20915,7 +20915,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20968,7 +20968,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21020,7 +21020,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21073,7 +21073,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21126,7 +21126,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21179,7 +21179,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21232,7 +21232,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21284,7 +21284,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21336,7 +21336,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21388,7 +21388,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21440,7 +21440,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -21478,7 +21478,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21497,7 +21497,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21519,7 +21519,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21539,7 +21539,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21558,7 +21558,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21577,7 +21577,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21596,7 +21596,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21615,7 +21615,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21634,7 +21634,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21654,7 +21654,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21673,7 +21673,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21692,7 +21692,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21714,7 +21714,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -21737,7 +21737,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21756,7 +21756,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21775,7 +21775,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21794,7 +21794,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21813,7 +21813,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21832,7 +21832,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21851,7 +21851,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21870,7 +21870,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21889,7 +21889,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -21909,7 +21909,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21928,7 +21928,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21947,7 +21947,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21966,7 +21966,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -21985,7 +21985,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22004,7 +22004,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22023,7 +22023,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22042,7 +22042,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22061,7 +22061,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22080,7 +22080,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22099,7 +22099,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22118,7 +22118,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22137,7 +22137,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22156,7 +22156,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22175,7 +22175,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22194,7 +22194,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22213,7 +22213,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22232,7 +22232,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22251,7 +22251,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22270,7 +22270,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -22290,7 +22290,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22309,7 +22309,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22328,7 +22328,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22347,7 +22347,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22366,7 +22366,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22385,7 +22385,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22404,7 +22404,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22423,7 +22423,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22442,7 +22442,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22461,7 +22461,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22480,7 +22480,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22499,7 +22499,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22518,7 +22518,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22537,7 +22537,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22556,7 +22556,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22575,7 +22575,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22594,7 +22594,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22613,7 +22613,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22632,7 +22632,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22651,7 +22651,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22670,7 +22670,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22689,7 +22689,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22708,7 +22708,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22727,7 +22727,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22746,7 +22746,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22765,7 +22765,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22784,7 +22784,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22803,7 +22803,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22827,7 +22827,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22846,7 +22846,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22865,7 +22865,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22884,7 +22884,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22903,7 +22903,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22923,7 +22923,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22942,7 +22942,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -22968,7 +22968,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23004,7 +23004,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -23041,7 +23041,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -23069,7 +23069,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23089,7 +23089,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23114,7 +23114,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23138,7 +23138,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23162,7 +23162,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23182,7 +23182,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23205,7 +23205,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -23228,7 +23228,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "idempotent": false, @@ -23255,7 +23255,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "idempotent": false, @@ -23282,7 +23282,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12" + "os": "Mac-11" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 4675c992..597bf201 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -17558,7 +17558,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17610,7 +17610,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17662,7 +17662,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17714,7 +17714,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17766,7 +17766,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17818,7 +17818,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17870,7 +17870,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17922,7 +17922,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -17974,7 +17974,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18026,7 +18026,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18078,7 +18078,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18130,7 +18130,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18182,7 +18182,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18234,7 +18234,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18286,7 +18286,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18338,7 +18338,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18390,7 +18390,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18442,7 +18442,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18494,7 +18494,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18546,7 +18546,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18598,7 +18598,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18650,7 +18650,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18702,7 +18702,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18755,7 +18755,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18808,7 +18808,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18860,7 +18860,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18912,7 +18912,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -18964,7 +18964,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19016,7 +19016,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19068,7 +19068,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19120,7 +19120,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19172,7 +19172,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19224,7 +19224,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19276,7 +19276,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19328,7 +19328,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19380,7 +19380,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19432,7 +19432,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19484,7 +19484,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19536,7 +19536,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19588,7 +19588,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19640,7 +19640,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19692,7 +19692,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19744,7 +19744,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19796,7 +19796,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19848,7 +19848,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19900,7 +19900,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -19952,7 +19952,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20004,7 +20004,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -20874,21 +20874,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -20901,7 +20901,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "isolate_profile_data": true, @@ -21039,21 +21039,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -21065,7 +21065,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "args": [ @@ -21185,21 +21185,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5165.0", - "revision": "version:105.0.5165.0" + "location": "lacros_version_skew_tests_v105.0.5166.0", + "revision": "version:105.0.5166.0" } ], "dimension_sets": [ @@ -21211,7 +21211,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5165.0" + "variant_id": "Lacros version skew testing ash 105.0.5166.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 6b436bc..3c5a77b 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -1438,6 +1438,56 @@ } ] }, + "lacros-x86-perf": { + "isolated_scripts": [ + { + "args": [ + "-v", + "--browser=lacros-chrome", + "--upload-results", + "--test-shard-map-filename=lacros-x86-perf_map.json", + "--remote=variable_chromeos_device_hostname" + ], + "isolate_name": "performance_test_suite_octopus", + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "performance_test_suite_octopus", + "override_compile_targets": [ + "performance_test_suite_octopus" + ], + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_status": "available", + "device_type": "grabbiter", + "gpu": null, + "os": "ChromeOS", + "pool": "chrome.tests.perf" + } + ], + "expiration": 7200, + "hard_timeout": 21600, + "ignore_task_failure": false, + "io_timeout": 21600, + "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "trigger_script": { + "args": [ + "--multiple-dimension-script-verbose", + "True" + ], + "requires_simultaneous_shard_dispatch": true, + "script": "//testing/trigger_scripts/perf_device_trigger.py" + } + } + ] + }, "linux-builder-perf": { "additional_compile_targets": [ "chromedriver",
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json index c054f96..f4ca913 100644 --- a/testing/buildbot/chromium.webrtc.fyi.json +++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -290,7 +290,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -313,7 +313,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -334,7 +334,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -359,7 +359,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -380,7 +380,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -401,7 +401,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -596,7 +596,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [ @@ -648,7 +648,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "named_caches": [
diff --git a/testing/buildbot/chromium.webrtc.json b/testing/buildbot/chromium.webrtc.json index 9713739..4385864 100644 --- a/testing/buildbot/chromium.webrtc.json +++ b/testing/buildbot/chromium.webrtc.json
@@ -360,7 +360,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -385,7 +385,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -409,7 +409,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -434,7 +434,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12", + "os": "Mac-12", "pool": "WebRTC-chromium" } ], @@ -457,7 +457,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -482,7 +482,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -508,7 +508,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -530,7 +530,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -552,7 +552,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16|Mac-12" + "os": "Mac-12" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index ba5a158f..31b08fc 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1488,6 +1488,10 @@ "label": "//chrome/test:performance_test_suite_eve", "type": "generated_script", }, + "performance_test_suite_octopus": { + "label": "//chrome/test:performance_test_suite_octopus", + "type": "generated_script", + }, "performance_web_engine_test_suite": { "args": [ "../../content/test/gpu/run_telemetry_benchmark_fuchsia.py",
diff --git a/testing/buildbot/internal.chrome.fyi.json b/testing/buildbot/internal.chrome.fyi.json index 3598dce..f60d4dd 100644 --- a/testing/buildbot/internal.chrome.fyi.json +++ b/testing/buildbot/internal.chrome.fyi.json
@@ -62,7 +62,7 @@ "dimension_sets": [ { "cpu": "arm64", - "os": "Mac-11|Mac-12", + "os": "Mac-12", "pool": "chrome.tests.finch" } ],
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index 3672e3b..f0841ef 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -799,23 +799,6 @@ }, }, }, - # TODO(crbug.com/1325185) Remove Mac11 once testers have been upgraded to Mac12 - 'mac_11_or_12_arm64': { - 'swarming': { - 'dimensions': { - 'cpu': 'arm64', - 'os': 'Mac-11|Mac-12', - }, - }, - }, - 'mac_11_or_12_x64': { - 'swarming': { - 'dimensions': { - 'cpu': 'x86-64', - 'os': 'Mac-11|Mac-10.16|Mac-12', - }, - }, - }, 'mac_11_x64': { 'swarming': { 'dimensions': { @@ -824,7 +807,7 @@ }, }, }, - 'mac_12_beta_arm64': { + 'mac_12_arm64': { 'swarming': { 'dimensions': { 'cpu': 'arm64', @@ -832,14 +815,6 @@ }, }, }, - 'mac_12_beta_x64': { - 'swarming': { - 'dimensions': { - 'cpu': 'x86-64', - 'os': 'Mac-12', - }, - }, - }, 'mac_12_x64': { 'swarming': { 'dimensions': { @@ -870,6 +845,22 @@ }, }, }, + 'mac_beta_arm64': { + 'swarming': { + 'dimensions': { + 'cpu': 'arm64', + 'os': 'Mac-12', + }, + }, + }, + 'mac_beta_x64': { + 'swarming': { + 'dimensions': { + 'cpu': 'x86-64', + 'os': 'Mac-12', + }, + }, + }, 'mac_mini_intel_gpu_experimental': { 'swarming': { 'dimensions': {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 0f9d633..49ab912 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 105.0.5165.0', + 'identifier': 'Lacros version skew testing ash 105.0.5166.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v105.0.5165.0', - 'revision': 'version:105.0.5165.0', + 'location': 'lacros_version_skew_tests_v105.0.5166.0', + 'revision': 'version:105.0.5166.0', }, ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 0eedd574..42ace420 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2454,7 +2454,7 @@ }, 'mac-arm-rel-swarming': { 'mixins': [ - 'mac_11_or_12_arm64', + 'mac_12_arm64', ], 'test_suites': { 'gtest_tests': 'chromium_swarm_desktop_gtests', @@ -2762,7 +2762,7 @@ 'mixins': [ 'has_native_resultdb_integration', 'isolate_profile_data', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -2860,7 +2860,7 @@ }, 'Mac Builder Next': { 'mixins': [ - 'mac_12_beta_arm64', + 'mac_beta_arm64', ], 'additional_compile_targets': [ 'all', @@ -3218,7 +3218,7 @@ 'ios-fieldtrial-rel': { 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_arm64', + 'mac_12_arm64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3236,7 +3236,7 @@ ], 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_arm64', + 'mac_12_arm64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3249,7 +3249,7 @@ 'ios-m1-simulator-cronet': { 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_arm64', + 'mac_12_arm64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3266,7 +3266,7 @@ ], 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3281,7 +3281,7 @@ 'has_native_resultdb_integration', 'ios_output_disabled_tests', 'isolate_profile_data', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3294,7 +3294,7 @@ 'ios-simulator-cronet': { 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3307,7 +3307,7 @@ 'ios-simulator-multi-window': { 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3321,7 +3321,7 @@ 'mixins': [ 'has_native_resultdb_integration', 'ios_custom_webkit', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -3671,7 +3671,7 @@ 'mac-code-coverage': { 'mixins': [ 'isolate_profile_data', - 'mac_11_or_12_x64', + 'mac_12_x64', ], 'test_suites': { 'gtest_tests': 'chromium_mac_gtests', @@ -3679,7 +3679,7 @@ }, 'mac-fieldtrial-rel': { 'mixins': [ - 'mac_11_or_12_arm64', + 'mac_12_arm64', ], 'test_suites': { 'gtest_tests': 'fieldtrial_browser_tests', @@ -3694,7 +3694,7 @@ 'mac-osxbeta-rel': { 'mixins': [ 'limited_capacity_bot', - 'mac_12_beta_x64', + 'mac_beta_x64', ], 'test_suites': { 'gtest_tests': 'chromium_mac_gtests_no_nacl', @@ -5043,7 +5043,7 @@ }, 'Mac11 Tests': { 'mixins': [ - 'mac_11_or_12_x64', + 'mac_11_x64', 'isolate_profile_data', ], 'test_suites': { @@ -5093,7 +5093,7 @@ 'mixins': [ 'has_native_resultdb_integration', 'isolate_profile_data', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -5110,7 +5110,7 @@ 'mixins': [ 'has_native_resultdb_integration', 'isolate_profile_data', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -5126,7 +5126,7 @@ ], 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -5145,7 +5145,7 @@ 'mixins': [ # Only run selected test suites on CQ. https://crbug.com/1234525. 'ci_only', - 'mac_11_or_12_arm64', + 'mac_11_arm64', ], 'test_suites': { 'gtest_tests': 'chromium_mac_gtests_no_nacl_no_nocompile', @@ -5156,7 +5156,7 @@ 'mixins': [ # Only run selected test suites on CQ. https://crbug.com/1234525. 'ci_only', - 'mac_12_beta_arm64', + 'mac_12_arm64', ], 'test_suites': { 'gtest_tests': 'chromium_mac_gtests_no_nacl_no_nocompile', @@ -5313,7 +5313,7 @@ ], 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -5425,7 +5425,7 @@ 'mixins': [ 'has_native_resultdb_integration', 'isolate_profile_data', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -5439,7 +5439,7 @@ 'mixins': [ 'has_native_resultdb_integration', 'isolate_profile_data', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -5910,7 +5910,7 @@ 'WebRTC Chromium Mac Tester': { 'mixins': [ 'chromium-webrtc-rel-mac', - 'mac_11_or_12_x64', + 'mac_12_x64', ], 'test_suites': { 'gtest_tests': 'webrtc_chromium_tests_with_baremetal_tests', @@ -6003,7 +6003,7 @@ }, 'WebRTC Chromium FYI Mac Tester': { 'mixins': [ - 'mac_11_or_12_x64', + 'mac_12_x64', ], 'test_suites': { 'gtest_tests': 'webrtc_chromium_gtests', @@ -6031,7 +6031,7 @@ 'WebRTC Chromium FYI ios-simulator': { 'mixins': [ 'has_native_resultdb_integration', - 'mac_11_or_12_x64', + 'mac_12_x64', 'mac_toolchain', 'out_dir_arg', 'xcode_13_main', @@ -6432,7 +6432,7 @@ 'mac-arm64-finch-smoke-chrome': { 'mixins': [ 'chrome-finch-swarming-pool', - 'mac_11_or_12_arm64', + 'mac_12_arm64', ], 'test_suites': { 'isolated_scripts': 'chrome_finch_smoke_tests', @@ -6526,7 +6526,7 @@ }, 'mac12.0.arm64-blink-rel': { 'mixins': [ - 'mac_12_beta_arm64', + 'mac_12_arm64', ], 'test_suites': { 'isolated_scripts': 'chromium_webkit_isolated_scripts',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 5f14e4e..4cf3376 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1884,26 +1884,6 @@ ] } ], - "BlinkAhoCorasickForAttributeSelectors": [ - { - "platforms": [ - "android", - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SubstringSetTreeForAttributeBuckets" - ] - } - ] - } - ], "BlinkSchedulerPrioritizeRenderingAfterInput": [ { "platforms": [ @@ -6070,7 +6050,8 @@ "PrefixSuggestIgnoreDuplicateVisits": "true", "ShortBookmarkSuggestionsByTotalInputLengthThreshold": "3", "UIMaxAutocompleteMatches": "8", - "ZeroSuggestCacheDurationSec": "0" + "ZeroSuggestCacheDurationSec": "0", + "ZeroSuggestIgnoreDuplicateVisits": "false" }, "enable_features": [ "LocalHistorySuggestRevamp", @@ -8164,6 +8145,26 @@ ] } ], + "SubstringSetTreeForAttributeBuckets": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "SubstringSetTreeForAttributeBuckets" + ] + } + ] + } + ], "SuggestionAnswerColorReverse": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 46db811..cd5b469 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -35,7 +35,7 @@ // Allows pages with DedicatedWorker to stay eligible for the back/forward // cache. const base::Feature kBackForwardCacheDedicatedWorker{ - "BackForwardCacheDedicatedWorker", base::FEATURE_DISABLED_BY_DEFAULT}; + "BackForwardCacheDedicatedWorker", base::FEATURE_ENABLED_BY_DEFAULT}; // Enable intervention for download that was initiated from or occurred in an ad // frame without user activation. @@ -1533,5 +1533,8 @@ const base::Feature kTimedHTMLParserBudget{"TimedHTMLParserBudget", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kCSSOverflowForReplacedElements{ + "CSSOverflowForReplacedElements", base::FEATURE_ENABLED_BY_DEFAULT}; + } // namespace features } // namespace blink
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 0d252408..79cbf9aa 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -791,6 +791,10 @@ // rather than token count. BLINK_COMMON_EXPORT extern const base::Feature kTimedHTMLParserBudget; +// This flag is meant to be a temporary kill switch to disable +// CSSOverflowForReplacedElements, if necessary, due to compat issues. +BLINK_COMMON_EXPORT extern const base::Feature kCSSOverflowForReplacedElements; + } // namespace features } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc index ad6aa74..8827e869 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -339,7 +339,8 @@ // like regular filters do, so they can still be composited. break; case CSSPropertyID::kBackgroundColor: - case CSSPropertyID::kBoxShadow: { + case CSSPropertyID::kBoxShadow: + case CSSPropertyID::kClipPath: { NativePaintImageGenerator* generator = nullptr; // Not having a layout object is a reason for not compositing marked // in CompositorAnimations::CheckCanStartElementOnCompositor. @@ -359,6 +360,13 @@ generator = target_element.GetDocument() .GetFrame() ->GetBoxShadowPaintImageGenerator(); + } else if (property.GetCSSProperty().PropertyID() == + CSSPropertyID::kClipPath && + RuntimeEnabledFeatures:: + CompositeClipPathAnimationEnabled()) { + generator = target_element.GetDocument() + .GetFrame() + ->GetClipPathPaintImageGenerator(); } Animation* compositable_animation = nullptr; @@ -374,27 +382,6 @@ } break; } - case CSSPropertyID::kClipPath: { - Animation* compositable_animation = nullptr; - if (RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled()) { - ClipPathPaintImageGenerator* generator = - target_element.GetDocument() - .GetFrame() - ->GetClipPathPaintImageGenerator(); - // TODO(crbug.com/686074): The generator may be null in tests. - // Fix and remove this test-only branch. - if (generator) { - compositable_animation = - generator->GetAnimationIfCompositable(&target_element); - } - } - if (!RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled() || - !compositable_animation) { - DefaultToUnsupportedProperty(unsupported_properties, property, - &reasons); - } - break; - } case CSSPropertyID::kVariable: { // Custom properties are supported only in the case of // OffMainThreadCSSPaintEnabled, and even then only for some specific
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc index f1ee97a..3cacbe4 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc
@@ -98,7 +98,9 @@ : start_offset_(start), end_offset_(end), shape_result_(shape_result), - layout_object_(other.layout_object_), + // Use atomic construction to allow for concurrently marking NGInlineItem. + layout_object_(other.layout_object_, + Member<LayoutObject>::AtomicInitializerTag{}), type_(other.type_), text_type_(other.text_type_), style_variant_(other.style_variant_),
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc index ace1cff..e402c063 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc
@@ -62,6 +62,18 @@ return media::SampleFormatToBitsPerChannel(media::kSampleFormatS16); } +bool IsProcessingAllowedForSampleRatesNotDivisibleBy100( + mojom::blink::MediaStreamType stream_type) { +#if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION) + if (media::IsChromeWideEchoCancellationEnabled() && + stream_type == mojom::blink::MediaStreamType::DEVICE_AUDIO_CAPTURE) { + // When audio processing is performed in the audio process, an experiment + // parameter determines which sample rates are supported. + return media::kChromeWideEchoCancellationAllowAllSampleRates.Get(); + } +#endif + return true; +} // This class encapsulates two values that together build up the score of each // processed candidate. // - Fitness, similarly defined by the W3C specification @@ -1151,11 +1163,11 @@ is_reconfiguration_allowed)); // TODO(https://crbug.com/1332484): Sample rates not divisible by 100 are // not reliably supported due to the common assumption that sample_rate/100 - // corresponds to 10 ms of audio. This needs to be addressed in order to - // support these rates for WebRTC audio processing in the audio process. + // corresponds to 10 ms of audio. When that is addressed, this + // ApmProcessedContainer can be added to |processing_based_containers_| + // unconditionally. if ((device_parameters_.sample_rate() % 100 == 0) || - !(media::IsChromeWideEchoCancellationEnabled() && - stream_type == mojom::blink::MediaStreamType::DEVICE_AUDIO_CAPTURE)) { + IsProcessingAllowedForSampleRatesNotDivisibleBy100(stream_type)) { processing_based_containers_.push_back( ProcessingBasedContainer::CreateApmProcessedContainer( source_info, stream_type, is_device_capture, device_parameters_,
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc index 7e54112..f25c5b84 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
@@ -2122,30 +2122,53 @@ EXPECT_TRUE(result.HasValue()); } -// TODO(https://crbug.com/1332484): Support sample rates not divisible by 100 in -// the audio service. -TEST_P(MediaStreamConstraintsRemoteAPMTest, - NonDivisibleSampleRatesAreNotSupportedInAudioService) { - SCOPED_TRACE(GetMessageForScopedTrace()); +#if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION) +class MediaStreamConstraintsRemoteAPMSampleRateRestrictionTest + : public MediaStreamConstraintsUtilAudioTestBase, + public testing::WithParamInterface<bool> { + protected: + bool AllowAllSampleRates() { return GetParam(); } - const std::string k22050HzDeviceId = "22050hz_device"; - capabilities_.emplace_back( - k22050HzDeviceId.c_str(), "22050hz_fake_group", - media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, - media::CHANNEL_LAYOUT_STEREO, 22050, 1000)); + private: + void SetUp() override { + MediaStreamConstraintsUtilAudioTestBase::SetUp(); - ResetFactory(); - constraint_factory_.basic().device_id.SetExact(k22050HzDeviceId.c_str()); + scoped_feature_list_.InitAndEnableFeatureWithParameters( + media::kChromeWideEchoCancellation, + {{"allow_all_sample_rates", AllowAllSampleRates() ? "true" : "false"}}); + + // Setup the capabilities with a prohibited sample rate. + ResetFactory(); + constexpr int kNondivisibleSampleRateHz = 22050; + const std::string k22050HzDeviceId = "22050hz_device"; + capabilities_.emplace_back( + k22050HzDeviceId.c_str(), "22050hz_fake_group", + media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, + kNondivisibleSampleRateHz, 1000)); + default_device_ = &capabilities_[0]; + } + + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_P(MediaStreamConstraintsRemoteAPMSampleRateRestrictionTest, + ToggleNondivisibleSampleRatesParameter) { + SCOPED_TRACE(testing::Message() + << "allow_all_sample_rates=" << AllowAllSampleRates()); + constraint_factory_.basic().echo_cancellation.SetExact(true); AudioCaptureSettings result = SelectSettings(); - // Audio processing is only supported when APM runs in the renderer. - if (GetApmLocation() == ApmLocation::kProcessedLocalAudioSource) - EXPECT_TRUE(result.HasValue()); - else - EXPECT_FALSE(result.HasValue()); + EXPECT_EQ(result.HasValue(), AllowAllSampleRates()); } +INSTANTIATE_TEST_SUITE_P( + All, + MediaStreamConstraintsRemoteAPMSampleRateRestrictionTest, + testing::Bool()); +#endif + TEST_P(MediaStreamConstraintsUtilAudioTest, LatencyConstraint) { if (!IsDeviceCapture()) return;
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl index d2806645..862a031 100644 --- a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl +++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl
@@ -3,7 +3,8 @@ // found in the LICENSE file. [ - Exposed=SharedStorage + RuntimeEnabled=SharedStorageAPI, + Exposed=(Window) ] interface SharedStorageWorklet { [ CallWith=ScriptState,
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc index 012d410..9dc6930 100644 --- a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc +++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc
@@ -395,6 +395,9 @@ } } + yuv_frame_->metadata().transformation = ImageOrientationToVideoTransformation( + decoder_->Orientation().Orientation()); + if (gfx_cs.IsValid()) { yuv_frame_->set_color_space(YUVColorSpaceToGfxColorSpace( skyuv_cs, gfx_cs.GetPrimaryID(), gfx_cs.GetTransferID()));
diff --git a/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md b/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md index 7a12c94..814ff42 100644 --- a/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md +++ b/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md
@@ -3,7 +3,7 @@ Runtime flags enable Blink developers the ability to control access Chromium users have to new features they implement. Features that are hidden behind a runtime flag are known as Runtime Enabled Features. It is a requirement of the Blink Launch Process to implement new web exposed features behind a runtime flag until an Intent To Ship has been approved. ## Adding A Runtime Enabled Feature -Runtime Enabled Features are defined in runtime_enabled_features.json5 in alphabetical order. Add your feature's flag to this file and the rest will be generated for you automatically. +Runtime Enabled Features are defined in runtime_enabled_features.json5 in alphabetical order. Add your feature's flag to [runtime_enabled_features.json5] and the rest will be generated for you automatically. Example: ```js
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index 8ebe83af..e2d29c3 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -85,8 +85,6 @@ size_(size), snapshot_state_(kInitialSnapshotState), resource_host_(nullptr), - random_generator_((uint32_t)base::RandUint64()), - bernoulli_distribution_(kRasterMetricProbability), last_recording_(nullptr) { // Used by browser tests to detect the use of a Canvas2DLayerBridge. TRACE_EVENT_INSTANT0("test_gpu", "Canvas2DLayerBridgeCreation", @@ -553,8 +551,9 @@ // We are using @dont_use_idle_scheduling_for_testing_ temporarily to always // measure while testing. - const bool will_measure = dont_use_idle_scheduling_for_testing_ || - bernoulli_distribution_(random_generator_); + const bool will_measure = + dont_use_idle_scheduling_for_testing_ || + metrics_subsampler_.ShouldSample(kRasterMetricProbability); const bool measure_raster_metric = (raster_interface || !IsAccelerated()) && will_measure;
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h index 1edd389..2494d64f 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h
@@ -27,12 +27,12 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CANVAS_2D_LAYER_BRIDGE_H_ #include <memory> -#include <random> #include <utility> #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/numerics/checked_math.h" +#include "base/rand_util.h" #include "base/time/time.h" #include "build/build_config.h" #include "cc/layers/texture_layer_client.h" @@ -223,9 +223,7 @@ // For measuring a sample of frames for end-to-end raster time // Every frame has a 1% chance of being sampled static constexpr float kRasterMetricProbability = 0.01; - - std::mt19937 random_generator_; - std::bernoulli_distribution bernoulli_distribution_; + base::MetricsSubSampler metrics_subsampler_; Deque<RasterTimer> pending_raster_timers_; sk_sp<cc::PaintRecord> last_recording_;
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 1816e49..cd83e2f8 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1470,7 +1470,7 @@ crbug.com/1240236 external/wpt/css/css-fonts/system-ui-ja.html [ Failure ] crbug.com/1240236 external/wpt/css/css-fonts/system-ui-ur-vs-ar.html [ Failure ] crbug.com/1240236 external/wpt/css/css-fonts/system-ui-zh.html [ Failure ] -crbug.com/1269537 fast/css-generated-content/quotes-lang.html [ Failure Pass ] +crbug.com/1269537 [ Mac ] fast/css-generated-content/quotes-lang.html [ Failure Pass ] crbug.com/1317062 external/wpt/html/rendering/non-replaced-elements/phrasing-content-0/br-wbr-content/content-property.tentative.html [ Failure ] @@ -6277,8 +6277,6 @@ crbug.com/1249176 [ Mac12-arm64 ] external/wpt/resource-timing/nested-context-navigations-embed.html [ Failure Pass ] crbug.com/1249176 [ Mac11-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Failure Pass Timeout ] crbug.com/1249176 [ Mac12-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Failure Pass Timeout ] -crbug.com/1249176 [ Mac11-arm64 ] media/controls/overflow-menu-always-visible.html [ Failure Pass ] -crbug.com/1249176 [ Mac12-arm64 ] media/controls/overflow-menu-always-visible.html [ Failure Pass ] crbug.com/1249176 [ Mac11-arm64 ] paint/markers/document-markers-font-8px.html [ Failure Pass ] crbug.com/1249176 [ Mac12-arm64 ] paint/markers/document-markers-font-8px.html [ Failure Pass ] crbug.com/1249176 [ Mac11-arm64 ] paint/markers/document-markers-zoom-2000.html [ Failure Pass ] @@ -7078,9 +7076,6 @@ crbug.com/1229084 [ Linux ] external/wpt/storage-access-api/requestStorageAccess.sub.window.html [ Failure Pass ] crbug.com/1229084 [ Win ] external/wpt/storage-access-api/requestStorageAccess.sub.window.html [ Failure Pass ] -# Sheriff 2022-06-09 -crbug.com/1335002 [ Linux ] external/wpt/event-timing/first-input-interactionid-tap.html [ Skip ] - # Flaky on multiple platforms crbug.com/1277696 fast/loader/reload-zero-byte-plugin.html [ Failure Pass ] @@ -7167,4 +7162,5 @@ # Sheriff 2022-07-07 crbug.com/1339538 [ Mac ] fast/frames/002.html [ Failure Pass ] -crbug.com/1339538 [ Linux ] fast/frames/002.html [ Failure Pass ] \ No newline at end of file +crbug.com/1339538 [ Linux ] fast/frames/002.html [ Failure Pass ] +crbug.com/1097040 media/controls/overflow-menu-always-visible.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-tap.html b/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-click.html similarity index 81% rename from third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-tap.html rename to third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-click.html index c5c6f51..7295e35b 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-tap.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-click.html
@@ -1,13 +1,11 @@ <!DOCTYPE html> <html> <meta charset=utf-8 /> -<meta name="timeout" content="long"> -<title>Event Timing: first-input-interactionId-tap.</title> -<button id='test'>Tap</button> +<title>First Input: interactionId-click.</title> +<button id='testButtonId'>Click me</button> <script src=/resources/testharness.js></script> <script src=/resources/testharnessreport.js></script> <script src=/resources/testdriver.js></script> -<script src=/resources/testdriver-actions.js></script> <script src=/resources/testdriver-vendor.js></script> <script src=resources/event-timing-test-utils.js></script> @@ -49,8 +47,8 @@ } })).observe({ entryTypes: ["event", "first-input"] }); - addListenersAndTap(document.getElementById('test'), ['pointerdown', 'pointerup']); - }, "Event Timing: The interactionId of first input should match the event timing pointerdown entry when tap."); + addListenersAndClick(document.getElementById('testButtonId')); + }, "The interactionId of the first input entry should match the same pointerdown entry of event timing when click."); </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html b/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html index a43f9a2..f0d32e6 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html +++ b/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html
@@ -11,18 +11,7 @@ <script> let observedEntries = []; let map = new Map(); - async function clickOnElement(id) { - const element = document.getElementById(id); - const clickHandler = () => { - mainThreadBusy(200); - }; - element.addEventListener("mousedown", clickHandler); - element.addEventListener("mouseup", clickHandler); - element.addEventListener("pointerdown", clickHandler); - element.addEventListener("pointerup", clickHandler); - element.addEventListener("click", clickHandler); - await test_driver.click(element); - } + function eventsForCheck(entry) { if (entry.name === 'pointerdown' || entry.name === 'pointerup' || entry.name === 'click' || entry.name === 'mousedown' || entry.name === 'mouseup') { @@ -44,7 +33,7 @@ assert_equals(map.get('pointerdown'), map.get('click'), 'Pointerdown and click should have the same interactionId'); t.done(); })).observe({type: 'event'}); - clickOnElement('button'); + addListenersAndClick(document.getElementById('button')); }, "Event Timing: compare event timing interactionId."); </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js index c549e7e..f60bfb21 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js +++ b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
@@ -314,6 +314,13 @@ pressKey(element, key); } +// The testdriver.js, testdriver-vendor.js need to be included to use this +// function. +async function addListenersAndClick(element) { + addListeners(element, ['mousedown', 'mouseup', 'pointerdown', 'pointerup', 'click']); + await test_driver.click(element); +} + function filterAndAddToMap(events, map) { return function (entry) { if (events.includes(entry.name)) {
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/README.md b/third_party/blink/web_tests/external/wpt/webcodecs/README.md index 8d8d0012..637169a3 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/README.md +++ b/third_party/blink/web_tests/external/wpt/webcodecs/README.md
@@ -79,7 +79,10 @@ ### four-colors-limited-range-420-8bpc.jpg Used [Sqoosh.app](https://squoosh.app/) with MozJPEG compression and YUV -channels. +channels. exiftool was then used to add an orientation marker. +``` +exiftool -Orientation=1 -n four-colors-limited-range-420-8bpc.jpg +``` ### four-colors.mp4 Used a [custom tool](https://storage.googleapis.com/dalecurtis/avif2mp4.html) to convert four-colors.avif into a .mp4 file.
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg b/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg index d3893b06..9ce1f1a 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg +++ b/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html index 9c4e91bb..2e555dbe 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html +++ b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html
@@ -1,3 +1,4 @@ +<!DOCTYPE html> <title>Test ImageDecoder outputs to a image-orientation: none canvas.</title> <canvas style="image-orientation: none"></canvas> <script src="/resources/testharness.js"></script> @@ -43,4 +44,45 @@ return testFourColorDecodeWithExifOrientation( 8, document.querySelector('canvas')); }, 'Test JPEG w/ EXIF orientation left-bottom on canvas w/o orientation.'); + +// YUV tests +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 1, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation top-left on canvas w/o orientation'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 2, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation top-right on canvas w/o orientation.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 3, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-right on canvas w/o orientation.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 4, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-left on canvas w/o orientation.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 5, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation left-top on canvas w/o orientation.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 6, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation right-top on canvas w/o orientation.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 7, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation right-bottom on canvas w/o orientation.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation( + 8, document.querySelector('canvas'), /*useYuv=*/true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation left-bottom on canvas w/o orientation.'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js index 548ace0..eccab9b 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js +++ b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js
@@ -3,7 +3,7 @@ const kBlue = 0x0000FFFF; const kGreen = 0x00FF00FF; -function getColorName (color) { +function getColorName(color) { switch (color) { case kYellow: return "Yellow"; @@ -17,8 +17,20 @@ return "#" + color.toString(16); } -function toUInt32(pixelArray) { +function toUInt32(pixelArray, roundForYuv) { let p = pixelArray.data; + + // YUV to RGB conversion introduces some loss, so provide some leeway. + if (roundForYuv) { + const tolerance = 3; + for (var i = 0; i < p.length; ++i) { + if (p[i] >= 0xFF - tolerance) + p[i] = 0xFF; + if (p[i] <= 0x00 + tolerance) + p[i] = 0x00; + } + } + return ((p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]) >>> 0; } @@ -74,17 +86,20 @@ }); } -function testFourColorDecodeWithExifOrientation(orientation, canvas) { +function testFourColorDecodeWithExifOrientation(orientation, canvas, useYuv) { return ImageDecoder.isTypeSupported('image/jpeg').then(support => { assert_implements_optional( support, 'Optional codec image/jpeg not supported.'); - return fetch('four-colors.jpg') + const testFile = + useYuv ? 'four-colors-limited-range-420-8bpc.jpg' : 'four-colors.jpg'; + return fetch(testFile) .then(response => { return response.arrayBuffer(); }) .then(buffer => { let u8buffer = new Uint8Array(buffer); - u8buffer[0x1F] = orientation; // Location derived via diff. + u8buffer[useYuv ? 0x31 : 0x1F] = + orientation; // Location derived via diff. let decoder = new ImageDecoder({data: u8buffer, type: 'image/jpeg'}); return decoder.decode(); }) @@ -155,12 +170,13 @@ }; } - verifyFourColorsImage(expectedWidth, expectedHeight, ctx, matrix); + verifyFourColorsImage( + expectedWidth, expectedHeight, ctx, matrix, useYuv); }); }); } -function verifyFourColorsImage(width, height, ctx, matrix) { +function verifyFourColorsImage(width, height, ctx, matrix, isYuv) { if (!matrix) { matrix = [ [kYellow, kRed], @@ -173,10 +189,11 @@ let expectedBottomLeft = matrix[1][0]; let expectedBottomRight = matrix[1][1]; - let topLeft = toUInt32(ctx.getImageData(0, 0, 1, 1)); - let topRight = toUInt32(ctx.getImageData(width - 1, 0, 1, 1)); - let bottomLeft = toUInt32(ctx.getImageData(0, height - 1, 1, 1)); - let bottomRight = toUInt32(ctx.getImageData(width - 1, height - 1, 1, 1)); + let topLeft = toUInt32(ctx.getImageData(0, 0, 1, 1), isYuv); + let topRight = toUInt32(ctx.getImageData(width - 1, 0, 1, 1), isYuv); + let bottomLeft = toUInt32(ctx.getImageData(0, height - 1, 1, 1), isYuv); + let bottomRight = + toUInt32(ctx.getImageData(width - 1, height - 1, 1, 1), isYuv); assert_equals(getColorName(topLeft), getColorName(expectedTopLeft), 'top left corner');
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js index 876a591d..3ae50a5 100644 --- a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js +++ b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js
@@ -64,6 +64,39 @@ }, 'Test JPEG w/ EXIF orientation left-bottom.'); promise_test(t => { + return testFourColorDecodeWithExifOrientation(1, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation top-left.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation(2, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation top-right.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation(3, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-right.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation(4, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-left.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation(5, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation left-top.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation(6, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation right-top.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation(7, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation right-bottom.'); + +promise_test(t => { + return testFourColorDecodeWithExifOrientation(8, null, /*useYuv=*/ true); +}, 'Test 4:2:0 JPEG w/ EXIF orientation left-bottom.'); + + +promise_test(t => { return testFourColorsDecode('four-colors.png', 'image/png'); }, 'Test PNG image decoding.');
diff --git a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html index 3417d15..1917237 100644 --- a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html +++ b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html
@@ -1,156 +1,66 @@ <!DOCTYPE html> <meta charset="utf-8"> <style> - /* This css is from http://www.whatwg.org/specs/web-apps/current-work/multipage/rendering.html#quotes */ + /* + This css is built using the International Components for Unicode (ICU) + See here for list of languages supported by Chrome: https://docs.google.com/document/d/1iOMXwI4MriHgHEtGm3n2c7s8_XfBUkmwtQ9uDIk2Bww/edit + */ - :root:lang(af), :not(:lang(af)) > :lang(af) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(agq), :not(:lang(agq)) > :lang(agq) { quotes: '\201e' '\201d' '\201a' '\2019' } /* „ ” ‚ ’ */ - :root:lang(ak), :not(:lang(ak)) > :lang(ak) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(am), :not(:lang(am)) > :lang(am) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ :root:lang(ar), :not(:lang(ar)) > :lang(ar) { quotes: '\201d' '\201c' '\2019' '\2018' } /* ” “ ’ ‘ */ - :root:lang(asa), :not(:lang(asa)) > :lang(asa) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(az-Cyrl), :not(:lang(az-Cyrl)) > :lang(az-Cyrl) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ - :root:lang(bas), :not(:lang(bas)) > :lang(bas) { quotes: '\00ab' '\00bb' '\201e' '\201c' } /* « » „ “ */ - :root:lang(bem), :not(:lang(bem)) > :lang(bem) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(bez), :not(:lang(bez)) > :lang(bez) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(bg), :not(:lang(bg)) > :lang(bg) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ - :root:lang(bm), :not(:lang(bm)) > :lang(bm) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ + :root:lang(bg), :not(:lang(bg)) > :lang(bg) { quotes: '\201e' '\201c' '\201e' '\201c' } /* „ “ „ “ */ :root:lang(bn), :not(:lang(bn)) > :lang(bn) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(br), :not(:lang(br)) > :lang(br) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ - :root:lang(brx), :not(:lang(brx)) > :lang(brx) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(bs-Cyrl), :not(:lang(bs-Cyrl)) > :lang(bs-Cyrl) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ - :root:lang(ca), :not(:lang(ca)) > :lang(ca) { quotes: '\201c' '\201d' '\00ab' '\00bb' } /* “ ” « » */ - :root:lang(cgg), :not(:lang(cgg)) > :lang(cgg) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(chr), :not(:lang(chr)) > :lang(chr) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ + :root:lang(ca), :not(:lang(ca)) > :lang(ca) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ :root:lang(cs), :not(:lang(cs)) > :lang(cs) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ :root:lang(da), :not(:lang(da)) > :lang(da) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(dav), :not(:lang(dav)) > :lang(dav) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(de), :not(:lang(de)) > :lang(de) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ - :root:lang(de-CH), :not(:lang(de-CH)) > :lang(de-CH) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ - :root:lang(dje), :not(:lang(dje)) > :lang(dje) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(dua), :not(:lang(dua)) > :lang(dua) { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */ - :root:lang(dyo), :not(:lang(dyo)) > :lang(dyo) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ - :root:lang(dz), :not(:lang(dz)) > :lang(dz) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ebu), :not(:lang(ebu)) > :lang(ebu) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ee), :not(:lang(ee)) > :lang(ee) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ + :root:lang(de-CH), :not(:lang(de-CH)) > :lang(de-CH) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ :root:lang(el), :not(:lang(el)) > :lang(el) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ :root:lang(en), :not(:lang(en)) > :lang(en) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(en-GB), :not(:lang(en-GB)) > :lang(en-GB) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(es), :not(:lang(es)) > :lang(es) { quotes: '\201c' '\201d' '\00ab' '\00bb' } /* “ ” « » */ + :root:lang(es), :not(:lang(es)) > :lang(es) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* “ ” « » */ :root:lang(et), :not(:lang(et)) > :lang(et) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ - :root:lang(eu), :not(:lang(eu)) > :lang(eu) { quotes: '\201c' '\201d' '\00ab' '\00bb' } /* “ ” « » */ - :root:lang(ewo), :not(:lang(ewo)) > :lang(ewo) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ :root:lang(fa), :not(:lang(fa)) > :lang(fa) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ - :root:lang(ff), :not(:lang(ff)) > :lang(ff) { quotes: '\201e' '\201d' '\201a' '\2019' } /* „ ” ‚ ’ */ + :root:lang(fil), :not(:lang(fil)) > :lang(fil) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(fi), :not(:lang(fi)) > :lang(fi) { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */ :root:lang(fr), :not(:lang(fr)) > :lang(fr) { quotes: '\00ab' '\00bb' '\00ab' '\00bb' } /* « » « » */ - :root:lang(fr-CA), :not(:lang(fr-CA)) > :lang(fr-CA) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ + :root:lang(fr-CA), :not(:lang(fr-CA)) > :lang(fr-CA) { quotes: '\00ab' '\00bb' '\201d' '\201c' } /* « » ” “ */ :root:lang(fr-CH), :not(:lang(fr-CH)) > :lang(fr-CH) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ - :root:lang(gsw), :not(:lang(gsw)) > :lang(gsw) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ :root:lang(gu), :not(:lang(gu)) > :lang(gu) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(guz), :not(:lang(guz)) > :lang(guz) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ha), :not(:lang(ha)) > :lang(ha) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(he), :not(:lang(he)) > :lang(he) { quotes: '\0022' '\0022' '\0027' '\0027' } /* " " ' ' */ :root:lang(hi), :not(:lang(hi)) > :lang(hi) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(hr), :not(:lang(hr)) > :lang(hr) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ :root:lang(hu), :not(:lang(hu)) > :lang(hu) { quotes: '\201e' '\201d' '\00bb' '\00ab' } /* „ ” » « */ :root:lang(id), :not(:lang(id)) > :lang(id) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ig), :not(:lang(ig)) > :lang(ig) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(it), :not(:lang(it)) > :lang(it) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ :root:lang(ja), :not(:lang(ja)) > :lang(ja) { quotes: '\300c' '\300d' '\300e' '\300f' } /* 「 」 『 』 */ - :root:lang(jgo), :not(:lang(jgo)) > :lang(jgo) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ - :root:lang(jmc), :not(:lang(jmc)) > :lang(jmc) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(kab), :not(:lang(kab)) > :lang(kab) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ - :root:lang(kam), :not(:lang(kam)) > :lang(kam) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(kde), :not(:lang(kde)) > :lang(kde) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(kea), :not(:lang(kea)) > :lang(kea) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(khq), :not(:lang(khq)) > :lang(khq) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ki), :not(:lang(ki)) > :lang(ki) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(kkj), :not(:lang(kkj)) > :lang(kkj) { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */ - :root:lang(kln), :not(:lang(kln)) > :lang(kln) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(km), :not(:lang(km)) > :lang(km) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(kn), :not(:lang(kn)) > :lang(kn) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(ko), :not(:lang(ko)) > :lang(ko) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ksb), :not(:lang(ksb)) > :lang(ksb) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ksf), :not(:lang(ksf)) > :lang(ksf) { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */ - :root:lang(lag), :not(:lang(lag)) > :lang(lag) { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */ - :root:lang(lg), :not(:lang(lg)) > :lang(lg) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ln), :not(:lang(ln)) > :lang(ln) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(lo), :not(:lang(lo)) > :lang(lo) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(lt), :not(:lang(lt)) > :lang(lt) { quotes: '\201e' '\201c' '\201e' '\201c' } /* „ “ „ “ */ - :root:lang(lu), :not(:lang(lu)) > :lang(lu) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(luo), :not(:lang(luo)) > :lang(luo) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(luy), :not(:lang(luy)) > :lang(luy) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ :root:lang(lv), :not(:lang(lv)) > :lang(lv) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(mas), :not(:lang(mas)) > :lang(mas) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(mer), :not(:lang(mer)) > :lang(mer) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(mfe), :not(:lang(mfe)) > :lang(mfe) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(mg), :not(:lang(mg)) > :lang(mg) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ - :root:lang(mgo), :not(:lang(mgo)) > :lang(mgo) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(mk), :not(:lang(mk)) > :lang(mk) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ :root:lang(ml), :not(:lang(ml)) > :lang(ml) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(mr), :not(:lang(mr)) > :lang(mr) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(ms), :not(:lang(ms)) > :lang(ms) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(mua), :not(:lang(mua)) > :lang(mua) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ - :root:lang(my), :not(:lang(my)) > :lang(my) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(naq), :not(:lang(naq)) > :lang(naq) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(nb), :not(:lang(nb)) > :lang(nb) { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */ - :root:lang(nd), :not(:lang(nd)) > :lang(nd) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(nl), :not(:lang(nl)) > :lang(nl) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(nmg), :not(:lang(nmg)) > :lang(nmg) { quotes: '\201e' '\201d' '\00ab' '\00bb' } /* „ ” « » */ - :root:lang(nn), :not(:lang(nn)) > :lang(nn) { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */ - :root:lang(nnh), :not(:lang(nnh)) > :lang(nnh) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ - :root:lang(nus), :not(:lang(nus)) > :lang(nus) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(nyn), :not(:lang(nyn)) > :lang(nyn) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ + :root:lang(nl), :not(:lang(nl)) > :lang(nl) { quotes: '\2018' '\2019' '\2018' '\2019' } /* ‘ ’ ‘ ’ */ + :root:lang(no), :not(:lang(no)) > :lang(no) { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */ :root:lang(pl), :not(:lang(pl)) > :lang(pl) { quotes: '\201e' '\201d' '\00ab' '\00bb' } /* „ ” « » */ :root:lang(pt), :not(:lang(pt)) > :lang(pt) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(pt-PT), :not(:lang(pt-PT)) > :lang(pt-PT) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ - :root:lang(rn), :not(:lang(rn)) > :lang(rn) { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */ :root:lang(ro), :not(:lang(ro)) > :lang(ro) { quotes: '\201e' '\201d' '\00ab' '\00bb' } /* „ ” « » */ - :root:lang(rof), :not(:lang(rof)) > :lang(rof) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(ru), :not(:lang(ru)) > :lang(ru) { quotes: '\00ab' '\00bb' '\201e' '\201c' } /* « » „ “ */ - :root:lang(rw), :not(:lang(rw)) > :lang(rw) { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */ - :root:lang(rwk), :not(:lang(rwk)) > :lang(rwk) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(saq), :not(:lang(saq)) > :lang(saq) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(sbp), :not(:lang(sbp)) > :lang(sbp) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(seh), :not(:lang(seh)) > :lang(seh) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ses), :not(:lang(ses)) > :lang(ses) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(sg), :not(:lang(sg)) > :lang(sg) { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */ - :root:lang(shi), :not(:lang(shi)) > :lang(shi) { quotes: '\00ab' '\00bb' '\201e' '\201d' } /* « » „ ” */ - :root:lang(shi-Tfng), :not(:lang(shi-Tfng)) > :lang(shi-Tfng) { quotes: '\00ab' '\00bb' '\201e' '\201d' } /* « » „ ” */ - :root:lang(si), :not(:lang(si)) > :lang(si) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(sk), :not(:lang(sk)) > :lang(sk) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ :root:lang(sl), :not(:lang(sl)) > :lang(sl) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ - :root:lang(sn), :not(:lang(sn)) > :lang(sn) { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */ - :root:lang(so), :not(:lang(so)) > :lang(so) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(sq), :not(:lang(sq)) > :lang(sq) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ - :root:lang(sr), :not(:lang(sr)) > :lang(sr) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ - :root:lang(sr-Latn), :not(:lang(sr-Latn)) > :lang(sr-Latn) { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */ + :root:lang(sr), :not(:lang(sr)) > :lang(sr) { quotes: '\201e' '\201c' '\2018' '\2018' } /* „ “ ‘ ‘ */ + :root:lang(sr-Latn), :not(:lang(sr-Latn)) > :lang(sr-Latn) { quotes: '\201e' '\201c' '\2018' '\2018' } /* „ “ ‘ ‘ */ :root:lang(sv), :not(:lang(sv)) > :lang(sv) { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */ :root:lang(sw), :not(:lang(sw)) > :lang(sw) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(swc), :not(:lang(swc)) > :lang(swc) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(ta), :not(:lang(ta)) > :lang(ta) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(te), :not(:lang(te)) > :lang(te) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(teo), :not(:lang(teo)) > :lang(teo) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(th), :not(:lang(th)) > :lang(th) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(ti-ER), :not(:lang(ti-ER)) > :lang(ti-ER) { quotes: '\2018' '\2019' '\201c' '\201d' } /* ‘ ’ “ ” */ - :root:lang(to), :not(:lang(to)) > :lang(to) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(tr), :not(:lang(tr)) > :lang(tr) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(twq), :not(:lang(twq)) > :lang(twq) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(tzm), :not(:lang(tzm)) > :lang(tzm) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(uk), :not(:lang(uk)) > :lang(uk) { quotes: '\00ab' '\00bb' '\201e' '\201c' } /* « » „ “ */ - :root:lang(ur), :not(:lang(ur)) > :lang(ur) { quotes: '\201d' '\201c' '\2019' '\2018' } /* ” “ ’ ‘ */ - :root:lang(vai), :not(:lang(vai)) > :lang(vai) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(vai-Latn), :not(:lang(vai-Latn)) > :lang(vai-Latn) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(vi), :not(:lang(vi)) > :lang(vi) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(vun), :not(:lang(vun)) > :lang(vun) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(xh), :not(:lang(xh)) > :lang(xh) { quotes: '\2018' '\2019' '\201c' '\201d' } /* ‘ ’ “ ” */ - :root:lang(xog), :not(:lang(xog)) > :lang(xog) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ - :root:lang(yav), :not(:lang(yav)) > :lang(yav) { quotes: '\00ab' '\00bb' '\00ab' '\00bb' } /* « » « » */ - :root:lang(yo), :not(:lang(yo)) > :lang(yo) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(zh), :not(:lang(zh)) > :lang(zh) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ :root:lang(zh-Hant), :not(:lang(zh-Hant)) > :lang(zh-Hant) { quotes: '\300c' '\300d' '\300e' '\300f' } /* 「 」 『 』 */ - :root:lang(zu), :not(:lang(zu)) > :lang(zu) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */ </style> <p> @@ -159,153 +69,60 @@ </p> <!-- Custom quotes are inlined to make this test fail if you don't implement CSS quotes. --> -<div lang="custom">ACcustomDB</div> -<q><q>default</q></q> -<q lang="af"><q>af</q></q> -<q lang="agq"><q>agq</q></q> -<q lang="ak"><q>ak</q></q> -<q lang="am"><q>am</q></q> -<q lang="ar"><q>ar</q></q> -<q lang="asa"><q>asa</q></q> -<q lang="az-Cyrl"><q>az-Cyrl</q></q> -<q lang="bas"><q>bas</q></q> -<q lang="bem"><q>bem</q></q> -<q lang="bez"><q>bez</q></q> -<q lang="bg"><q>bg</q></q> -<q lang="bm"><q>bm</q></q> -<q lang="bn"><q>bn</q></q> -<q lang="br"><q>br</q></q> -<q lang="brx"><q>brx</q></q> -<q lang="bs-Cyrl"><q>bs-Cyrl</q></q> -<q lang="ca"><q>ca</q></q> -<q lang="cgg"><q>cgg</q></q> -<q lang="chr"><q>chr</q></q> -<q lang="cs"><q>cs</q></q> -<q lang="da"><q>da</q></q> -<q lang="dav"><q>dav</q></q> -<q lang="de"><q>de</q></q> -<q lang="de-CH"><q>de-CH</q></q> -<q lang="dje"><q>dje</q></q> -<q lang="dua"><q>dua</q></q> -<q lang="dyo"><q>dyo</q></q> -<q lang="dz"><q>dz</q></q> -<q lang="ebu"><q>ebu</q></q> -<q lang="ee"><q>ee</q></q> -<q lang="el"><q>el</q></q> -<q lang="en"><q>en</q></q> -<q lang="en-GB"><q>en-GB</q></q> -<q lang="es"><q>es</q></q> -<q lang="et"><q>et</q></q> -<q lang="eu"><q>eu</q></q> -<q lang="ewo"><q>ewo</q></q> -<q lang="fa"><q>fa</q></q> -<q lang="ff"><q>ff</q></q> -<q lang="fi"><q>fi</q></q> -<q lang="fr"><q>fr</q></q> -<q lang="fr-CA"><q>fr-CA</q></q> -<q lang="fr-CH"><q>fr-CH</q></q> -<q lang="gsw"><q>gsw</q></q> -<q lang="gu"><q>gu</q></q> -<q lang="guz"><q>guz</q></q> -<q lang="ha"><q>ha</q></q> -<q lang="he"><q>he</q></q> -<q lang="hi"><q>hi</q></q> -<q lang="hr"><q>hr</q></q> -<q lang="hu"><q>hu</q></q> -<q lang="id"><q>id</q></q> -<q lang="ig"><q>ig</q></q> -<q lang="it"><q>it</q></q> -<q lang="ja"><q>ja</q></q> -<q lang="jgo"><q>jgo</q></q> -<q lang="jmc"><q>jmc</q></q> -<q lang="kab"><q>kab</q></q> -<q lang="kam"><q>kam</q></q> -<q lang="kde"><q>kde</q></q> -<q lang="kea"><q>kea</q></q> -<q lang="khq"><q>khq</q></q> -<q lang="ki"><q>ki</q></q> -<q lang="kkj"><q>kkj</q></q> -<q lang="kln"><q>kln</q></q> -<q lang="km"><q>km</q></q> -<q lang="kn"><q>kn</q></q> -<q lang="ko"><q>ko</q></q> -<q lang="ksb"><q>ksb</q></q> -<q lang="ksf"><q>ksf</q></q> -<q lang="lag"><q>lag</q></q> -<q lang="lg"><q>lg</q></q> -<q lang="ln"><q>ln</q></q> -<q lang="lo"><q>lo</q></q> -<q lang="lt"><q>lt</q></q> -<q lang="lu"><q>lu</q></q> -<q lang="luo"><q>luo</q></q> -<q lang="luy"><q>luy</q></q> -<q lang="lv"><q>lv</q></q> -<q lang="mas"><q>mas</q></q> -<q lang="mer"><q>mer</q></q> -<q lang="mfe"><q>mfe</q></q> -<q lang="mg"><q>mg</q></q> -<q lang="mgo"><q>mgo</q></q> -<q lang="mk"><q>mk</q></q> -<q lang="ml"><q>ml</q></q> -<q lang="mr"><q>mr</q></q> -<q lang="ms"><q>ms</q></q> -<q lang="mua"><q>mua</q></q> -<q lang="my"><q>my</q></q> -<q lang="naq"><q>naq</q></q> -<q lang="nb"><q>nb</q></q> -<q lang="nd"><q>nd</q></q> -<q lang="nl"><q>nl</q></q> -<q lang="nmg"><q>nmg</q></q> -<q lang="nn"><q>nn</q></q> -<q lang="nnh"><q>nnh</q></q> -<q lang="nus"><q>nus</q></q> -<q lang="nyn"><q>nyn</q></q> -<q lang="pl"><q>pl</q></q> -<q lang="pt"><q>pt</q></q> -<q lang="pt-PT"><q>pt-PT</q></q> -<q lang="rn"><q>rn</q></q> -<q lang="ro"><q>ro</q></q> -<q lang="rof"><q>rof</q></q> -<q lang="ru"><q>ru</q></q> -<q lang="rw"><q>rw</q></q> -<q lang="rwk"><q>rwk</q></q> -<q lang="saq"><q>saq</q></q> -<q lang="sbp"><q>sbp</q></q> -<q lang="seh"><q>seh</q></q> -<q lang="ses"><q>ses</q></q> -<q lang="sg"><q>sg</q></q> -<q lang="shi"><q>shi</q></q> -<q lang="shi-Tfng"><q>shi-Tfng</q></q> -<q lang="si"><q>si</q></q> -<q lang="sk"><q>sk</q></q> -<q lang="sl"><q>sl</q></q> -<q lang="sn"><q>sn</q></q> -<q lang="so"><q>so</q></q> -<q lang="sq"><q>sq</q></q> -<q lang="sr"><q>sr</q></q> -<q lang="sr-Latn"><q>sr-Latn</q></q> -<q lang="sv"><q>sv</q></q> -<q lang="sw"><q>sw</q></q> -<q lang="swc"><q>swc</q></q> -<q lang="ta"><q>ta</q></q> -<q lang="te"><q>te</q></q> -<q lang="teo"><q>teo</q></q> -<q lang="th"><q>th</q></q> -<q lang="ti-ER"><q>ti-ER</q></q> -<q lang="to"><q>to</q></q> -<q lang="tr"><q>tr</q></q> -<q lang="twq"><q>twq</q></q> -<q lang="tzm"><q>tzm</q></q> -<q lang="uk"><q>uk</q></q> -<q lang="ur"><q>ur</q></q> -<q lang="vai"><q>vai</q></q> -<q lang="vai-Latn"><q>vai-Latn</q></q> -<q lang="vi"><q>vi</q></q> -<q lang="vun"><q>vun</q></q> -<q lang="xh"><q>xh</q></q> -<q lang="xog"><q>xog</q></q> -<q lang="yav"><q>yav</q></q> -<q lang="yo"><q>yo</q></q> -<q lang="zh"><q>zh</q></q> -<q lang="zh-Hant"><q>zh-Hant</q></q> -<q lang="zu"><q>zu</q></q> +<span lang="custom">ACcustomDB</span> +<span><q><q>default</q></q></span> +<span lang="am"><q><q>am</q></q></span> +<span lang="ar"><q><q>ar</q></q></span> +<span lang="bg"><q><q>bg</q></q></span> +<span lang="bn"><q><q>bn</q></q></span> +<span lang="ca"><q><q>ca</q></q></span> +<span lang="cs"><q><q>cs</q></q></span> +<span lang="da"><q><q>da</q></q></span> +<span lang="de"><q><q>de</q></q></span> +<span lang="de-CH"><q><q>de-CH</q></q></span> +<span lang="el"><q><q>el</q></q></span> +<span lang="en"><q><q>en</q></q></span> +<span lang="en-GB"><q><q>en-GB</q></q></span> +<span lang="es"><q><q>es</q></q></span> +<span lang="et"><q><q>et</q></q></span> +<span lang="fa"><q><q>fa</q></q></span> +<span lang="fil"><q><q>fil</q></q></span> +<span lang="fi"><q><q>fi</q></q></span> +<span lang="fr"><q><q>fr</q></q></span> +<span lang="fr-CA"><q><q>fr-CA</q></q></span> +<span lang="fr-CH"><q><q>fr-CH</q></q></span> +<span lang="gu"><q><q>gu</q></q></span> +<span lang="hi"><q><q>hi</q></q></span> +<span lang="hu"><q><q>hu</q></q></span> +<span lang="hr"><q><q>hr</q></q></span> +<span lang="id"><q><q>id</q></q></span> +<span lang="it"><q><q>it</q></q></span> +<span lang="ja"><q><q>ja</q></q></span> +<span lang="kn"><q><q>kn</q></q></span> +<span lang="ko"><q><q>ko</q></q></span> +<span lang="lt"><q><q>lt</q></q></span> +<span lang="lv"><q><q>lv</q></q></span> +<span lang="ml"><q><q>ml</q></q></span> +<span lang="mr"><q><q>mr</q></q></span> +<span lang="ms"><q><q>ms</q></q></span> +<span lang="nl"><q><q>nl</q></q></span> +<span lang="no"><q><q>no</q></q></span> +<span lang="pl"><q><q>pl</q></q></span> +<span lang="pt"><q><q>pt</q></q></span> +<span lang="pt-PT"><q><q>pt-PT</q></q></span> +<span lang="ro"><q><q>ro</q></q></span> +<span lang="ru"><q><q>ru</q></q></span> +<span lang="sk"><q><q>sk</q></q></span> +<span lang="sl"><q><q>sl</q></q></span> +<span lang="sr"><q><q>sr</q></q></span> +<span lang="sr-Latn"><q><q>sr-Latn</q></q></span> +<span lang="sv"><q><q>sv</q></q></span> +<span lang="sw"><q><q>sw</q></q></span> +<span lang="ta"><q><q>ta</q></q></span> +<span lang="te"><q><q>te</q></q></span> +<span lang="th"><q><q>th</q></q></span> +<span lang="tr"><q><q>tr</q></q></span> +<span lang="uk"><q><q>uk</q></q></span> +<span lang="vi"><q><q>vi</q></q></span> +<span lang="zh"><q><q>zh</q></q></span> +<span lang="zh-Hant"><q><q>zh-Hant</q></q></span>
diff --git a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html index 4806c8e9..5a9961a 100644 --- a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html +++ b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html
@@ -11,153 +11,60 @@ and not just basic " and ' characters unless no language is specified. </p> -<div lang="custom"><q><q>custom</q></q></div> -<q><q>default</q></q> -<q lang="af"><q>af</q></q> -<q lang="agq"><q>agq</q></q> -<q lang="ak"><q>ak</q></q> -<q lang="am"><q>am</q></q> -<q lang="ar"><q>ar</q></q> -<q lang="asa"><q>asa</q></q> -<q lang="az-Cyrl"><q>az-Cyrl</q></q> -<q lang="bas"><q>bas</q></q> -<q lang="bem"><q>bem</q></q> -<q lang="bez"><q>bez</q></q> -<q lang="bg"><q>bg</q></q> -<q lang="bm"><q>bm</q></q> -<q lang="bn"><q>bn</q></q> -<q lang="br"><q>br</q></q> -<q lang="brx"><q>brx</q></q> -<q lang="bs-Cyrl"><q>bs-Cyrl</q></q> -<q lang="ca"><q>ca</q></q> -<q lang="cgg"><q>cgg</q></q> -<q lang="chr"><q>chr</q></q> -<q lang="cs"><q>cs</q></q> -<q lang="da"><q>da</q></q> -<q lang="dav"><q>dav</q></q> -<q lang="de"><q>de</q></q> -<q lang="de-CH"><q>de-CH</q></q> -<q lang="dje"><q>dje</q></q> -<q lang="dua"><q>dua</q></q> -<q lang="dyo"><q>dyo</q></q> -<q lang="dz"><q>dz</q></q> -<q lang="ebu"><q>ebu</q></q> -<q lang="ee"><q>ee</q></q> -<q lang="el"><q>el</q></q> -<q lang="en"><q>en</q></q> -<q lang="en-GB"><q>en-GB</q></q> -<q lang="es"><q>es</q></q> -<q lang="et"><q>et</q></q> -<q lang="eu"><q>eu</q></q> -<q lang="ewo"><q>ewo</q></q> -<q lang="fa"><q>fa</q></q> -<q lang="ff"><q>ff</q></q> -<q lang="fi"><q>fi</q></q> -<q lang="fr"><q>fr</q></q> -<q lang="fr-CA"><q>fr-CA</q></q> -<q lang="fr-CH"><q>fr-CH</q></q> -<q lang="gsw"><q>gsw</q></q> -<q lang="gu"><q>gu</q></q> -<q lang="guz"><q>guz</q></q> -<q lang="ha"><q>ha</q></q> -<q lang="he"><q>he</q></q> -<q lang="hi"><q>hi</q></q> -<q lang="hr"><q>hr</q></q> -<q lang="hu"><q>hu</q></q> -<q lang="id"><q>id</q></q> -<q lang="ig"><q>ig</q></q> -<q lang="it"><q>it</q></q> -<q lang="ja"><q>ja</q></q> -<q lang="jgo"><q>jgo</q></q> -<q lang="jmc"><q>jmc</q></q> -<q lang="kab"><q>kab</q></q> -<q lang="kam"><q>kam</q></q> -<q lang="kde"><q>kde</q></q> -<q lang="kea"><q>kea</q></q> -<q lang="khq"><q>khq</q></q> -<q lang="ki"><q>ki</q></q> -<q lang="kkj"><q>kkj</q></q> -<q lang="kln"><q>kln</q></q> -<q lang="km"><q>km</q></q> -<q lang="kn"><q>kn</q></q> -<q lang="ko"><q>ko</q></q> -<q lang="ksb"><q>ksb</q></q> -<q lang="ksf"><q>ksf</q></q> -<q lang="lag"><q>lag</q></q> -<q lang="lg"><q>lg</q></q> -<q lang="ln"><q>ln</q></q> -<q lang="lo"><q>lo</q></q> -<q lang="lt"><q>lt</q></q> -<q lang="lu"><q>lu</q></q> -<q lang="luo"><q>luo</q></q> -<q lang="luy"><q>luy</q></q> -<q lang="lv"><q>lv</q></q> -<q lang="mas"><q>mas</q></q> -<q lang="mer"><q>mer</q></q> -<q lang="mfe"><q>mfe</q></q> -<q lang="mg"><q>mg</q></q> -<q lang="mgo"><q>mgo</q></q> -<q lang="mk"><q>mk</q></q> -<q lang="ml"><q>ml</q></q> -<q lang="mr"><q>mr</q></q> -<q lang="ms"><q>ms</q></q> -<q lang="mua"><q>mua</q></q> -<q lang="my"><q>my</q></q> -<q lang="naq"><q>naq</q></q> -<q lang="nb"><q>nb</q></q> -<q lang="nd"><q>nd</q></q> -<q lang="nl"><q>nl</q></q> -<q lang="nmg"><q>nmg</q></q> -<q lang="nn"><q>nn</q></q> -<q lang="nnh"><q>nnh</q></q> -<q lang="nus"><q>nus</q></q> -<q lang="nyn"><q>nyn</q></q> -<q lang="pl"><q>pl</q></q> -<q lang="pt"><q>pt</q></q> -<q lang="pt-PT"><q>pt-PT</q></q> -<q lang="rn"><q>rn</q></q> -<q lang="ro"><q>ro</q></q> -<q lang="rof"><q>rof</q></q> -<q lang="ru"><q>ru</q></q> -<q lang="rw"><q>rw</q></q> -<q lang="rwk"><q>rwk</q></q> -<q lang="saq"><q>saq</q></q> -<q lang="sbp"><q>sbp</q></q> -<q lang="seh"><q>seh</q></q> -<q lang="ses"><q>ses</q></q> -<q lang="sg"><q>sg</q></q> -<q lang="shi"><q>shi</q></q> -<q lang="shi-Tfng"><q>shi-Tfng</q></q> -<q lang="si"><q>si</q></q> -<q lang="sk"><q>sk</q></q> -<q lang="sl"><q>sl</q></q> -<q lang="sn"><q>sn</q></q> -<q lang="so"><q>so</q></q> -<q lang="sq"><q>sq</q></q> -<q lang="sr"><q>sr</q></q> -<q lang="sr-Latn"><q>sr-Latn</q></q> -<q lang="sv"><q>sv</q></q> -<q lang="sw"><q>sw</q></q> -<q lang="swc"><q>swc</q></q> -<q lang="ta"><q>ta</q></q> -<q lang="te"><q>te</q></q> -<q lang="teo"><q>teo</q></q> -<q lang="th"><q>th</q></q> -<q lang="ti-ER"><q>ti-ER</q></q> -<q lang="to"><q>to</q></q> -<q lang="tr"><q>tr</q></q> -<q lang="twq"><q>twq</q></q> -<q lang="tzm"><q>tzm</q></q> -<q lang="uk"><q>uk</q></q> -<q lang="ur"><q>ur</q></q> -<q lang="vai"><q>vai</q></q> -<q lang="vai-Latn"><q>vai-Latn</q></q> -<q lang="vi"><q>vi</q></q> -<q lang="vun"><q>vun</q></q> -<q lang="xh"><q>xh</q></q> -<q lang="xog"><q>xog</q></q> -<q lang="yav"><q>yav</q></q> -<q lang="yo"><q>yo</q></q> -<q lang="zh"><q>zh</q></q> -<q lang="zh-Hant"><q>zh-Hant</q></q> -<q lang="zu"><q>zu</q></q> +<span lang="custom"><q><q>custom</q></q></span> +<span><q><q>default</q></q></span> +<span lang="am"><q><q>am</q></q></span> +<span lang="ar"><q><q>ar</q></q></span> +<span lang="bg"><q><q>bg</q></q></span> +<span lang="bn"><q><q>bn</q></q></span> +<span lang="ca"><q><q>ca</q></q></span> +<span lang="cs"><q><q>cs</q></q></span> +<span lang="da"><q><q>da</q></q></span> +<span lang="de"><q><q>de</q></q></span> +<span lang="de-CH"><q><q>de-CH</q></q></span> +<span lang="el"><q><q>el</q></q></span> +<span lang="en"><q><q>en</q></q></span> +<span lang="en-GB"><q><q>en-GB</q></q></span> +<span lang="es"><q><q>es</q></q></span> +<span lang="et"><q><q>et</q></q></span> +<span lang="fa"><q><q>fa</q></q></span> +<span lang="fil"><q><q>fil</q></q></span> +<span lang="fi"><q><q>fi</q></q></span> +<span lang="fr"><q><q>fr</q></q></span> +<span lang="fr-CA"><q><q>fr-CA</q></q></span> +<span lang="fr-CH"><q><q>fr-CH</q></q></span> +<span lang="gu"><q><q>gu</q></q></span> +<span lang="hi"><q><q>hi</q></q></span> +<span lang="hu"><q><q>hu</q></q></span> +<span lang="hr"><q><q>hr</q></q></span> +<span lang="id"><q><q>id</q></q></span> +<span lang="it"><q><q>it</q></q></span> +<span lang="ja"><q><q>ja</q></q></span> +<span lang="kn"><q><q>kn</q></q></span> +<span lang="ko"><q><q>ko</q></q></span> +<span lang="lt"><q><q>lt</q></q></span> +<span lang="lv"><q><q>lv</q></q></span> +<span lang="ml"><q><q>ml</q></q></span> +<span lang="mr"><q><q>mr</q></q></span> +<span lang="ms"><q><q>ms</q></q></span> +<span lang="nl"><q><q>nl</q></q></span> +<span lang="no"><q><q>no</q></q></span> +<span lang="pl"><q><q>pl</q></q></span> +<span lang="pt"><q><q>pt</q></q></span> +<span lang="pt-PT"><q><q>pt-PT</q></q></span> +<span lang="ro"><q><q>ro</q></q></span> +<span lang="ru"><q><q>ru</q></q></span> +<span lang="sk"><q><q>sk</q></q></span> +<span lang="sl"><q><q>sl</q></q></span> +<span lang="sr"><q><q>sr</q></q></span> +<span lang="sr-Latn"><q><q>sr-Latn</q></q></span> +<span lang="sv"><q><q>sv</q></q></span> +<span lang="sw"><q><q>sw</q></q></span> +<span lang="ta"><q><q>ta</q></q></span> +<span lang="te"><q><q>te</q></q></span> +<span lang="th"><q><q>th</q></q></span> +<span lang="tr"><q><q>tr</q></q></span> +<span lang="uk"><q><q>uk</q></q></span> +<span lang="vi"><q><q>vi</q></q></span> +<span lang="zh"><q><q>zh</q></q></span> +<span lang="zh-Hant"><q><q>zh-Hant</q></q></span>
diff --git a/third_party/closure_compiler/externs/passwords_private.js b/third_party/closure_compiler/externs/passwords_private.js index fb84329d..92285c9 100644 --- a/third_party/closure_compiler/externs/passwords_private.js +++ b/third_party/closure_compiler/externs/passwords_private.js
@@ -154,6 +154,14 @@ chrome.passwordsPrivate.ChangeSavedPasswordParams; /** + * @typedef {{ + * accountId: (number|undefined), + * deviceId: (number|undefined) + * }} + */ +chrome.passwordsPrivate.CredentialIds; + +/** * Function that logs that the Passwords page was accessed from the Chrome * Settings WebUI. */ @@ -167,8 +175,8 @@ * @param {!Array<number>} ids The ids for the password entry being updated. * @param {!chrome.passwordsPrivate.ChangeSavedPasswordParams} params The * dictionary which holds the changed parameters. - * @param {function(): void=} callback The callback that gets invoked in the - * end. + * @param {function(!chrome.passwordsPrivate.CredentialIds): void=} callback The + * callback that gets invoked in the end. */ chrome.passwordsPrivate.changeSavedPassword = function(ids, params, callback) {}; @@ -359,6 +367,13 @@ chrome.passwordsPrivate.recordChangePasswordFlowStarted = function(credential, isManualFlow, callback) {}; /** + * Refreshes the cache for automatic password change scripts if it is stale. + * Invokes `callback` on completion. + * @param {function(): void=} callback + */ +chrome.passwordsPrivate.refreshScriptsIfNecessary = function(callback) {}; + +/** * Starts a check for insecure passwords. Invokes |callback| on completion. * @param {function(): void=} callback */
diff --git a/third_party/metrics_proto/README.chromium b/third_party/metrics_proto/README.chromium index 581638cd..07222f0f 100644 --- a/third_party/metrics_proto/README.chromium +++ b/third_party/metrics_proto/README.chromium
@@ -1,8 +1,8 @@ Name: Metrics Protos Short Name: metrics_proto URL: This is the canonical public repository -Version: 458008660 -Date: 2022/06/29 UTC +Version: 459259529 +Date: 2022/07/06 UTC License: BSD Security Critical: Yes
diff --git a/third_party/metrics_proto/system_profile.proto b/third_party/metrics_proto/system_profile.proto index dfcb42ca..89aac0bb 100644 --- a/third_party/metrics_proto/system_profile.proto +++ b/third_party/metrics_proto/system_profile.proto
@@ -634,10 +634,6 @@ // Logged on Android only as of Q1 2022. Used by only Android WebView. Other // platforms should use Stability.Counts2. optional int32 launch_count = 15; - // The number of times that it didn't exit cleanly (which we assume to be - // mostly crashes). On Android M71+ this does not include times when the Gms - // Core version has changed, which is recorded separately below. - optional int32 crash_count = 16; // Android only. The number of times Chrome didn't exit cleanly and the GMS // Core version has changed from the last session. This is in addition to // |crash_count| in which we exclude unclean exits that are likely caused by
diff --git a/third_party/updater/.gitignore b/third_party/updater/.gitignore index 30de5d24..76c051a 100644 --- a/third_party/updater/.gitignore +++ b/third_party/updater/.gitignore
@@ -2,8 +2,8 @@ /chrome_mac_universal_prod/UpdaterSetup /chrome_win_x86/UpdaterSetup_test.exe /chrome_win_x86_64/UpdaterSetup_test.exe -/chromium_mac_amd64/GoogleUpdater_test.app/ -/chromium_mac_arm64/GoogleUpdater_test.app/ +/chromium_mac_amd64/ChromiumUpdater_test.app/ +/chromium_mac_arm64/ChromiumUpdater_test.app/ /chromium_win_x86/UpdaterSetup_test.exe /chromium_win_x86_64/UpdaterSetup_test.exe
diff --git a/tools/ipc_fuzzer/fuzzer/fuzzer.cc b/tools/ipc_fuzzer/fuzzer/fuzzer.cc index d9ace88..105fc91 100644 --- a/tools/ipc_fuzzer/fuzzer/fuzzer.cc +++ b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
@@ -1366,7 +1366,7 @@ } }; -#if BUILDFLAG(ENABLE_PLUGINS) +#if BUILDFLAG(ENABLE_PPAPI) // PP_ traits. template <> struct FuzzTraits<PP_Bool> { @@ -1528,7 +1528,7 @@ return true; } }; -#endif // BUILDFLAG(ENABLE_PLUGINS) +#endif // BUILDFLAG(ENABLE_PPAPI) template <> struct FuzzTraits<printing::mojom::MarginType> {
diff --git a/tools/ipc_fuzzer/message_lib/BUILD.gn b/tools/ipc_fuzzer/message_lib/BUILD.gn index 71cb3f87..2b39551 100644 --- a/tools/ipc_fuzzer/message_lib/BUILD.gn +++ b/tools/ipc_fuzzer/message_lib/BUILD.gn
@@ -32,7 +32,7 @@ if (is_win) { public_deps += [ "//chrome/chrome_elf:test_stubs" ] } - if (enable_plugins) { + if (enable_ppapi) { public_deps += [ "//ppapi/proxy:ipc" ] } deps = [ "//remoting/host/base" ]
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index e4b0ec65..4ab5a7b3 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -35013,6 +35013,7 @@ <int value="1679" label="FILEMANAGERPRIVATE_OPENMANAGESYNCSETTINGS"/> <int value="1680" label="PASSWORDSPRIVATE_STARTAUTOMATEDPASSWORDCHANGE"/> <int value="1681" label="OFFSCREEN_CREATEDOCUMENT"/> + <int value="1682" label="PASSWORDSPRIVATE_REFRESHSCRIPTSIFNECESSARY"/> </enum> <enum name="ExtensionIconState"> @@ -56900,6 +56901,7 @@ <int value="-1068278508" label="InfoCardAcknowledgementTracking:disabled"/> <int value="-1068197506" label="EnhancedNetworkVoices:enabled"/> <int value="-1067635248" label="SpeculativeResourcePrefetching:disabled"/> + <int value="-1065887406" label="PictureInPictureV2:disabled"/> <int value="-1065227777" label="CrOSAutoSelect:disabled"/> <int value="-1064733740" label="ui-show-composited-layer-borders"/> <int value="-1064302126" @@ -57732,6 +57734,7 @@ <int value="-536003711" label="OmniboxClobberTriggersContextualWebZeroSuggest:enabled"/> <int value="-535662704" label="BundledConnectionHelp:enabled"/> + <int value="-535226444" label="PictureInPictureV2:enabled"/> <int value="-535208779" label="enable-native-cups"/> <int value="-534722229" label="LauncherNudgeShortInterval:enabled"/> <int value="-534525820" label="MediaAppPhotosIntegrationImage:enabled"/> @@ -82207,6 +82210,13 @@ <int value="7" label="Incompatible, duration below threshold"/> </enum> +<enum name="RemotingStartFailReason"> + <int value="0" label="Cannot start multiple sessions"/> + <int value="1" label="Route terminated"/> + <int value="2" label="Invalid ANSWER message"/> + <int value="3" label="Remoting not permitted from the dialog"/> +</enum> + <enum name="RemotingStartTrigger"> <int value="0" label="Unknown start trigger"/> <int value="1" label="Entered fullscreen"/> @@ -101151,6 +101161,7 @@ <int value="1975618905" label="chrome://app-list/"/> <int value="2040878656" label="chrome://bluetooth-internals/"/> <int value="2052019697" label="chrome://userimage/"/> + <int value="2111953935" label="chrome://topics-internals/"/> <int value="2114840772" label="chrome://drive-internals/"/> <int value="2120829362" label="chrome://account-manager-welcome/"/> </enum>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml index dca0fea..20103e9a 100644 --- a/tools/metrics/histograms/metadata/accessibility/histograms.xml +++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -401,13 +401,14 @@ </histogram> <histogram name="Accessibility.CrosAutoclick" enum="BooleanEnabled" - expires_after="2021-12-31"> + expires_after="2023-07-01"> <owner>kenjibaheux@google.com</owner> <owner>dtseng@chromium.org</owner> <owner>chrome-a11y-core@google.com</owner> <summary> Whether the Chrome OS Autoclick feature is on (logged once 45 secs after - startup). + startup). Warning: this histogram was expired 2021-12-31 to 2022-07-07, data + might be missing. </summary> </histogram> @@ -1989,7 +1990,7 @@ </histogram> <histogram name="TextToSpeech.Event" enum="TextToSpeechEvent" - expires_after="2022-07-11"> + expires_after="2023-07-01"> <owner>dtseng@chromium.org</owner> <owner>katie@chromium.org</owner> <owner>chrome-a11y-core@google.com</owner> @@ -1999,9 +2000,10 @@ </histogram> <histogram name="TextToSpeech.Utterance.FromExtensionAPI" - enum="TextToSpeechFromExtensionAPI" expires_after="2022-12-04"> + enum="TextToSpeechFromExtensionAPI" expires_after="2023-07-01"> <owner>dtseng@chromium.org</owner> <owner>katie@chromium.org</owner> + <owner>chrome-a11y-core@google.com</owner> <summary> Indicates if an utterance spoken via synthesized text-to-speech was triggered by the Chrome TTS extension API or the web speech API. @@ -2009,8 +2011,9 @@ </histogram> <histogram name="TextToSpeech.Utterance.HasVoiceName" - enum="TextToSpeechHasVoiceName" expires_after="2022-10-23"> + enum="TextToSpeechHasVoiceName" expires_after="2023-07-01"> <owner>katie@chromium.org</owner> + <owner>chrome-a11y-core@google.com</owner> <summary> True if an utterance spoken via synthesized text-to-speech requested a specific voice by name. @@ -2018,8 +2021,9 @@ </histogram> <histogram name="TextToSpeech.Utterance.Native" enum="TextToSpeechNative" - expires_after="2022-06-26"> + expires_after="2023-07-01"> <owner>katie@chromium.org</owner> + <owner>chrome-a11y-core@google.com</owner> <summary> True if an utterance is spoken with native speech provided by the operating system, otherwise it's spoken via a Chrome extension that implements @@ -2028,9 +2032,10 @@ </histogram> <histogram name="TextToSpeech.Utterance.Source" enum="TextToSpeechSource" - expires_after="M103"> + expires_after="2023-07-01"> <owner>joelriley@google.com</owner> <owner>katie@chromium.org</owner> + <owner>chrome-a11y-core@google.com</owner> <summary> ChromeOS source that triggered text-to-speech utterance via extension API, from a few known accessibility clients (Select-to-speak, ChromeVox). @@ -2038,8 +2043,9 @@ </histogram> <histogram name="TextToSpeech.Utterance.TextLength" units="bytes" - expires_after="2022-06-26"> + expires_after="2023-07-01"> <owner>katie@chromium.org</owner> + <owner>chrome-a11y-core@google.com</owner> <summary> The length of an utterance to be spoken via synthesized text-to-speech. </summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index 27cc82c..9829f839 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -3996,6 +3996,13 @@ <summary>Measures the duration of each remoting session.</summary> </histogram> +<histogram name="Media.Remoting.SessionStartFailedReason" + enum="RemotingStartFailReason" expires_after="2022-12-26"> + <owner>muyaoxu@google.com</owner> + <owner>openscreen-eng@google.com</owner> + <summary>Tracks the reason that a session failed to start.</summary> +</histogram> + <histogram name="Media.Remoting.SessionStartTrigger" enum="RemotingStartTrigger" expires_after="2022-12-25"> <owner>jophba@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml index c39f348c..775a2bea 100644 --- a/tools/metrics/histograms/metadata/sb_client/histograms.xml +++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -458,22 +458,6 @@ <token key="Action" variants="DownloadWarningAction"/> </histogram> -<histogram name="SBClientDownload.{Analyzer}AnalysisRemoteValid" - enum="BooleanValid" expires_after="2022-08-08"> - <owner>drubery@chromium.org</owner> - <owner>chrome-counter-abuse-alerts@google.com</owner> - <summary> - Records whether the analyzer for {Analyzer} is valid at the time of - analysis. Recorded once for each download with the appropriate file type. - </summary> - <token key="Analyzer"> - <variant name="Dmg" summary=".dmg files"/> - <variant name="Document" summary="office documents"/> - <variant name="Rar" summary=".rar files"/> - <variant name="Zip" summary=".zip files"/> - </token> -</histogram> - <histogram name="SBClientDownload.{ArchiveType}ArchiveAnalysisResult" enum="ArchiveAnalysisResult" expires_after="2022-10-26"> <owner>drubery@chromium.org</owner>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index a771755f..b51b47f1 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -470,7 +470,7 @@ ]) _CHROMEOS_KEVIN_FYI_BENCHMARK_CONFIGS = PerfSuite([ _GetBenchmarkConfig('rendering.desktop')]) -_LACROS_EVE_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([ +_LACROS_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([ 'blink_perf.display_locking', 'v8.runtime_stats.top_25', ]) @@ -682,8 +682,10 @@ _ANDROID_PIXEL4A_POWER_BENCHMARK_CONFIGS, 12, 'android') # Cros/Lacros -LACROS_EVE_PERF = PerfPlatform('lacros-eve-perf', '', - _LACROS_EVE_BENCHMARK_CONFIGS, 8, 'chromeos') +LACROS_EVE_PERF = PerfPlatform('lacros-eve-perf', '', _LACROS_BENCHMARK_CONFIGS, + 8, 'chromeos') +LACROS_X86_PERF = PerfPlatform('lacros-x86-perf', '', _LACROS_BENCHMARK_CONFIGS, + 12, 'chromeos') # FYI bots WIN_10_LOW_END_HP_CANDIDATE = PerfPlatform(
diff --git a/tools/perf/core/perf_benchmark_with_profiling_unittest.py b/tools/perf/core/perf_benchmark_with_profiling_unittest.py index 8ff2eec..ac763ad 100644 --- a/tools/perf/core/perf_benchmark_with_profiling_unittest.py +++ b/tools/perf/core/perf_benchmark_with_profiling_unittest.py
@@ -111,7 +111,7 @@ fill_policy: DISCARD } buffers { - size_kb: 2048 + size_kb: 190464 } buffers { @@ -122,6 +122,8 @@ name: "linux.process_stats" target_buffer: 1 process_stats_config { + scan_all_processes_on_start: true + record_thread_names: true proc_stats_poll_ms: 100 } }
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index f394b7d..10b0af42 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -1347,6 +1347,31 @@ 'device_type': 'eve', }, }, + 'lacros-x86-perf': { + 'tests': [ + { + 'isolate': + 'performance_test_suite_octopus', + 'extra_args': [ + # The magic hostname that resolves to a CrOS device in the test lab + '--remote=variable_chromeos_device_hostname', + ], + }, + ], + 'platform': + 'lacros', + 'target_bits': + 64, + 'dimension': { + 'pool': 'chrome.tests.perf', + # TODO(crbug.com/971204): Explicitly set the gpu to None to make + # chromium_swarming recipe_module ignore this dimension. + 'gpu': None, + 'os': 'ChromeOS', + 'device_status': 'available', + 'device_type': 'grabbiter', + }, + }, } # pylint: enable=line-too-long @@ -1531,6 +1556,7 @@ PERFORMANCE_TEST_SUITES = [ 'performance_test_suite', 'performance_test_suite_eve', + 'performance_test_suite_octopus', 'performance_webview_test_suite', 'performance_weblayer_test_suite', ]
diff --git a/tools/perf/core/perf_json_config_validator.py b/tools/perf/core/perf_json_config_validator.py index 4c921cd..96e5d19e 100644 --- a/tools/perf/core/perf_json_config_validator.py +++ b/tools/perf/core/perf_json_config_validator.py
@@ -48,6 +48,7 @@ _PERFORMANCE_TEST_SUITES = { 'performance_test_suite', 'performance_test_suite_eve', + 'performance_test_suite_octopus', 'performance_webview_test_suite', } for suffix in android_browser_types.TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES:
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index cc3cf47..e1e1bab 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "f9217c1f466ed74c5e6010c84150e3f8b6ec9634", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4440655d1a4a407c4ae59157a588aaedbcfe685e/trace_processor_shell.exe" + "hash": "c2034168e4a9eef267eaeff968d7098bf272c7cf", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/3c4bdd0f331990d7fae52ae52f56f5762614cc33/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", @@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "43056dc26144aa0c94240be9fb96e8112598ffd6", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/e535a96ea0270d6b5922b552b40e69d534d401e0/trace_processor_shell" + "hash": "fe1ec6d9316a0b6b959acfcdc11cfbfb70267e7f", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/acc008eff9c38f106b21ee30f6fac8741cb77878/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/core/shard_maps/lacros-x86-perf_map.json b/tools/perf/core/shard_maps/lacros-x86-perf_map.json new file mode 100644 index 0000000..6dc91ea --- /dev/null +++ b/tools/perf/core/shard_maps/lacros-x86-perf_map.json
@@ -0,0 +1,256 @@ +{ + "0": { + "benchmarks": { + "blink_perf.accessibility": { + "abridged": false + }, + "blink_perf.bindings": { + "abridged": false + }, + "blink_perf.css": { + "end": 29, + "abridged": false + } + } + }, + "1": { + "benchmarks": { + "blink_perf.css": { + "begin": 29, + "abridged": false + }, + "blink_perf.dom": { + "abridged": false + }, + "blink_perf.events": { + "abridged": false + }, + "blink_perf.image_decoder": { + "abridged": false + }, + "blink_perf.layout": { + "end": 48, + "abridged": false + } + } + }, + "2": { + "benchmarks": { + "blink_perf.layout": { + "begin": 48, + "abridged": false + }, + "blink_perf.owp_storage": { + "abridged": false + }, + "blink_perf.paint": { + "abridged": false + }, + "blink_perf.parser": { + "end": 20, + "abridged": false + } + } + }, + "3": { + "benchmarks": { + "blink_perf.parser": { + "begin": 20, + "abridged": false + }, + "blink_perf.shadow_dom": { + "abridged": false + }, + "blink_perf.svg": { + "abridged": false + }, + "blink_perf.webaudio": { + "abridged": false + }, + "blink_perf.webcodecs": { + "abridged": false + }, + "blink_perf.webgl": { + "abridged": false + }, + "blink_perf.webgl_fast_call": { + "end": 3, + "abridged": false + } + } + }, + "4": { + "benchmarks": { + "blink_perf.webgl_fast_call": { + "begin": 3, + "abridged": false + }, + "desktop_ui": { + "abridged": false + }, + "dummy_benchmark.noisy_benchmark_1": { + "abridged": false + }, + "dummy_benchmark.stable_benchmark_1": { + "abridged": false + }, + "jetstream": { + "abridged": false + }, + "jetstream2": { + "abridged": false + }, + "kraken": { + "abridged": false + }, + "loading.desktop": { + "end": 66, + "abridged": false + } + } + }, + "5": { + "benchmarks": { + "loading.desktop": { + "begin": 66, + "abridged": false + }, + "media.desktop": { + "abridged": false + }, + "memory.desktop": { + "abridged": false + }, + "octane": { + "abridged": false + }, + "power.desktop": { + "abridged": false + }, + "rasterize_and_record_micro.top_25": { + "end": 11, + "abridged": false + } + } + }, + "6": { + "benchmarks": { + "rasterize_and_record_micro.top_25": { + "begin": 11, + "abridged": false + }, + "rendering.desktop": { + "end": 86, + "abridged": false + } + } + }, + "7": { + "benchmarks": { + "rendering.desktop": { + "begin": 86, + "end": 185, + "abridged": false + } + } + }, + "8": { + "benchmarks": { + "rendering.desktop": { + "begin": 185, + "end": 285, + "abridged": false + } + } + }, + "9": { + "benchmarks": { + "rendering.desktop": { + "begin": 285, + "abridged": false + }, + "rendering.desktop.notracing": { + "abridged": false + }, + "speedometer": { + "abridged": false + }, + "speedometer-future": { + "abridged": false + }, + "speedometer2": { + "abridged": false + }, + "speedometer2-future": { + "abridged": false + }, + "speedometer2-pcscan": { + "abridged": false + }, + "system_health.common_desktop": { + "end": 49, + "abridged": false + } + } + }, + "10": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 49, + "abridged": false + }, + "system_health.memory_desktop": { + "end": 68, + "abridged": false + } + } + }, + "11": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 68, + "abridged": false + }, + "system_health.pcscan": { + "abridged": false + }, + "tab_switching.typical_25": { + "abridged": false + }, + "tracing.tracing_with_background_memory_infra": { + "abridged": false + }, + "v8.browsing_desktop": { + "abridged": false + }, + "v8.browsing_desktop-future": { + "abridged": false + }, + "wasmpspdfkit": { + "abridged": false + }, + "webrtc": { + "abridged": false + } + } + }, + "extra_infos": { + "num_stories": 1191, + "predicted_min_shard_time": 990, + "predicted_min_shard_index": 0, + "predicted_max_shard_time": 1000, + "predicted_max_shard_index": 6, + "shard #0": 990, + "shard #1": 990, + "shard #2": 990, + "shard #3": 990, + "shard #4": 990, + "shard #5": 990, + "shard #6": 1000, + "shard #7": 990, + "shard #8": 1000, + "shard #9": 990, + "shard #10": 1000, + "shard #11": 990 + } +} \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/lacros-x86-perf_timing.json b/tools/perf/core/shard_maps/timing_data/lacros-x86-perf_timing.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/lacros-x86-perf_timing.json
@@ -0,0 +1 @@ +[] \ No newline at end of file
diff --git a/tools/typescript/definitions/passwords_private.d.ts b/tools/typescript/definitions/passwords_private.d.ts index 7baaeb4d..17b51b8 100644 --- a/tools/typescript/definitions/passwords_private.d.ts +++ b/tools/typescript/definitions/passwords_private.d.ts
@@ -110,10 +110,15 @@ note?: string; } + export interface CredentialIds { + accountId?: number; + deviceId?: number; + } + export function recordPasswordsPageAccessInSettings(): void; export function changeSavedPassword( ids: Array<number>, params: ChangeSavedPasswordParams, - callback?: () => void): void; + callback?: (newIds: CredentialIds) => void): void; export function removeSavedPassword(id: number): void; export function removeSavedPasswords(ids: Array<number>): void; export function removePasswordException(id: number): void; @@ -153,6 +158,8 @@ credential: InsecureCredential, callback?: () => void): void; export function recordChangePasswordFlowStarted( credential: InsecureCredential, isManualFlow: boolean): void; + export function refreshScriptsIfNecessary( + callback?: () => void): void; export function startPasswordCheck(callback?: () => void): void; export function stopPasswordCheck(callback?: () => void): void; export function getPasswordCheckStatus(
diff --git a/ui/display/display_list.cc b/ui/display/display_list.cc index dcf81a4..c0ff86ea 100644 --- a/ui/display/display_list.cc +++ b/ui/display/display_list.cc
@@ -92,6 +92,10 @@ local_display->set_color_depth(display.color_depth()); changed_values |= DisplayObserver::DISPLAY_METRIC_COLOR_SPACE; } + if (local_display->label() != display.label()) { + local_display->set_label(display.label()); + changed_values |= DisplayObserver::DISPLAY_METRIC_LABEL; + } if (local_display->GetSizeInPixel() != display.GetSizeInPixel()) { local_display->set_size_in_pixels(display.GetSizeInPixel()); }
diff --git a/ui/display/display_list_unittest.cc b/ui/display/display_list_unittest.cc index c84b12b..6840e06 100644 --- a/ui/display/display_list_unittest.cc +++ b/ui/display/display_list_unittest.cc
@@ -65,6 +65,7 @@ "scale_factor", &parts); AddPartChange(changed_metrics, DISPLAY_METRIC_ROTATION, "rotation", &parts); AddPartChange(changed_metrics, DISPLAY_METRIC_PRIMARY, "primary", &parts); + AddPartChange(changed_metrics, DISPLAY_METRIC_LABEL, "label", &parts); AddChange("Changed id=" + base::NumberToString(display.id()) + parts); } @@ -88,6 +89,15 @@ EXPECT_EQ("Changed id=2 bounds", observer.GetAndClearChanges()); } + // Update the label. + { + Display updated_display = *(display_list.displays().begin()); + updated_display.set_label("new_label"); + display_list.UpdateDisplay(updated_display, DisplayList::Type::PRIMARY); + EXPECT_EQ("Changed id=2 label", observer.GetAndClearChanges()); + EXPECT_EQ("new_label", display_list.FindDisplayById(2)->label()); + } + // Add another. display_list.AddDisplay(Display(3, gfx::Rect(0, 0, 809, 802)), DisplayList::Type::NOT_PRIMARY);
diff --git a/ui/display/display_observer.h b/ui/display/display_observer.h index 57db4c4b..e63102c 100644 --- a/ui/display/display_observer.h +++ b/ui/display/display_observer.h
@@ -28,6 +28,7 @@ DISPLAY_METRIC_COLOR_SPACE = 1 << 6, DISPLAY_METRIC_REFRESH_RATE = 1 << 7, DISPLAY_METRIC_INTERLACED = 1 << 8, + DISPLAY_METRIC_LABEL = 1 << 9, }; // This may be called before other methods to signal changes are about to
diff --git a/ui/display/manager/display_manager.cc b/ui/display/manager/display_manager.cc index 121b279..1b3dc00f 100644 --- a/ui/display/manager/display_manager.cc +++ b/ui/display/manager/display_manager.cc
@@ -989,6 +989,9 @@ metrics |= DisplayObserver::DISPLAY_METRIC_INTERLACED; } + if (current_display.label() != new_display.label()) + metrics |= DisplayObserver::DISPLAY_METRIC_LABEL; + if (metrics != DisplayObserver::DISPLAY_METRIC_NONE) { display_changes.insert( std::pair<size_t, uint32_t>(new_displays.size(), metrics)); @@ -2085,6 +2088,9 @@ new_display.set_touch_support(display_info.touch_support()); new_display.set_maximum_cursor_size(display_info.maximum_cursor_size()); new_display.set_color_spaces(display_info.display_color_spaces()); + new_display.set_display_frequency(display_info.refresh_rate()); + new_display.set_label(display_info.name()); + constexpr uint32_t kNormalBitDepthNumBitsPerChannel = 8u; if (display_info.bits_per_channel() > kNormalBitDepthNumBitsPerChannel) { new_display.set_depth_per_component(display_info.bits_per_channel()); @@ -2092,8 +2098,6 @@ new_display.set_color_depth(display_info.bits_per_channel() * kRGBNumChannels); } - new_display.set_display_frequency(display_info.refresh_rate()); - if (internal_display_has_accelerometer_ && IsInternalDisplayId(id)) { new_display.set_accelerometer_support( Display::AccelerometerSupport::AVAILABLE); @@ -2119,6 +2123,7 @@ new_display.set_maximum_cursor_size(display_info.maximum_cursor_size()); new_display.set_rotation(display_info.GetActiveRotation()); new_display.set_panel_rotation(display_info.GetLogicalActiveRotation()); + new_display.set_label(display_info.name()); return new_display; }
diff --git a/ui/events/blink/web_input_event_unittest.cc b/ui/events/blink/web_input_event_unittest.cc index 046e317..59788b2 100644 --- a/ui/events/blink/web_input_event_unittest.cc +++ b/ui/events/blink/web_input_event_unittest.cc
@@ -427,6 +427,8 @@ } TEST(WebInputEventTest, WheelEvent) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature(features::kPercentBasedScrolling); const int kDeltaX = 14; const int kDeltaY = -3; ui::MouseWheelEvent ui_event(
diff --git a/ui/gfx/geometry/resize_utils.cc b/ui/gfx/geometry/resize_utils.cc index e3a70eb..e6a2aba 100644 --- a/ui/gfx/geometry/resize_utils.cc +++ b/ui/gfx/geometry/resize_utils.cc
@@ -35,34 +35,47 @@ void SizeRectToAspectRatio(ResizeEdge resize_edge, float aspect_ratio, const Size& min_window_size, - const Size& max_window_size, + absl::optional<Size> max_window_size, Rect* rect) { DCHECK_GT(aspect_ratio, 0.0f); - DCHECK_GE(max_window_size.width(), min_window_size.width()); - DCHECK_GE(max_window_size.height(), min_window_size.height()); + if (max_window_size.has_value()) { + DCHECK_GE(max_window_size->width(), min_window_size.width()); + DCHECK_GE(max_window_size->height(), min_window_size.height()); + DCHECK(Rect(rect->origin(), *max_window_size).Contains(*rect)) + << rect->ToString() << " is larger than the maximum size " + << max_window_size->ToString(); + } DCHECK(rect->Contains(Rect(rect->origin(), min_window_size))) << rect->ToString() << " is smaller than the minimum size " << min_window_size.ToString(); - DCHECK(Rect(rect->origin(), max_window_size).Contains(*rect)) - << rect->ToString() << " is larger than the maximum size " - << max_window_size.ToString(); Size new_size = rect->size(); if (IsResizingHorizontally(resize_edge)) { new_size.set_height(base::ClampRound(new_size.width() / aspect_ratio)); if (min_window_size.height() > new_size.height() || - new_size.height() > max_window_size.height()) { - new_size.set_height(base::clamp(new_size.height(), - min_window_size.height(), - max_window_size.height())); + (max_window_size.has_value() && + new_size.height() > max_window_size->height())) { + if (max_window_size.has_value()) { + new_size.set_height(base::clamp(new_size.height(), + min_window_size.height(), + max_window_size->height())); + } else { + new_size.set_height(min_window_size.height()); + } new_size.set_width(base::ClampRound(new_size.height() * aspect_ratio)); } } else { new_size.set_width(base::ClampRound(new_size.height() * aspect_ratio)); if (min_window_size.width() > new_size.width() || - new_size.width() > max_window_size.width()) { - new_size.set_width(base::clamp(new_size.width(), min_window_size.width(), - max_window_size.width())); + (max_window_size.has_value() && + new_size.width() > max_window_size->width())) { + if (max_window_size.has_value()) { + new_size.set_width(base::clamp(new_size.width(), + min_window_size.width(), + max_window_size->width())); + } else { + new_size.set_width(min_window_size.width()); + } new_size.set_height(base::ClampRound(new_size.width() / aspect_ratio)); } } @@ -70,7 +83,9 @@ // The dimensions might still be outside of the allowed ranges at this point. // This happens when the aspect ratio makes it impossible to fit |rect| // within the size limits without letter-/pillarboxing. - new_size.SetToMin(max_window_size); + if (max_window_size.has_value()) + new_size.SetToMin(*max_window_size); + new_size.SetToMax(min_window_size); // |rect| bounds before sizing to aspect ratio.
diff --git a/ui/gfx/geometry/resize_utils.h b/ui/gfx/geometry/resize_utils.h index 318a31b..ddb0da43 100644 --- a/ui/gfx/geometry/resize_utils.h +++ b/ui/gfx/geometry/resize_utils.h
@@ -5,6 +5,7 @@ #ifndef UI_GFX_GEOMETRY_RESIZE_UTILS_H_ #define UI_GFX_GEOMETRY_RESIZE_UTILS_H_ +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/geometry_export.h" namespace gfx { @@ -28,12 +29,10 @@ // |min_window_size| and |max_window_size| are expected to adhere to the // given aspect ratio. // |aspect_ratio| must be valid and is found using width / height. -// TODO(apacible): |max_window_size| is expected to be non-empty. Handle -// unconstrained max sizes and sizing when windows are maximized. void GEOMETRY_EXPORT SizeRectToAspectRatio(ResizeEdge resize_edge, float aspect_ratio, const Size& min_window_size, - const Size& max_window_size, + absl::optional<Size> max_window_size, Rect* rect); } // namespace gfx
diff --git a/ui/gfx/geometry/resize_utils_unittest.cc b/ui/gfx/geometry/resize_utils_unittest.cc index bf1e90b..d7db548 100644 --- a/ui/gfx/geometry/resize_utils_unittest.cc +++ b/ui/gfx/geometry/resize_utils_unittest.cc
@@ -53,16 +53,16 @@ ResizeEdge resize_edge{}; float aspect_ratio = 0.0f; Size min_size; - Size max_size; + absl::optional<Size> max_size; Rect input_rect; Rect expected_output_rect; std::string ToString() const { - return base::StrCat({HitTestToString(resize_edge), - " ratio=", base::NumberToString(aspect_ratio), " [", - min_size.ToString(), "..", max_size.ToString(), "] ", - input_rect.ToString(), " -> ", - expected_output_rect.ToString()}); + return base::StrCat( + {HitTestToString(resize_edge), " ratio=", + base::NumberToString(aspect_ratio), " [", min_size.ToString(), "..", + max_size.has_value() ? max_size->ToString() : "nullopt", "] ", + input_rect.ToString(), " -> ", expected_output_rect.ToString()}); } }; @@ -121,6 +121,11 @@ kMaxSizeHorizontal, Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height()), Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height())}, + + // Dragging the top-left resizer left. + // No max size specified. + {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal, + absl::nullopt, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)}, }; const SizingParams kSizeRectToHorizontalAspectRatioTestCases[] = { @@ -143,6 +148,11 @@ kMaxSizeHorizontal, Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height()), Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height())}, + + // Dragging the left resizer left. + // No max size specified. + {ResizeEdge::kLeft, kAspectRatioHorizontal, kMinSizeHorizontal, + absl::nullopt, Rect(96, 100, 48, 22), Rect(96, 98, 48, 24)}, }; const SizingParams kSizeRectToVerticalAspectRatioTestCases[] = { @@ -163,6 +173,11 @@ {ResizeEdge::kTop, kAspectRatioVertical, kMinSizeVertical, kMaxSizeVertical, Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height()), Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height())}, + + // Dragging the right resizer right. + // No max size specified. + {ResizeEdge::kRight, kAspectRatioVertical, kMinSizeVertical, absl::nullopt, + Rect(100, 100, 24, 44), Rect(100, 100, 24, 48)}, }; INSTANTIATE_TEST_SUITE_P(
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index 6250efd..827f6fc 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -3671,8 +3671,13 @@ delegate_->GetMinMaxSize(&min_window_size, &max_window_size); min_window_size = delegate_->DIPToScreenSize(min_window_size); max_window_size = delegate_->DIPToScreenSize(max_window_size); + + absl::optional<gfx::Size> max_size_param; + if (!max_window_size.IsEmpty()) + max_size_param = max_window_size; + gfx::SizeRectToAspectRatio(GetWindowResizeEdge(param), aspect_ratio_.value(), - min_window_size, max_window_size, window_rect); + min_window_size, max_size_param, window_rect); } POINT HWNDMessageHandler::GetCursorPos() const {