diff --git a/DEPS b/DEPS index 8ca0ab4..9fe99f56 100644 --- a/DEPS +++ b/DEPS
@@ -300,7 +300,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': '1159092e81cadd8225e03fa98287eee03668e3d9', + 'src_internal_revision': '69c27e547002e7b16fd7e39d9d458672021e53da', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. @@ -312,7 +312,7 @@ # 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': '18010f58be60bfcb233f70f125c91265d33ab4a7', + 'angle_revision': '14339812a9db57d06346c86896d1275ff8f9ed09', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -320,7 +320,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'ba7701bc2fdc70222d68a5ff732a0e7da384a73b', + 'pdfium_revision': 'e392794c0ec0219df62d14b4e162b1b1fd6e9b2a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -331,7 +331,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:12.20230612.1.1', + 'fuchsia_version': 'version:13.20230613.4.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -375,7 +375,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': '793b83da0634b8de30f0b9d9d1ace14134280ca3', + 'catapult_revision': '45275b64c5ea145a72d36708551635f17285f92b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -391,7 +391,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': '81e8f798e7b0638ea521ce8d3b8fa2c6b5af5061', + 'devtools_frontend_revision': '6e8ad1b59f68bf4764a0afefcaa6eec082b6cc71', # 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. @@ -431,11 +431,11 @@ # 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': '8ab22d45da518d74ba300723e2580ed8b983ef0c', + 'dawn_revision': '48a39ff9615d36750ffc31b414cca8eeb1d5fc61', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '90315e8698e0d2290a8a0fdfe96318ebb1a210a7', + 'quiche_revision': 'd9aaee403dc43e368f3695c308f0fd9908d9bbdc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -499,7 +499,7 @@ # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': '38a8ad0f7ea659edb28a57dfd59a7e5399dabeab', + 'libcxx_revision': '055b2e17ae4f0e2c025ad0c7508b01787df17758', # GN CIPD package version. 'gn_version': 'git_revision:1cd35c1b722472e714c30d12031af81443bb20ae', @@ -816,7 +816,7 @@ }, 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '2e7e40ae19aa65415d86aed6f2bd4075b8fd4ee4', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'd2717abfb03a58d342f461c0cb3b2294184a0862', 'condition': 'checkout_ios', }, @@ -1243,13 +1243,13 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7b5e3d7868de02d85e22fc48ed955846ab521a80', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2b19afb82030a638f8a3d8f592fa25269b924800', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'c7069f35b34cc6e018c3ee37412fafd2338c0459', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '5f55a210fa421b1c0a7db170451f2596dc60589b', 'condition': 'checkout_src_internal', }, @@ -1716,7 +1716,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd019594d65a235c4a9cba35d48a48ec8dd065da2', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '57cd2bc9b473a24fced56bbf42a51dd1ce6191cb', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -4016,7 +4016,7 @@ 'src/chrome/browser/internal': { 'url': Var('chrome_git') + '/chrome/browser_internal.git' + '@' + - '86edf3656689330827cd0bd118656e6be5ec88a4', + '9aa1b003c117710df4073378555ae882b159089f', 'condition': 'checkout_src_internal', }, @@ -4185,7 +4185,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'cdcc9a378a9b22a35e98b52f94b1f1fbe2092d28', + '982f063c939b3eb4807e903a9eecacacb86fd91a', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn index 2005085..ef04f40 100644 --- a/android_webview/nonembedded/BUILD.gn +++ b/android_webview/nonembedded/BUILD.gn
@@ -16,6 +16,7 @@ # Contains classes needed by the webview apk, but not used when loading the apk # as a library. android_library("nonembedded_java") { + srcjar_deps = [ ":nonembedded_jni_headers" ] sources = [ "java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java", "java/src/org/chromium/android_webview/nonembedded/AwNonembeddedUmaRecorder.java", @@ -50,8 +51,6 @@ "//ui/android:ui_no_recycler_view_java", "//url:gurl_java", ] - - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } android_library("devui_java") {
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index fd1ed93..4f4e8b5 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1764,6 +1764,13 @@ "OverviewDeskNavigation", base::FEATURE_ENABLED_BY_DEFAULT); +// Enables a new layout for overview mode in clamshell, preventing the overview +// mode display from getting too cluttered. Similar to current overview mode +// layout in tablet mode. +BASE_FEATURE(kOverviewScrollLayoutForClamshell, + "OverviewScrollLayoutForClamshell", + base::FEATURE_DISABLED_BY_DEFAULT); + // Enables user to provision PasspointARCSupport credentials. BASE_FEATURE(kPasspointARCSupport, "PasspointARCSupport", @@ -3355,6 +3362,11 @@ return base::FeatureList::IsEnabled(kOverviewDeskNavigation); } +bool IsOverviewScrollLayoutForClamshellEnabled() { + return base::FeatureList::IsEnabled(kOverviewScrollLayoutForClamshell) && + chromeos::features::IsJellyEnabled(); +} + bool IsPasspointARCSupportEnabled() { return base::FeatureList::IsEnabled(kPasspointARCSupport); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index e0f22e5..aa90098d 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -515,6 +515,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOsSyncConsentRevamp); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOverviewButton); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOverviewDeskNavigation); +COMPONENT_EXPORT(ASH_CONSTANTS) +BASE_DECLARE_FEATURE(kOverviewScrollLayoutForClamshell); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPasspointARCSupport); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPasspointSettings); COMPONENT_EXPORT(ASH_CONSTANTS) @@ -914,6 +916,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOsSettingsRevampWayfindingEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOsSyncConsentRevampEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOverviewDeskNavigationEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) +bool IsOverviewScrollLayoutForClamshellEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasspointARCSupportEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasspointSettingsEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPcieBillboardNotificationEnabled();
diff --git a/ash/glanceables/classroom/glanceables_classroom_client.h b/ash/glanceables/classroom/glanceables_classroom_client.h index 3dad86fe..a785d48 100644 --- a/ash/glanceables/classroom/glanceables_classroom_client.h +++ b/ash/glanceables/classroom/glanceables_classroom_client.h
@@ -5,12 +5,41 @@ #ifndef ASH_GLANCEABLES_CLASSROOM_GLANCEABLES_CLASSROOM_CLIENT_H_ #define ASH_GLANCEABLES_CLASSROOM_GLANCEABLES_CLASSROOM_CLIENT_H_ +#include <memory> +#include <vector> + #include "ash/ash_export.h" +#include "base/functional/callback_forward.h" namespace ash { +struct GlanceablesClassroomStudentAssignment; + // Interface for the classroom browser client. -class ASH_EXPORT GlanceablesClassroomClient {}; +class ASH_EXPORT GlanceablesClassroomClient { + public: + using IsRoleEnabledCallback = base::OnceCallback<void(bool active)>; + using GetStudentAssignmentsCallback = base::OnceCallback<void( + std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>> + assignments)>; + + virtual ~GlanceablesClassroomClient() = default; + + // Returns `true` if current user is enrolled in at least one classroom course + // as a student. + virtual void IsStudentRoleActive(IsRoleEnabledCallback callback) = 0; + + // Return student assignments based on different due date/time and submission + // state filters. + virtual void GetCompletedStudentAssignments( + GetStudentAssignmentsCallback callback) = 0; + virtual void GetStudentAssignmentsWithApproachingDueDate( + GetStudentAssignmentsCallback callback) = 0; + virtual void GetStudentAssignmentsWithMissedDueDate( + GetStudentAssignmentsCallback callback) = 0; + virtual void GetStudentAssignmentsWithoutDueDate( + GetStudentAssignmentsCallback callback) = 0; +}; } // namespace ash
diff --git a/ash/glanceables/classroom/glanceables_classroom_types.cc b/ash/glanceables/classroom/glanceables_classroom_types.cc index 405b80e..6d78e114 100644 --- a/ash/glanceables/classroom/glanceables_classroom_types.cc +++ b/ash/glanceables/classroom/glanceables_classroom_types.cc
@@ -38,4 +38,17 @@ State state) : id(id), course_work_id(course_work_id), state(state) {} +// ---------------------------------------------------------------------------- +// GlanceablesClassroomStudentAssignment: + +GlanceablesClassroomStudentAssignment::GlanceablesClassroomStudentAssignment( + const std::string& course_title, + const std::string& course_work_title, + const GURL& link, + const absl::optional<base::Time>& due) + : course_title(course_title), + course_work_title(course_work_title), + link(link), + due(due) {} + } // namespace ash
diff --git a/ash/glanceables/classroom/glanceables_classroom_types.h b/ash/glanceables/classroom/glanceables_classroom_types.h index e0b0c4c2..fbfb625 100644 --- a/ash/glanceables/classroom/glanceables_classroom_types.h +++ b/ash/glanceables/classroom/glanceables_classroom_types.h
@@ -101,6 +101,33 @@ const State state; }; +// Represents a single classroom assignment for students (contains data from +// `GlanceablesClassroomCourse` and `GlanceablesClassroomCourseWorkItem`). +struct ASH_EXPORT GlanceablesClassroomStudentAssignment { + public: + GlanceablesClassroomStudentAssignment(const std::string& course_title, + const std::string& course_work_title, + const GURL& link, + const absl::optional<base::Time>& due); + GlanceablesClassroomStudentAssignment( + const GlanceablesClassroomStudentAssignment&) = delete; + GlanceablesClassroomStudentAssignment& operator=( + const GlanceablesClassroomStudentAssignment&) = delete; + ~GlanceablesClassroomStudentAssignment() = default; + + // Title of the course this assignment belongs to. + const std::string course_title; + + // Title of the course work item this assignment belongs to. + const std::string course_work_title; + + // Absolute link for redirects to Classroom web UI. + const GURL link; + + // Due date and time in UTC of this course work item. + const absl::optional<base::Time> due; +}; + } // namespace ash #endif // ASH_GLANCEABLES_CLASSROOM_GLANCEABLES_CLASSROOM_TYPES_H_
diff --git a/ash/public/cpp/system/anchored_nudge_data.cc b/ash/public/cpp/system/anchored_nudge_data.cc index 3a3c13c..d76aa96 100644 --- a/ash/public/cpp/system/anchored_nudge_data.cc +++ b/ash/public/cpp/system/anchored_nudge_data.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <utility> +#include "ash/constants/ash_features.h" #include "ash/strings/grit/ash_strings.h" #include "base/time/time.h" #include "ui/base/l10n/l10n_util.h" @@ -21,7 +22,9 @@ : id(std::move(id)), catalog_name(catalog_name), body_text(body_text), - anchor_view(anchor_view) {} + anchor_view(anchor_view) { + DCHECK(features::IsSystemNudgeV2Enabled()); +} AnchoredNudgeData::AnchoredNudgeData(AnchoredNudgeData&& other) = default;
diff --git a/ash/system/toast/anchored_nudge_manager_impl_unittest.cc b/ash/system/toast/anchored_nudge_manager_impl_unittest.cc index ab3ecc8..4641020 100644 --- a/ash/system/toast/anchored_nudge_manager_impl_unittest.cc +++ b/ash/system/toast/anchored_nudge_manager_impl_unittest.cc
@@ -32,15 +32,13 @@ return Shell::Get()->anchored_nudge_manager(); } - void ShowNudge(const std::string& id, - views::View* anchor_view, - const std::u16string& text = std::u16string(), - bool has_infinite_duration = false) { - AnchoredNudgeData nudge_data(id, AnchoredNudgeCatalogName::kTest, text, - anchor_view); - nudge_data.has_infinite_duration = has_infinite_duration; - - anchored_nudge_manager()->Show(nudge_data); + // Creates an `AnchoredNudgeData` object with only the required elements. + AnchoredNudgeData CreateBaseNudgeData( + const std::string& id, + views::View* anchor_view, + const std::u16string& body_text = std::u16string()) { + return AnchoredNudgeData(id, AnchoredNudgeCatalogName::kTest, body_text, + anchor_view); } void CancelNudge(const std::string& id) { @@ -63,9 +61,10 @@ const std::string id = "id"; const std::u16string text = u"text"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view, text); // Show a nudge. - ShowNudge(id, anchor_view, text); + anchored_nudge_manager()->Show(nudge_data); // Ensure the nudge is visible and has set the provided contents. auto nudge = GetShownNudges()[id]; @@ -89,18 +88,20 @@ const std::string id = "id"; auto* anchor_view = contents_view->AddChildView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); const std::string id_2 = "id_2"; auto* anchor_view_2 = contents_view->AddChildView(std::make_unique<views::View>()); + auto nudge_data_2 = CreateBaseNudgeData(id_2, anchor_view_2); // Show the first nudge, expect the first nudge shown. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); EXPECT_FALSE(GetShownNudges()[id_2]); // Show the second nudge, expect both nudges shown. - ShowNudge(id_2, anchor_view_2); + anchored_nudge_manager()->Show(nudge_data_2); EXPECT_TRUE(GetShownNudges()[id]); EXPECT_TRUE(GetShownNudges()[id_2]); @@ -122,13 +123,10 @@ // Set up nudge data contents. const std::string id = "id"; - const std::u16string text = u"text"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); const std::u16string dismiss_text = u"dismiss"; const std::u16string second_button_text = u"second"; - - AnchoredNudgeData nudge_data(id, AnchoredNudgeCatalogName::kTest, text, - anchor_view); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Add a dismiss button with no callbacks. nudge_data.dismiss_text = dismiss_text; @@ -210,19 +208,21 @@ const std::u16string text = u"text"; auto* anchor_view = contents_view->AddChildView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view, text); const std::u16string text_2 = u"text_2"; auto* anchor_view_2 = contents_view->AddChildView(std::make_unique<views::View>()); + auto nudge_data_2 = CreateBaseNudgeData(id, anchor_view_2, text_2); // Show a nudge with some initial contents. - ShowNudge(id, anchor_view, text); + anchored_nudge_manager()->Show(nudge_data); auto nudge = GetShownNudges()[id]; EXPECT_EQ(text, nudge->GetBodyText()); EXPECT_EQ(anchor_view, nudge->GetAnchorView()); // Attempt to show a nudge with different contents but with the same id. - ShowNudge(id, anchor_view_2, text_2); + anchored_nudge_manager()->Show(nudge_data_2); // Previously shown nudge should be cancelled and replaced with new nudge. nudge = GetShownNudges()[id]; @@ -240,12 +240,13 @@ // Set up nudge data contents. const std::string id = "id"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Set anchor view visibility to false. anchor_view->SetVisible(false); // Attempt to show nudge. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); // Anchor view is not visible, the nudge should not be created. EXPECT_FALSE(GetShownNudges()[id]); @@ -258,9 +259,10 @@ auto contents_view = std::make_unique<views::View>(); auto* anchor_view = contents_view->AddChildView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Attempt to show nudge. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); // Anchor view does not have a widget, the nudge should not be created. EXPECT_FALSE(GetShownNudges()[id]); @@ -273,9 +275,10 @@ // Set up nudge data contents. const std::string id = "id"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Show a nudge. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); // Set the anchor view visibility to false, the nudge should have closed. @@ -298,9 +301,10 @@ widget->SetContentsView(std::make_unique<views::View>()); auto* anchor_view = contents_view->AddChildView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Show a nudge. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); // Delete the anchor view, the nudge should have closed. @@ -317,17 +321,16 @@ RootWindowController* const secondary_root_window_controller = Shell::GetRootWindowControllerWithDisplayId(GetSecondaryDisplay().id()); - // Set up nudge data contents. + // Set up nudge data contents. The anchor view is a child of the secondary + // root window controller, so it will be deleted if the display is removed. const std::string id = "id"; - // The anchor view is a child of the secondary root window controller, so it - // will be deleted if the display is removed. - auto* secondary_unified_system_tray = - secondary_root_window_controller->shelf() - ->status_area_widget() - ->unified_system_tray(); + auto* anchor_view = secondary_root_window_controller->shelf() + ->status_area_widget() + ->unified_system_tray(); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Show the nudge in the secondary display. - ShowNudge(id, secondary_unified_system_tray); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); // Remove the secondary display, which deletes the anchor view. @@ -344,9 +347,10 @@ // Set up nudge data contents. const std::string id = "id"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Show a nudge. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); // Nudge is left open, no crash. @@ -360,9 +364,10 @@ // Set up nudge data contents. const std::string id = "id"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Show a nudge. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); // Fast forward `kNudgeDefaultDuration` plus one second, the nudge should have @@ -380,11 +385,11 @@ // Set up nudge data contents. const std::string id = "id"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); - const std::u16string text = u"text"; - bool has_infinite_duration = true; + auto nudge_data = CreateBaseNudgeData(id, anchor_view); + nudge_data.has_infinite_duration = true; // Show a nudge. - ShowNudge(id, anchor_view, text, has_infinite_duration); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); // Fast forward `kNudgeDefaultDuration` plus one second, the nudge should not @@ -405,9 +410,10 @@ const std::string id = "id"; const std::string id_2 = "id_2"; auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>()); + auto nudge_data = CreateBaseNudgeData(id, anchor_view); // Show a nudge. - ShowNudge(id, anchor_view); + anchored_nudge_manager()->Show(nudge_data); EXPECT_TRUE(GetShownNudges()[id]); // Attempt to cancel nudge with an `id` that does not exist. Should not have
diff --git a/ash/webui/color_internals/resources/index.ts b/ash/webui/color_internals/resources/index.ts index 16cd8a6..c16766f9 100644 --- a/ash/webui/color_internals/resources/index.ts +++ b/ash/webui/color_internals/resources/index.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {addColorChangeListener, startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js'; +import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js'; import {getRGBAFromComputedStyle} from './utils.js'; import {startObservingWallpaperColors} from './wallpaper_colors.js'; @@ -106,6 +106,7 @@ populateTokenTable(); startColorChangeUpdater(); startObservingWallpaperColors(); - addColorChangeListener(onColorChange); + ColorChangeUpdater.forDocument().eventTarget.addEventListener( + COLOR_PROVIDER_CHANGED, onColorChange); onColorChange(); };
diff --git a/ash/webui/common/resources/network/network_proxy.d.ts b/ash/webui/common/resources/network/network_proxy.d.ts index 1fc89dd..a2d25df7 100644 --- a/ash/webui/common/resources/network/network_proxy.d.ts +++ b/ash/webui/common/resources/network/network_proxy.d.ts
@@ -4,6 +4,7 @@ import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js'; interface NetworkProxyElement extends LegacyElementMixin, HTMLElement { + editable: boolean; reset(): void; } export {NetworkProxyElement};
diff --git a/ash/webui/help_app_ui/resources/receiver.js b/ash/webui/help_app_ui/resources/receiver.js index e6962d3..163f938 100644 --- a/ash/webui/help_app_ui/resources/receiver.js +++ b/ash/webui/help_app_ui/resources/receiver.js
@@ -8,7 +8,7 @@ */ import './sandboxed_load_time_data.js'; -import {addColorChangeListener, removeColorChangeListener, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js'; +import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js'; import {MessagePipe} from './message_pipe.js'; import {Message} from './message_types.js'; @@ -96,7 +96,15 @@ }); // Expose functions to bind to color change events to window so they can be // automatically picked up by installColors(). See ts_helpers.ts in google3. -window['addColorChangeListener'] = addColorChangeListener; -window['removeColorChangeListener'] = removeColorChangeListener; +window['addColorChangeListener'] = + /** @suppress {checkTypes} */ function(listener) { + ColorChangeUpdater.forDocument().eventTarget.addEventListener( + COLOR_PROVIDER_CHANGED, listener); + }; +window['removeColorChangeListener'] = + /** @suppress {checkTypes} */ function(listener) { + ColorChangeUpdater.forDocument().eventTarget.removeEventListener( + COLOR_PROVIDER_CHANGED, listener); + }; export const TEST_ONLY = {parentMessagePipe};
diff --git a/ash/webui/media_app_ui/resources/js/receiver.js b/ash/webui/media_app_ui/resources/js/receiver.js index f08182df..7759a354 100644 --- a/ash/webui/media_app_ui/resources/js/receiver.js +++ b/ash/webui/media_app_ui/resources/js/receiver.js
@@ -4,7 +4,7 @@ import './sandboxed_load_time_data.js'; -import {addColorChangeListener, removeColorChangeListener, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js'; +import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js'; import {assertCast, MessagePipe} from './message_pipe.js'; import {EditInPhotosMessage, FileContext, IsFileArcWritableMessage, IsFileArcWritableResponse, IsFileBrowserWritableMessage, IsFileBrowserWritableResponse, LoadFilesMessage, Message, OpenAllowedFileMessage, OpenAllowedFileResponse, OpenFilesWithPickerMessage, OverwriteFileMessage, OverwriteViaFilePickerResponse, RenameFileResponse, RenameResult, RequestSaveFileMessage, RequestSaveFileResponse, SaveAsMessage, SaveAsResponse} from './message_types.js'; @@ -471,8 +471,16 @@ // Expose functions to bind to color change events to window so they can be // automatically picked up by installColors(). See ts_helpers.ts in google3. -window['addColorChangeListener'] = addColorChangeListener; -window['removeColorChangeListener'] = removeColorChangeListener; +window['addColorChangeListener'] = + /** @suppress {checkTypes} */ function(listener) { + ColorChangeUpdater.forDocument().eventTarget.addEventListener( + COLOR_PROVIDER_CHANGED, listener); + }; +window['removeColorChangeListener'] = + /** @suppress {checkTypes} */ function(listener) { + ColorChangeUpdater.forDocument().eventTarget.removeEventListener( + COLOR_PROVIDER_CHANGED, listener); + }; export const TEST_ONLY = { RenameResult,
diff --git a/ash/wm/overview/overview_constants.h b/ash/wm/overview/overview_constants.h index 600ff51..c3f39a7d 100644 --- a/ash/wm/overview/overview_constants.h +++ b/ash/wm/overview/overview_constants.h
@@ -19,6 +19,11 @@ constexpr base::TimeDelta kWindowRestoreDurationCrOSNext = base::Milliseconds(350); +// Number of overview items needed to trigger the overview scroll layout. +constexpr int kMinimumItemsForNewLayoutInTablet = 6; +// TODO(b/286568408): Get clamshell layout number from UX. +constexpr int kMinimumItemsForNewLayoutInClamshell = 10; + // In the conceptual overview table, the horizontal space between two adjacent // items. constexpr int kHorizontalSpaceBetweenItemsDp = 10;
diff --git a/ash/wm/overview/overview_controller.cc b/ash/wm/overview/overview_controller.cc index 1413fdc..77d6a2c1 100644 --- a/ash/wm/overview/overview_controller.cc +++ b/ash/wm/overview/overview_controller.cc
@@ -539,11 +539,14 @@ // Unblur when animation is completed (or right away if there was no // delayed animation) unless it's canceled, in which case, we should keep - // the blur. Also resume the activation frame state. No need to unblur the - // wallpaper if the feature `kJellyroll` is enabled, since it's not blurred - // on overview started. + // the blur. No need to unblur the wallpaper if the feature `kJellyroll` is + // enabled, since it's not blurred on overview started. if (!canceled && !chromeos::features::IsJellyrollEnabled()) { overview_wallpaper_controller_->Unblur(); + } + + // Resume the activation frame state. + if (!canceled) { paint_as_active_lock_.reset(); }
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index dae5b3a..16b12a3 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -111,7 +111,9 @@ // Number of rows for windows in tablet overview mode. constexpr int kTabletLayoutRow = 2; -constexpr int kMinimumItemsForNewLayout = 6; +// Number of rows for windows in clamshell (scrolling) overview mode. +// TODO(b/286568408): Get feedback from UX on window height. +constexpr int kClamshellScrollRow = 2; constexpr int kTabletModeOverviewItemTopPaddingDp = 16; @@ -604,6 +606,20 @@ Shell::Get()->wallpaper_controller()->AddObserver(this); } +bool OverviewGrid::ShouldUseScrollingLayout(size_t ignored_items_size) const { + if (ShouldUseTabletModeGridLayout()) { + return window_list_.size() - ignored_items_size >= + kMinimumItemsForNewLayoutInTablet; + } + + if (features::IsOverviewScrollLayoutForClamshellEnabled()) { + return window_list_.size() - ignored_items_size >= + kMinimumItemsForNewLayoutInClamshell; + } + + return false; +} + void OverviewGrid::PositionWindows( bool animate, const base::flat_set<OverviewItem*>& ignored_items, @@ -613,11 +629,12 @@ DCHECK_NE(transition, OverviewTransition::kExit); + // If there are too many windows on the overview mode screen, the new + // scrolling layout can be shown. If in tablet mode, show the new + // layout by default. If in clamshell, only show if feature is enabled. std::vector<gfx::RectF> rects = - ShouldUseTabletModeGridLayout() && - (window_list_.size() - ignored_items.size() >= - kMinimumItemsForNewLayout) - ? GetWindowRectsForTabletModeLayout(ignored_items) + ShouldUseScrollingLayout(ignored_items.size()) + ? GetWindowRectsForScrollingLayout(ignored_items) : GetWindowRects(ignored_items); if (transition == OverviewTransition::kEnter) { @@ -1578,26 +1595,39 @@ void OverviewGrid::StartScroll() { Shell::Get()->overview_controller()->PauseOcclusionTracker(); - // Users are not allowed to scroll past the leftmost or rightmost bounds of - // the items on screen in the grid. |scroll_offset_min_| is the amount needed - // to fit the rightmost window into |total_bounds|. The max is zero which is - // default because windows are aligned to the left from the beginning. + // Users are not allowed to scroll past the bounds of the items on screen in + // the grid. `scroll_offset_min_` is the amount needed to fit either the + // rightmost window (tablet) or the bottommost window (clamshell) into + // `total_bounds`. The max is zero (default) because windows are aligned + // either to the left (tablet) or at the top (clamshell) from the beginning. + + // Logic involving `OverviewScrollLayoutForClamshell` replicates the tablet + // scroll behavior but also in the vertical direction in addition to + // horizontal. gfx::Rect total_bounds = GetGridEffectiveBounds(); total_bounds.Inset(GetGridInsetsImpl(total_bounds)); - float rightmost_window_right = 0; + float outer_window_edge = 0; for (const auto& item : window_list_) { const gfx::RectF bounds = item->target_bounds(); - if (rightmost_window_right < bounds.right()) - rightmost_window_right = bounds.right(); + // In tablet mode, the window with the furthest edge is the rightmost + // window but in clamshell it is the bottommost window. + float outer_bounds_edge = + ShouldUseTabletModeGridLayout() ? bounds.right() : bounds.bottom(); + if (outer_window_edge < outer_bounds_edge) { + outer_window_edge = outer_bounds_edge; + } item->set_scrolling_bounds(bounds); } - // |rightmost_window_right| may have been modified by an earlier scroll. - // |scroll_offset_| is added to adjust for that. - rightmost_window_right -= scroll_offset_; - scroll_offset_min_ = total_bounds.right() - rightmost_window_right; + // `outer_window_edge` may have been modified by an earlier scroll. + // `scroll_offset_` is added to adjust for that. + outer_window_edge -= scroll_offset_; + scroll_offset_min_ = + (ShouldUseTabletModeGridLayout() ? total_bounds.right() + : total_bounds.bottom()) - + outer_window_edge; if (scroll_offset_min_ > 0.f) scroll_offset_min_ = 0.f; @@ -1612,7 +1642,7 @@ new_scroll_offset = std::clamp(new_scroll_offset, scroll_offset_min_, 0.f); // For flings, we want to return false if we hit one of the edges, which is - // when |new_scroll_offset| is exactly 0.f or |scroll_offset_min_|. + // when `new_scroll_offset` is exactly 0.f or `scroll_offset_min_`. const bool in_range = new_scroll_offset < 0.f && new_scroll_offset > scroll_offset_min_; if (new_scroll_offset == scroll_offset_) @@ -1625,17 +1655,25 @@ DCHECK(scrolling_bounds_optional); const gfx::RectF previous_bounds = scrolling_bounds_optional.value(); gfx::RectF new_bounds = previous_bounds; - new_bounds.Offset(new_scroll_offset - scroll_offset_, 0.f); + // Apply the offset to the axis we are scrolling on. + ShouldUseTabletModeGridLayout() + ? new_bounds.Offset(new_scroll_offset - scroll_offset_, 0.f) + : new_bounds.Offset(0.f, new_scroll_offset - scroll_offset_); item->set_scrolling_bounds(new_bounds); if (gfx::RectF(GetGridEffectiveBounds()).Intersects(new_bounds) || gfx::RectF(GetGridEffectiveBounds()).Intersects(previous_bounds)) { item->SetBounds(new_bounds, OVERVIEW_ANIMATION_NONE); } } + // If in clamshell mode, restack the desk bar above the windows. + // Not needed in tablet as horizontal scrolls never overlap with desk bar. + if (desks_widget() && !ShouldUseTabletModeGridLayout()) { + desks_widget_->StackAtTop(); + } scroll_offset_ = new_scroll_offset; - DCHECK(presentation_time_recorder_); + CHECK(presentation_time_recorder_); presentation_time_recorder_->RequestNext(); return in_range; } @@ -2071,8 +2109,11 @@ // animation. If the visibility has changed, skip the bounds animation and use // the fade animation from above. Align the widget so it is visually aligned // with the first overview item. + // If `ShouldUseScrollingLayout()`, don't animate because it becomes + // distracting to the user to have the button animate behind moving windows. ScopedOverviewAnimationSettings settings( - visibility_changed || in_desk_animation + visibility_changed || in_desk_animation || + ShouldUseScrollingLayout(/*ignored_items=*/0) ? OVERVIEW_ANIMATION_NONE : OVERVIEW_ANIMATION_LAYOUT_OVERVIEW_ITEMS_IN_OVERVIEW, save_desk_button_container_widget_->GetNativeWindow()); @@ -2352,7 +2393,25 @@ return rects; } -std::vector<gfx::RectF> OverviewGrid::GetWindowRectsForTabletModeLayout( +void OverviewGrid::HandleMouseWheelScrollEvent(int scroll_offset) { + // Avoid unnecessary scrolling. + // TODO(sammiequon): Fix handling of ignored items. For now, pass 0 as the + // number of ignored items as there is at most one drop target per grid. + if (ShouldUseScrollingLayout(/*ignored_items_size=*/0)) { + StartScroll(); + UpdateScrollOffset(scroll_offset); + EndScroll(); + } +} + +std::vector<gfx::RectF> OverviewGrid::GetWindowRectsForScrollingLayout( + const base::flat_set<OverviewItem*>& ignored_items) { + return ShouldUseTabletModeGridLayout() + ? GetRectsForTabletScroll(ignored_items) + : GetRectsForClamshellScroll(ignored_items); +} + +std::vector<gfx::RectF> OverviewGrid::GetRectsForClamshellScroll( const base::flat_set<OverviewItem*>& ignored_items) { gfx::Rect total_bounds = GetGridEffectiveBounds(); // Windows occupy vertically centered area with additional vertical insets. @@ -2360,9 +2419,91 @@ total_bounds.Inset( gfx::Insets::TLBR(kTabletModeOverviewItemTopPaddingDp, 0, 0, 0)); - // |scroll_offset_min_| may be changed on positioning (either by closing - // windows or display changes). Recalculate it and clamp |scroll_offset_|, so - // that the items are always aligned left or right. + // `scroll_offset_min_` may be changed on positioning (either by closing + // windows or display changes). Recalculate it and clamp `scroll_offset_`, so + // items are always vertically aligned. + float bottommost_window_bottom_edge = 0; + for (const auto& item : window_list_) { + if (ShouldExcludeItemFromGridLayout(item.get(), ignored_items)) { + continue; + } + bottommost_window_bottom_edge = + std::max(bottommost_window_bottom_edge, item->target_bounds().bottom()); + } + + // `bottommost_window_bottom_edge` may have been modified by an earlier + // scroll. `scroll_offset_` is added to adjust for that. If + // `bottommost_window_bottom_edge` is less than `total_bounds.bottom()`, + // the grid cannot be scrolled. Set `scroll_offset_min_` to 0 so that + // `std::clamp()` is happy. + bottommost_window_bottom_edge -= scroll_offset_; + scroll_offset_min_ = total_bounds.bottom() - bottommost_window_bottom_edge; + if (scroll_offset_min_ > 0.f) { + scroll_offset_min_ = 0.f; + } + + scroll_offset_ = std::clamp(scroll_offset_, scroll_offset_min_, 0.f); + + // Map which contains `curr_num_rows` entries with information on the last + // items right bound per row. Used to place the next item directly next to the + // last item. The key is the y-value of the row and the value is the rightmost + // x-value. + int curr_num_rows = 1; + base::flat_map<float, float> right_edge_map; + + // There is no restriction on the number of rows. Need feedback from UX on + // window sizes for this new layout. For now, use the same logic as in tablet + // mode for calculating the height of each window. The most recently used + // windows are displayed first. When the dragged item becomes an + // `ignored_item`, move the other windows accordingly. `window_position` + // matches the positions of the windows' indexes from `window_list_`. + // However, if a window turns out to be an ignored item, `window_position` + // remains where the item was as to then reposition the other window's bounds + // in place of that item. + const int height = (total_bounds.height() - ((kClamshellScrollRow - 1) * + kVerticalSpaceBetweenItemsDp)) / + kClamshellScrollRow; + std::vector<gfx::RectF> rects; + for (const auto& window : window_list_) { + OverviewItem* item = window.get(); + if (ShouldExcludeItemFromGridLayout(item, ignored_items)) { + rects.emplace_back(); + continue; + } + + // Calculate the width, x, and y of the item. + const int width = CalculateWidthAndMaybeSetUnclippedBounds(item, height); + int y = (height + kVerticalSpaceBetweenItemsDp) * (curr_num_rows - 1) + + total_bounds.y() + scroll_offset_; + int x = right_edge_map.contains(y) ? right_edge_map[y] : total_bounds.x(); + + // The windows should not exceed the right edge of `total_bounds`. + if ((x + width + kHorizontalSpaceBetweenItemsDp) > total_bounds.right()) { + curr_num_rows++; + y += height + kVerticalSpaceBetweenItemsDp; + x = total_bounds.x(); + } + + // Update `right_edge_map` for calculating x and y for the next item. + right_edge_map[y] = x + width + kHorizontalSpaceBetweenItemsDp; + CHECK_LE(static_cast<int>(right_edge_map.size()), curr_num_rows); + rects.emplace_back(x, y, width, height); + } + + return rects; +} + +std::vector<gfx::RectF> OverviewGrid::GetRectsForTabletScroll( + const base::flat_set<OverviewItem*>& ignored_items) { + gfx::Rect total_bounds = GetGridEffectiveBounds(); + // Windows occupy vertically centered area with additional vertical insets. + total_bounds.Inset(GetGridInsetsImpl(total_bounds)); + total_bounds.Inset( + gfx::Insets::TLBR(kTabletModeOverviewItemTopPaddingDp, 0, 0, 0)); + + // `scroll_offset_min_` may be changed on positioning (either by closing + // windows or display changes). Recalculate it and clamp `scroll_offset_`, so + // items are always aligned left or right. float rightmost_window_right = 0; for (const auto& item : window_list_) { if (ShouldExcludeItemFromGridLayout(item.get(), ignored_items)) @@ -2382,7 +2523,7 @@ scroll_offset_ = std::clamp(scroll_offset_, scroll_offset_min_, 0.f); - // Map which contains up to |kTabletLayoutRow| entries with information on the + // Map which contains up to `kTabletLayoutRow` entries with information on the // last items right bound per row. Used so we can place the next item directly // next to the last item. The key is the y-value of the row, and the value is // the rightmost x-value. @@ -2390,10 +2531,10 @@ // Since the number of rows is limited, windows are laid out column-wise so // that the most recently used windows are displayed first. When the dragged - // item becomes an |ignored_item|, move the other windows accordingly. - // |window_position| matches the positions of the windows' indexes from - // |window_list_|. However, if a window turns out to be an ignored item, - // |window_position| remains where the item was as to then reposition the + // item becomes an `ignored_item`, move the other windows accordingly. + // `window_position` matches the positions of the windows' indexes from + // `window_list_`. However, if a window turns out to be an ignored item, + // `window_position` remains where the item was as to then reposition the // other window's bounds in place of that item. const int height = (total_bounds.height() - ((kTabletLayoutRow - 1) * kVerticalSpaceBetweenItemsDp)) /
diff --git a/ash/wm/overview/overview_grid.h b/ash/wm/overview/overview_grid.h index a77516f..b440e45 100644 --- a/ash/wm/overview/overview_grid.h +++ b/ash/wm/overview/overview_grid.h
@@ -90,6 +90,15 @@ // exist. OverviewItem* GetOverviewItemContaining(const aura::Window* window) const; + // TODO(b/285408040): Handle two finger scroll and make it smooth. + void HandleMouseWheelScrollEvent(int scroll_offset); + + // Check if in tablet mode or the new clamshell scroll layout feature is + // enabled. If so, the visible windows on the overview screen exceed + // `kMinimumItemsForNewLayoutInClamshell` or + // `kMinimumItemsForNewLayoutInTablet` thereby cluttering the overview screen. + bool ShouldUseScrollingLayout(size_t ignored_items_size) const; + // Adds |window| at the specified |index|. |window| cannot already be on the // grid. If |reposition| is true, repositions all items except those in // |ignored_items|. If |animate| is true, animates the repositioning. @@ -484,22 +493,31 @@ std::vector<gfx::RectF> GetWindowRects( const base::flat_set<OverviewItem*>& ignored_items); - // Gets the layout of the overview items. Currently only for tablet mode. - // Positions up to six windows into two rows of equal height, scaling each - // window to fit that height. Additional windows are placed off-screen. - // |ignored_items| won't be shown along with the other windows in overview - // mode. - std::vector<gfx::RectF> GetWindowRectsForTabletModeLayout( + // Gets the layout of the overview items. Positions up to six windows into + // two rows of equal height, scaling each window to fit that height. + // Additional windows are placed off-screen. |ignored_items| won't be shown + // along with the other windows in overview mode. If + // `IsOverviewScrollLayoutForClamshellEnabled`, then the behavior is + // replicated but in the vertical direction for clamshell mode. + // TODO(b/286869951): Reduce duplication once clamshell scrolling is + // finalized. + std::vector<gfx::RectF> GetWindowRectsForScrollingLayout( const base::flat_set<OverviewItem*>& ignored_items); - // Attempts to fit all |out_rects| inside |bounds|. The method ensures that - // the |out_rects| vector has appropriate size and populates it with the + std::vector<gfx::RectF> GetRectsForClamshellScroll( + const base::flat_set<OverviewItem*>& ignored_items); + + std::vector<gfx::RectF> GetRectsForTabletScroll( + const base::flat_set<OverviewItem*>& ignored_items); + + // Attempts to fit all `out_rects` inside `bounds`. The method ensures that + // the `out_rects` vector has appropriate size and populates it with the // values placing rects next to each other left-to-right in rows of equal - // |height|. While fitting |out_rects| several metrics are collected that can - // be used by the caller. |out_max_bottom| specifies the bottom that the rects - // are extending to. |out_min_right| and |out_max_right| report the right + // `height`. While fitting `out_rects` several metrics are collected that can + // be used by the caller. `out_max_bottom` specifies the bottom that the rects + // are extending to. `out_min_right` and `out_max_right` report the right // bound of the narrowest and the widest rows respectively. In-values of the - // |out_max_bottom|, |out_min_right| and |out_max_right| parameters are + // `out_max_bottom`, `out_min_right` and `out_max_right` parameters are // ignored and their values are always initialized inside this method. Returns // true on success and false otherwise. bool FitWindowRectsInBounds( @@ -601,12 +619,13 @@ // reposition windows in tablet overview mode. bool suspend_reposition_ = false; - // Used by |GetWindowRectsForTabletModeLayout| to shift the x position of the - // overview items. + // Used by `GetWindowRectsForScrollingLayout` to shift the x position of the + // overview items and y position if + // `IsOverviewScrollLayoutForClamshellEnabled`. float scroll_offset_ = 0; - // Value to clamp |scroll_offset| so scrolling stays limited to windows that - // are visible in tablet overview mode. + // Value to clamp `scroll_offset` so scrolling stays limited to windows that + // are visible in the new scrolling layout for overview mode. float scroll_offset_min_ = 0.f; // Handles events that are not handled by the OverviewItems.
diff --git a/ash/wm/overview/overview_grid_event_handler.cc b/ash/wm/overview/overview_grid_event_handler.cc index ec4eb31..84b7e03b 100644 --- a/ash/wm/overview/overview_grid_event_handler.cc +++ b/ash/wm/overview/overview_grid_event_handler.cc
@@ -71,6 +71,10 @@ return; } + if (event->type() == ui::ET_MOUSEWHEEL) { + grid_->HandleMouseWheelScrollEvent(event->AsMouseWheelEvent()->y_offset()); + } + if (event->type() == ui::ET_MOUSE_RELEASED) HandleClickOrTap(event); }
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc index acdb172..48bf8fce 100644 --- a/ash/wm/overview/overview_item.cc +++ b/ash/wm/overview/overview_item.cc
@@ -15,6 +15,7 @@ #include "ash/strings/grit/ash_strings.h" #include "ash/style/rounded_label_widget.h" #include "ash/style/system_shadow.h" +#include "ash/wm/desks/desk_bar_controller.h" #include "ash/wm/desks/desks_util.h" #include "ash/wm/desks/templates/saved_desk_animations.h" #include "ash/wm/drag_window_controller.h" @@ -681,6 +682,7 @@ aura::Window* window = GetWindow(); aura::Window* parent_window = window->parent(); aura::Window* stacking_target = nullptr; + // Stack |window| below the split view window if split view is active. SplitViewController* split_view_controller = SplitViewController::Get(root_window_);
diff --git a/ash/wm/overview/overview_item_view.cc b/ash/wm/overview/overview_item_view.cc index fa70c3c..ce00c05f 100644 --- a/ash/wm/overview/overview_item_view.cc +++ b/ash/wm/overview/overview_item_view.cc
@@ -305,6 +305,15 @@ return true; } +bool OverviewItemView::OnMouseWheel(const ui::MouseWheelEvent& event) { + if (!overview_item_) { + return false; + } + overview_item_->overview_grid()->HandleMouseWheelScrollEvent( + event.y_offset()); + return true; +} + void OverviewItemView::OnMouseReleased(const ui::MouseEvent& event) { if (!overview_item_) { views::View::OnMouseReleased(event);
diff --git a/ash/wm/overview/overview_item_view.h b/ash/wm/overview/overview_item_view.h index 7b22554..d0c7ba6 100644 --- a/ash/wm/overview/overview_item_view.h +++ b/ash/wm/overview/overview_item_view.h
@@ -90,6 +90,7 @@ protected: // views::View: bool OnMousePressed(const ui::MouseEvent& event) override; + bool OnMouseWheel(const ui::MouseWheelEvent& event) override; bool OnMouseDragged(const ui::MouseEvent& event) override; void OnMouseReleased(const ui::MouseEvent& event) override; void OnGestureEvent(ui::GestureEvent* event) override;
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 3b0a6a1..46275bf 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -84,6 +84,7 @@ #include "base/test/metrics/user_action_tester.h" #include "base/test/scoped_feature_list.h" #include "base/time/time.h" +#include "chromeos/constants/chromeos_features.h" #include "chromeos/ui/wm/features.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/window_types.h" @@ -3680,24 +3681,6 @@ GetEventGenerator()->GestureScrollSequence(start, end, base::Milliseconds(100), 1000); } - - void DispatchLongPress(OverviewItem* item) { - const gfx::Point point = - gfx::ToRoundedPoint(item->target_bounds().CenterPoint()); - ui::GestureEvent long_press( - point.x(), point.y(), 0, base::TimeTicks::Now(), - ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); - GetEventGenerator()->Dispatch(&long_press); - } - - // Creates |n| test windows. They are created in reverse order, so that the - // first window in the vector is the MRU window. - std::vector<std::unique_ptr<aura::Window>> CreateTestWindows(int n) { - std::vector<std::unique_ptr<aura::Window>> windows(n); - for (int i = n - 1; i >= 0; --i) - windows[i] = CreateTestWindow(); - return windows; - } }; // Tests that windows are in proper positions in the new overview layout. @@ -3978,6 +3961,255 @@ EXPECT_TRUE(WindowState::Get(window.get())->IsSnapped()); } +class ClamshellScrollOverviewSessionTest : public OverviewTestBase { + public: + ClamshellScrollOverviewSessionTest() = default; + ClamshellScrollOverviewSessionTest( + const ClamshellScrollOverviewSessionTest&) = delete; + ClamshellScrollOverviewSessionTest& operator=( + const ClamshellScrollOverviewSessionTest&) = delete; + ~ClamshellScrollOverviewSessionTest() override = default; + + // OverviewTestBase: + void SetUp() override { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{features::kOverviewScrollLayoutForClamshell, + chromeos::features::kJelly}, + /*disabled_features=*/{}); + OverviewTestBase::SetUp(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +// Tests that when 10 windows are open, the scrolling layout for +// overview mode in clamshell has some of the windows offscreen. +TEST_F(ClamshellScrollOverviewSessionTest, CheckManyWindowsOffScreen) { + auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell); + ToggleOverview(); + ASSERT_TRUE(InOverviewSession()); + + OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get()); + OverviewItem* item1 = GetOverviewItemForWindow(windows[1].get()); + OverviewItem* item8 = GetOverviewItemForWindow(windows[8].get()); + OverviewItem* item9 = GetOverviewItemForWindow(windows[9].get()); + + const gfx::RectF screen_bounds(GetGridBounds()); + const gfx::RectF item0_bounds = item0->target_bounds(); + const gfx::RectF item1_bounds = item1->target_bounds(); + const gfx::RectF item8_bounds = item8->target_bounds(); + const gfx::RectF item9_bounds = item9->target_bounds(); + + // `item0` should be within `screen_bounds`. + EXPECT_TRUE(screen_bounds.Contains(item0_bounds)); + + // `item1` should be within `screen_bounds`. + EXPECT_TRUE(screen_bounds.Contains(item1_bounds)); + + // `item9` should not be within `screen_bounds` but it should have an + // x value within `screen_bounds`. + EXPECT_FALSE(screen_bounds.Contains(item8_bounds)); + EXPECT_GT(item9_bounds.x(), screen_bounds.x()); + EXPECT_LT(item9_bounds.x(), screen_bounds.x() + screen_bounds.width()); + + // `item8` should not be within `screen_bounds` but it should have an + // x value within `screen_bounds`. + EXPECT_FALSE(screen_bounds.Contains(item9_bounds)); + EXPECT_GT(item8_bounds.x(), screen_bounds.x()); + EXPECT_LT(item8_bounds.x(), screen_bounds.x() + screen_bounds.width()); +} + +// Tests that when 4 windows are open, the scrolling layout for +// overview mode in clamshell has all of the windows onscreen. +TEST_F(ClamshellScrollOverviewSessionTest, CheckFewWindowsOnScreen) { + auto windows = CreateTestWindows(4); + ToggleOverview(); + ASSERT_TRUE(InOverviewSession()); + + OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get()); + OverviewItem* item1 = GetOverviewItemForWindow(windows[1].get()); + OverviewItem* item2 = GetOverviewItemForWindow(windows[2].get()); + OverviewItem* item3 = GetOverviewItemForWindow(windows[3].get()); + + const gfx::RectF screen_bounds(GetGridBounds()); + const gfx::RectF item0_bounds = item0->target_bounds(); + const gfx::RectF item1_bounds = item1->target_bounds(); + const gfx::RectF item2_bounds = item2->target_bounds(); + const gfx::RectF item3_bounds = item3->target_bounds(); + + // All items should be within `screen_bounds`. + EXPECT_TRUE(screen_bounds.Contains(item0_bounds)); + EXPECT_TRUE(screen_bounds.Contains(item1_bounds)); + EXPECT_TRUE(screen_bounds.Contains(item2_bounds)); + EXPECT_TRUE(screen_bounds.Contains(item3_bounds)); +} + +// Tests that windows cannot be scrolled if all windows fit on screen. +TEST_F(ClamshellScrollOverviewSessionTest, CheckNoOverviewItemShift) { + auto windows = CreateTestWindows(4); + ToggleOverview(); + ASSERT_TRUE(InOverviewSession()); + + OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get()); + const gfx::RectF before_shift_bounds = item0->target_bounds(); + + GetEventGenerator()->MoveMouseTo(GetGridBounds().width(), + GetGridBounds().height()); + GetEventGenerator()->MoveMouseWheel(0, -200); + + EXPECT_EQ(before_shift_bounds, item0->target_bounds()); +} + +// Tests to see that windows can be scrolled if at least one window is +// partially/completely positioned offscreen. +TEST_F(ClamshellScrollOverviewSessionTest, CheckOverviewItemShift) { + auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell); + ToggleOverview(); + ASSERT_TRUE(InOverviewSession()); + + OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get()); + const gfx::RectF before_shift_bounds = item0->target_bounds(); + + GetEventGenerator()->MoveMouseTo(GetGridBounds().width(), + GetGridBounds().height()); + GetEventGenerator()->MoveMouseWheel(0, -200); + + EXPECT_LT(item0->target_bounds().y(), before_shift_bounds.y()); +} + +// Tests to see if windows remain in bounds after scrolling extremely far. +TEST_F(ClamshellScrollOverviewSessionTest, CheckOverviewItemScrollingBounds) { + auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell); + ToggleOverview(); + ASSERT_TRUE(InOverviewSession()); + + // Scroll an extreme amount to see if windows at the top are still in + // bounds. First, align the top window (`windows[0]`) to the top bound + // and store the item's location. Then, scroll a far amount and check + // to see if the item moved at all. + OverviewItem* top_window = GetOverviewItemForWindow(windows[0].get()); + + GetEventGenerator()->MoveMouseTo(GetGridBounds().width(), + GetGridBounds().height()); + GetEventGenerator()->MoveMouseWheel(0, -500); + + const gfx::RectF top_bounds = top_window->target_bounds(); + GetEventGenerator()->MoveMouseWheel(0, -500); + EXPECT_EQ(top_bounds, top_window->target_bounds()); + + // Scroll an extreme amount to see if windows on the bottom are still in + // bounds. First, align the bottom window (`windows[7]`) to the bottom + // bound and store the item's location. Then, scroll a far amount and + // check to see if the item moved at all. + OverviewItem* bottom_window = GetOverviewItemForWindow(windows[7].get()); + GetEventGenerator()->MoveMouseWheel(0, 500); + const gfx::RectF bottom_bounds = bottom_window->target_bounds(); + GetEventGenerator()->MoveMouseWheel(0, 500); + EXPECT_EQ(bottom_bounds, bottom_window->target_bounds()); +} + +// Test that overview widgets are stacked underneath the desk bar widget +// when scrolling vertically in overview mode. +TEST_F(ClamshellScrollOverviewSessionTest, + OverviewWidgetsAreStackedUnderDeskBar) { + auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell); + ToggleOverview(); + auto* desk_bar_view = + GetOverviewGridForRoot(Shell::Get()->GetPrimaryRootWindow()) + ->desks_bar_view(); + auto* top_window = GetOverviewItemForWindow(windows[0].get()); + ASSERT_TRUE(InOverviewSession()); + + // Ensure the two windows in question share the same root window. + ASSERT_EQ(top_window->root_window(), desk_bar_view->root()); + + // Before we start scrolling, the items have not been restacked. + // So, check that the overview item is still stacked in front of the desk bar + // like the default behavior expects. + EXPECT_FALSE(window_util::IsStackedBelow( + top_window->item_widget()->GetNativeWindow(), + desk_bar_view->GetWidget()->GetNativeWindow())); + + // Scroll so the overview widget gets restacked. + GetEventGenerator()->MoveMouseTo(GetGridBounds().width(), + GetGridBounds().height()); + GetEventGenerator()->MoveMouseWheel(0, -100); + + EXPECT_TRUE(window_util::IsStackedBelow( + top_window->item_widget()->GetNativeWindow(), + desk_bar_view->GetWidget()->GetNativeWindow())); +} + +// Test scrolling behavior when floated and minimized windows are present. +TEST_F(ClamshellScrollOverviewSessionTest, + CheckOverviewScrollWithFloatedWindow) { + auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell); + + // Create a floated, non-floated active, and minimized window. + auto active_window = CreateAppWindow(); + auto minimized_window = CreateAppWindow(); + auto floated_window = CreateAppWindow(); + + // Confirm floated window. + PressAndReleaseKey(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN); + ASSERT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); + + ToggleOverview(); + ASSERT_TRUE(InOverviewSession()); + + auto* desk_bar_view = + GetOverviewGridForRoot(Shell::Get()->GetPrimaryRootWindow()) + ->desks_bar_view(); + OverviewItem* floated_window_item = + GetOverviewItemForWindow(floated_window.get()); + OverviewItem* active_window_item = + GetOverviewItemForWindow(active_window.get()); + OverviewItem* minimized_window_item = + GetOverviewItemForWindow(minimized_window.get()); + + const gfx::RectF float_before_shift_bounds = + floated_window_item->target_bounds(); + const gfx::RectF active_before_shift_bounds = + active_window_item->target_bounds(); + const gfx::RectF minimized_before_shift_bounds = + minimized_window_item->target_bounds(); + + // Ensure the non-floated windows share the same root window. Floated windows + // are parented to a different container and guaranteed be below the desk bar. + ASSERT_EQ(active_window_item->root_window(), desk_bar_view->root()); + ASSERT_EQ(minimized_window_item->root_window(), desk_bar_view->root()); + + // Before we start scrolling, the items have not been restacked. + EXPECT_FALSE(window_util::IsStackedBelow( + active_window_item->item_widget()->GetNativeWindow(), + desk_bar_view->GetWidget()->GetNativeWindow())); + EXPECT_FALSE(window_util::IsStackedBelow( + minimized_window_item->item_widget()->GetNativeWindow(), + desk_bar_view->GetWidget()->GetNativeWindow())); + + // Scroll so the overview widget gets restacked. + GetEventGenerator()->MoveMouseTo(GetGridBounds().width(), + GetGridBounds().height()); + GetEventGenerator()->MoveMouseWheel(0, -100); + + // Check windows are stacked below the desk bar. + EXPECT_TRUE(window_util::IsStackedBelow( + active_window_item->item_widget()->GetNativeWindow(), + desk_bar_view->GetWidget()->GetNativeWindow())); + EXPECT_TRUE(window_util::IsStackedBelow( + minimized_window_item->item_widget()->GetNativeWindow(), + desk_bar_view->GetWidget()->GetNativeWindow())); + + // Check windows have been re-positioned. + EXPECT_LT(floated_window_item->target_bounds().y(), + float_before_shift_bounds.y()); + EXPECT_LT(active_window_item->target_bounds().y(), + active_before_shift_bounds.y()); + EXPECT_LT(minimized_window_item->target_bounds().y(), + minimized_before_shift_bounds.y()); +} + // A unique test class for testing flings in overview as those rely on observing // compositor animations which require a mock time task environment. class OverviewSessionFlingTest : public AshTestBase {
diff --git a/ash/wm/overview/overview_test_base.cc b/ash/wm/overview/overview_test_base.cc index 4c94a8a1..9225ff47 100644 --- a/ash/wm/overview/overview_test_base.cc +++ b/ash/wm/overview/overview_test_base.cc
@@ -49,6 +49,24 @@ return GetOverviewController()->InOverviewSession(); } +void OverviewTestBase::DispatchLongPress(OverviewItem* item) { + const gfx::Point point = + gfx::ToRoundedPoint(item->target_bounds().CenterPoint()); + ui::GestureEvent long_press( + point.x(), point.y(), 0, base::TimeTicks::Now(), + ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); + GetEventGenerator()->Dispatch(&long_press); +} + +std::vector<std::unique_ptr<aura::Window>> OverviewTestBase::CreateTestWindows( + int n) { + std::vector<std::unique_ptr<aura::Window>> windows(n); + for (int i = n - 1; i >= 0; --i) { + windows[i] = CreateTestWindow(); + } + return windows; +} + bool OverviewTestBase::WindowsOverlapping(aura::Window* window1, aura::Window* window2) { const gfx::Rect window1_bounds = GetTransformedTargetBounds(window1);
diff --git a/ash/wm/overview/overview_test_base.h b/ash/wm/overview/overview_test_base.h index f4cc1c40..086a16e1 100644 --- a/ash/wm/overview/overview_test_base.h +++ b/ash/wm/overview/overview_test_base.h
@@ -46,6 +46,12 @@ bool InOverviewSession(); + void DispatchLongPress(OverviewItem* item); + + // Creates `n` test windows. They are created in reverse order, so that the + // first window in the vector is the MRU window. + std::vector<std::unique_ptr<aura::Window>> CreateTestWindows(int n); + bool WindowsOverlapping(aura::Window* window1, aura::Window* window2); // Creates a window which cannot be snapped by splitview.
diff --git a/base/fuchsia/filtered_service_directory.cc b/base/fuchsia/filtered_service_directory.cc index 8115351..6e0bc77 100644 --- a/base/fuchsia/filtered_service_directory.cc +++ b/base/fuchsia/filtered_service_directory.cc
@@ -5,6 +5,8 @@ #include "base/fuchsia/filtered_service_directory.h" #include <lib/async/default.h> +#include <lib/vfs/cpp/pseudo_dir.h> +#include <lib/vfs/cpp/service.h> #include <utility> #include "base/fuchsia/fuchsia_logging.h"
diff --git a/base/tracing/protos/chrome_track_event.proto b/base/tracing/protos/chrome_track_event.proto index cb4c176..04f0ac5 100644 --- a/base/tracing/protos/chrome_track_event.proto +++ b/base/tracing/protos/chrome_track_event.proto
@@ -936,6 +936,9 @@ UI_USER_BLOCKING_DEFERRABLE_TQ = 52; IO_USER_BLOCKING_DEFERRABLE_TQ = 53; + + UI_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ = 54; + IO_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ = 55; } optional Priority priority = 1;
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 8048fec..771b967 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -13.20230613.2.1 +13.20230613.3.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni index cd429cf..9ab7aaf 100644 --- a/buildtools/deps_revisions.gni +++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@ declare_args() { # Used to cause full rebuilds on libc++ rolls. This should be kept in sync # with the libcxx_revision vars in //DEPS. - libcxx_revision = "38a8ad0f7ea659edb28a57dfd59a7e5399dabeab" + libcxx_revision = "055b2e17ae4f0e2c025ad0c7508b01787df17758" }
diff --git a/buildtools/third_party/libc++/BUILD.gn b/buildtools/third_party/libc++/BUILD.gn index 306b38c..027ed52 100644 --- a/buildtools/third_party/libc++/BUILD.gn +++ b/buildtools/third_party/libc++/BUILD.gn
@@ -81,6 +81,7 @@ "trunk/src/condition_variable.cpp", "trunk/src/condition_variable_destructor.cpp", "trunk/src/exception.cpp", + "trunk/src/format.cpp", "trunk/src/functional.cpp", "trunk/src/future.cpp", "trunk/src/hash.cpp",
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc index c2cf44e..b4c8367 100644 --- a/cc/layers/heads_up_display_layer_impl.cc +++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -862,15 +862,12 @@ int width) const { std::string status; SkColor color = SK_ColorRED; - switch (layer_tree_impl()->GetGpuRasterizationStatus()) { - case GpuRasterizationStatus::ON: - status = "on"; - color = SK_ColorGREEN; - break; - case GpuRasterizationStatus::OFF_DEVICE: - status = "off"; - color = SK_ColorRED; - break; + if (layer_tree_impl()->use_gpu_rasterization()) { + status = "on"; + color = SK_ColorGREEN; + } else { + status = "off"; + color = SK_ColorRED; } if (status.empty())
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index 0ea2bf4..0a94be3 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -5494,8 +5494,7 @@ gfx::Size result; host_impl()->CommitComplete(); - EXPECT_EQ(host_impl()->gpu_rasterization_status(), - GpuRasterizationStatus::OFF_DEVICE); + EXPECT_FALSE(host_impl()->use_gpu_rasterization()); host_impl()->NotifyReadyToActivate(); // Default tile-size for large layers. @@ -5525,8 +5524,7 @@ // Gpu-rasterization uses 25% viewport-height tiles. // The +2's below are for border texels. - EXPECT_EQ(host_impl()->gpu_rasterization_status(), - GpuRasterizationStatus::ON); + EXPECT_TRUE(host_impl()->use_gpu_rasterization()); host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(2000, 2000)); host_impl()->NotifyReadyToActivate(); @@ -5570,8 +5568,7 @@ constexpr int kMaxTextureSize = 2048; // Gpu-RawDraw-rasterization uses 100% // std::max({viewport-width, viewport-height, 2280}) tiles. - EXPECT_EQ(host_impl()->gpu_rasterization_status(), - GpuRasterizationStatus::ON); + EXPECT_TRUE(host_impl()->use_gpu_rasterization()); gfx::Rect viewport_rect(2000, 2000); host_impl()->active_tree()->SetDeviceViewportRect(viewport_rect); layer->set_gpu_raster_max_texture_size(viewport_rect.size()); @@ -5609,8 +5606,7 @@ gfx::Size result; host_impl()->CommitComplete(); - EXPECT_EQ(host_impl()->gpu_rasterization_status(), - GpuRasterizationStatus::ON); + EXPECT_TRUE(host_impl()->use_gpu_rasterization()); host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(2000, 2000)); host_impl()->NotifyReadyToActivate();
diff --git a/cc/paint/decode_stashing_image_provider.h b/cc/paint/decode_stashing_image_provider.h index a9b8cb28..ceede107 100644 --- a/cc/paint/decode_stashing_image_provider.h +++ b/cc/paint/decode_stashing_image_provider.h
@@ -6,7 +6,7 @@ #define CC_PAINT_DECODE_STASHING_IMAGE_PROVIDER_H_ #include "base/containers/stack_container.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "cc/paint/image_provider.h" #include "cc/paint/paint_export.h" @@ -33,9 +33,7 @@ void Reset(); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION ImageProvider* source_provider_; + raw_ptr<ImageProvider> source_provider_; base::StackVector<ScopedResult, 1> decoded_images_; };
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 3eaa993..258a66d 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -1993,12 +1993,7 @@ } if (display_list->HasNonAAPaint()) { - UMA_HISTOGRAM_BOOLEAN("GPU.SupportsDisableMsaa", - raster_caps().supports_disable_msaa); - if (!raster_caps().supports_disable_msaa || - raster_caps().use_dmsaa_for_tiles) { - return 0; - } + return 0; } return RequestedMSAASampleCount(); @@ -2676,11 +2671,7 @@ TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); active_tree_->hud_layer()->UpdateHudTexture( draw_mode, layer_tree_frame_sink_, &resource_provider_, - // The hud uses Gpu rasterization if the device is capable, not related - // to the content of the web page. - raster_caps().gpu_rasterization_status != - GpuRasterizationStatus::OFF_DEVICE, - frame->render_passes); + raster_caps().use_gpu_rasterization, frame->render_passes); } viz::CompositorFrameMetadata metadata = MakeCompositorFrameMetadata(); @@ -2907,30 +2898,20 @@ DCHECK(caps.supports_oop_raster); gpu_caps.can_use_msaa = !caps.msaa_is_slow && !caps.avoid_stencil_buffers; - gpu_caps.supports_disable_msaa = caps.multisample_compatibility; }(new_raster_caps); - if (!new_raster_caps.use_gpu_rasterization) { - raster_caps_.gpu_rasterization_status = GpuRasterizationStatus::OFF_DEVICE; - } else { - raster_caps_.gpu_rasterization_status = GpuRasterizationStatus::ON; - } - // Changes in MSAA settings require that we re-raster resources for the // settings to take effect. But we don't need to trigger any raster // invalidation in this case since these settings change only if the context // changed. In this case we already re-allocate and re-raster all resources. if (new_raster_caps.use_gpu_rasterization == raster_caps().use_gpu_rasterization && - new_raster_caps.can_use_msaa == raster_caps().can_use_msaa && - new_raster_caps.supports_disable_msaa == - raster_caps().supports_disable_msaa) { + new_raster_caps.can_use_msaa == raster_caps().can_use_msaa) { return false; } raster_caps_.use_gpu_rasterization = new_raster_caps.use_gpu_rasterization; raster_caps_.can_use_msaa = new_raster_caps.can_use_msaa; - raster_caps_.supports_disable_msaa = new_raster_caps.supports_disable_msaa; return true; }
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 27866cc..63418e8 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -602,10 +602,6 @@ return raster_caps().use_gpu_rasterization; } - GpuRasterizationStatus gpu_rasterization_status() const { - return raster_caps().gpu_rasterization_status; - } - bool create_low_res_tiling() const { return settings_.create_low_res_tiling && !raster_caps().use_gpu_rasterization;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 80eca8f3..59bf0ca 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -16068,23 +16068,6 @@ EXPECT_FALSE(host_impl_->can_use_msaa()); } -class MsaaCompatibilityLayerTreeHostImplTest : public LayerTreeHostImplTest { - public: - void CreateHostImplWithMultisampleCompatibility( - bool support_multisample_compatibility) { - LayerTreeSettings settings = DefaultSettings(); - settings.gpu_rasterization_msaa_sample_count = 4; - auto frame_sink = - FakeLayerTreeFrameSink::Builder() - .AllContexts( - &viz::TestRasterInterface::set_multisample_compatibility, - support_multisample_compatibility) - .AllContexts(&viz::TestRasterInterface::set_gpu_rasterization, true) - .Build(); - EXPECT_TRUE(CreateHostImpl(settings, std::move(frame_sink))); - } -}; - TEST_P(ScrollUnifiedLayerTreeHostImplTest, UpdatePageScaleFactorOnActiveTree) { // Check page scale factor updates the property trees when an update is made // on the active tree.
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index bfe2e6b..bfc2cb6d 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -6786,10 +6786,8 @@ viz::TestContextProvider* worker_provider) override { auto* compositor = context_provider->UnboundTestRasterInterface(); compositor->set_gpu_rasterization(true); - compositor->set_multisample_compatibility(false); auto* worker = worker_provider->UnboundTestRasterInterface(); worker->set_gpu_rasterization(true); - worker->set_multisample_compatibility(false); } void InitializeSettings(LayerTreeSettings* settings) override {
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index bc56a0eb..44984b4c0 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -1971,10 +1971,6 @@ return host_impl_->use_gpu_rasterization(); } -GpuRasterizationStatus LayerTreeImpl::GetGpuRasterizationStatus() const { - return host_impl_->gpu_rasterization_status(); -} - bool LayerTreeImpl::create_low_res_tiling() const { return host_impl_->create_low_res_tiling(); }
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index 390ef76..7a652c1 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -153,7 +153,6 @@ float initial_opacity); void DidAnimateScrollOffset(); bool use_gpu_rasterization() const; - GpuRasterizationStatus GetGpuRasterizationStatus() const; bool create_low_res_tiling() const; bool RequiresHighResToDraw() const; bool SmoothnessTakesPriority() const;
diff --git a/cc/trees/raster_capabilities.h b/cc/trees/raster_capabilities.h index 92c6a2d..3815d8f0 100644 --- a/cc/trees/raster_capabilities.h +++ b/cc/trees/raster_capabilities.h
@@ -9,28 +9,21 @@ namespace cc { -enum class GpuRasterizationStatus { - ON, - OFF_DEVICE, -}; - struct CC_EXPORT RasterCapabilities { RasterCapabilities() = default; RasterCapabilities(const RasterCapabilities& other) = delete; RasterCapabilities& operator=(const RasterCapabilities& other) = delete; ~RasterCapabilities() = default; - bool can_use_msaa = false; - bool supports_disable_msaa = false; - bool need_update_gpu_rasterization_status = false; bool use_gpu_rasterization = false; - GpuRasterizationStatus gpu_rasterization_status = - GpuRasterizationStatus::OFF_DEVICE; + + bool can_use_msaa = false; + bool use_dmsaa_for_tiles = false; + // The maximum size (either width or height) that any texture can be. Also // holds a reasonable value for software compositing bitmaps. int max_texture_size = 0; - bool use_dmsaa_for_tiles = false; }; } // namespace cc
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java index 1e7d176..60fd1ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
@@ -1116,10 +1116,9 @@ // ImprovedBookmarkRow methods. private void resolveIconForBookmark(BookmarkItem item, PropertyModel model) { - @BookmarkRowDisplayPref - int displayPref = mBookmarkUiPrefs.getBookmarkRowDisplayPref(); - boolean useImages = BookmarkFeatures.isAndroidImprovedBookmarksEnabled() - && displayPref == BookmarkRowDisplayPref.VISUAL; + final @BookmarkRowDisplayPref int displayPref = + mBookmarkUiPrefs.getBookmarkRowDisplayPref(); + boolean useImages = displayPref == BookmarkRowDisplayPref.VISUAL; model.set(ImprovedBookmarkRowProperties.START_IMAGE_VISIBILITY, item.isFolder() && useImages ? StartImageVisibility.FOLDER_DRAWABLE : StartImageVisibility.DRAWABLE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS index fc1ef52..aa90d3a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS +++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS
@@ -1 +1,4 @@ -file://chrome/browser/android/survey/OWNERS +wenyufu@chromium.org + +#Backup +twellington@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java index c310729..0a45757 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java
@@ -32,7 +32,7 @@ } @VisibleForTesting - static void setInstanceForTesting(SurveyController testInstance) { + public static void setInstanceForTesting(SurveyController testInstance) { sInstance = testInstance; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java index 4426220..95b14cba 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
@@ -57,11 +57,9 @@ import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.OmniboxTestUtils; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.TabLoadObserver; import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.components.embedder_support.util.UrlConstants; -import org.chromium.content_public.browser.ContentFeatureList; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.test.util.DOMUtils; import org.chromium.content_public.browser.test.util.JavaScriptUtils; @@ -249,39 +247,6 @@ } /** - * Test 'Request Desktop Site' option is preserved after navigation to a new entry - * through a click on a link. - */ - @Test - @MediumTest - @Feature({"Navigation"}) - @DisableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_EXCEPTIONS) - public void testRequestDesktopSiteSettingPers() throws Exception { - String url1 = mTestServer.getURL("/chrome/test/data/android/google.html"); - String url2 = mTestServer.getURL("/chrome/test/data/android/about.html"); - - navigateAndObserve(url1); - mActivityTestRule.assertWaitForPageScaleFactorMatch(0.5f); - - final Tab tab = mActivityTestRule.getActivity().getActivityTab(); - TestThreadUtils.runOnUiThreadBlocking( - () - -> TabUtils.switchUserAgent(tab, /* switchToDesktop */ true, - /* forcedByUser */ true, UseDesktopUserAgentCaller.OTHER)); - ChromeTabUtils.waitForTabPageLoaded(tab, url1); - mActivityTestRule.assertWaitForPageScaleFactorChange(0.5f); - - DOMUtils.clickNode(tab.getWebContents(), "aboutLink"); - ChromeTabUtils.waitForTabPageLoaded(tab, url2); - Assert.assertEquals("Request Desktop site setting should stay turned on", true, - mActivityTestRule.getActivity() - .getActivityTab() - .getWebContents() - .getNavigationController() - .getUseDesktopUserAgent()); - } - - /** * Test 'Request Desktop Site' option properly affects UA client hints */ @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java index 0217790c..113150c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java
@@ -20,7 +20,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -148,7 +147,6 @@ @Test @MediumTest @Feature({"Popup"}) - @DisabledTest(message = "https://crbug.com/1262445") public void testPopupWindowsAppearWhenAllowed() { final TabModelSelector selector = mActivityTestRule.getActivity().getTabModelSelector();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java index 65bfac10..57ef28d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
@@ -1181,7 +1181,6 @@ /** Same as above, but the hidden tab matching should not ignore the fragment. */ @Test @SmallTest - @DisabledTest(message = "https://crbug.com/1237331") @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) public void testHiddenTabAndChangingFragmentDontIgnoreFragments() throws Exception { startHiddenTabAndChangeFragment(false, true); @@ -1690,7 +1689,6 @@ @Test @SmallTest - @DisabledTest(message = "https://crbug.com/1148544") public void closeButton_closesActivityIfNoLandingPage() throws TimeoutException { Context context = InstrumentationRegistry.getInstrumentation() .getTargetContext()
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java index 91ed344..c87e648 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
@@ -15,7 +15,6 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.customtabs.CustomTabsIntentTestUtils; @@ -63,7 +62,6 @@ */ @Test @MediumTest - @DisabledTest(message = "crbug.com/1269017") public void testObserveActiveTab() throws Throwable { EmbeddedTestServer testServer = mCustomTabActivityTestRule.getTestServer(); final String windowOpenUrl =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java index b4f6fbc..4bde328 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
@@ -27,7 +27,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java index dd48e375..cf90142 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java
@@ -20,7 +20,6 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -103,10 +102,9 @@ ChromeSurveyController.resetMessageShownForTesting(); } - @DisabledTest(message = "https:://crbug.com/1447519") @Test @MediumTest - public void testMessagePrimaryButtonClicked() throws TimeoutException, ExecutionException { + public void testMessagePrimaryButtonClicked() { PropertyModel message = getSurveyMessage(); Assert.assertNotNull("Message should not be null.", message); @@ -121,20 +119,18 @@ mTestSurveyController.showSurveyCallbackHelper.getCallCount()); } - @DisabledTest(message = "https:://crbug.com/1447519") @Test @MediumTest - public void testMessageDismissed() throws TimeoutException, ExecutionException { + public void testMessageDismissed() { PropertyModel message = getSurveyMessage(); Assert.assertNotNull("Message should not be null.", message); TestThreadUtils.runOnUiThreadBlocking( () -> mMessageDispatcher.dismissMessage(message, DismissReason.GESTURE)); } - @DisabledTest(message = "https:://crbug.com/1447519") @Test @MediumTest - public void testNoMessageInNewTab() throws InterruptedException, ExecutionException { + public void testNoMessageInNewTab() throws InterruptedException { // Simulate message visibility for the auto-dismiss duration length of time. waitUntilSurveyPromptStateRecorded(MESSAGE_AUTO_DISMISS_DURATION_MS); @@ -149,6 +145,10 @@ Tab tab = mActivityTestRule.getActivity().getActivityTab(); waitUntilTabIsReady(tab); mTestSurveyController.downloadCallbackHelper.waitForFirst(); + // After getting the survey response, it might take momentarily longer for the message to be + // shown. Wait until the message is shown before proceeding. + CriteriaHelper.pollUiThread( + () -> getSurveyMessage() != null, "Survey message should be shown."); Assert.assertNotNull("Tab should have a message.", getSurveyMessage()); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java index 5425f1d..b38f0a0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java
@@ -16,7 +16,7 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisableIf; +import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -30,7 +30,7 @@ import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.content_public.browser.test.util.TestThreadUtils; -import org.chromium.ui.test.util.UiDisableIf; +import org.chromium.ui.test.util.UiRestriction; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -172,7 +172,7 @@ @Test @SmallTest - @DisableIf.Device(type = {UiDisableIf.TABLET}) // crbug/1199248 + @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) @Features.EnableFeatures({ChromeFeatureList.START_SURFACE_WITH_ACCESSIBILITY}) // clang-format off @CommandLineFlags.Add({ @@ -183,7 +183,6 @@ // clang-format on public void testUndoSnackbarEnabled_AccessibilityEnabledWithGroupM5() throws Exception { - // clang-format on TestThreadUtils.runOnUiThreadBlocking( () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(true));
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 3adb8f3..ab50f05 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -1631,7 +1631,7 @@ Sear&ch this Page with Google... </message> <message name="IDS_SHOW_TRANSLATE" desc="In Title Case: The text label of the Translate menu item"> - T&ranslate + T&ranslate... </message> <message name="IDS_SETTINGS" desc="In Title Case: The text label of the Settings menu item"> &Settings @@ -5329,9 +5329,6 @@ <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON" desc="The text of the request acces button that appears on the toolbar when an extension requests access to the site"> Allow <ph name="EXTENSIONS_REQUESTING_ACCESS_COUNT">$1<ex>3</ex></ph>? </message> - <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT" desc="The text of the button that appears on the toolbar after the user grants access to an extension that requested access to the current site."> - Allowed - </message> <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_SINGLE_EXTENSION" desc="The tooltip text of the request access button that appears on the toolbar when an extension requests access to the site"> Click to allow "<ph name="EXTENSIONS_REQUESTING_ACCESS">$1<ex>Extension A</ex></ph>" on <ph name="ORIGIN">$2<ex>google.com</ex></ph> </message> @@ -14129,7 +14126,7 @@ <message name="IDS_WEBAUTHN_CABLEV2_CONNECTING_TITLE" desc="The title of a dialog that is shown when the computer is connecting to a phone or tablet."> Connecting to your device </message> - <message name="IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION" desc="The second line of a dialog that shows once the computer has successfully connected to the user's phone or tablet. That phone/tablet will be showing instructions for what to do next and the user should follow those instuctions."> + <message name="IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION" desc="The title of a dialog that shows once the computer has successfully connected to the user's phone or tablet. That phone/tablet will be showing instructions for what to do next and the user should follow those instuctions."> Follow the steps on your device </message> <message name="IDS_WEBAUTHN_CABLEV2_ERROR_DESCRIPTION" desc="The second line of a dialog that shows once the computer fails to connect to the user's phone or tablet."> @@ -14919,14 +14916,11 @@ <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_TITLE" desc="Header for mismatch dialog which is shown to the user when their sign in status is signed in but they are not signed in to any account." translateable="false"> Failed signing in to <ph name="SITE_ETLD_PLUS_ONE">$1<ex>rp.example</ex></ph> with <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$2<ex>idp.example</ex></ph> </message> - <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE" desc="Title of the button that allows the user to continue with signing in to an account from an identity provider." translateable="false"> + <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE" desc="Title of the button that allows the user to continue with signing in to an account from an identity provider."> Continue </message> - <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY" desc="Body for mismatch dialog which is shown to prompt the user to sign in to a website using an account from an identity provider." translateable="false"> - Use your <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$1<ex>idp.example</ex></ph> account to sign in to <ph name="SITE_ETLD_PLUS_ONE">$2<ex>rp.example</ex></ph> - </message> - <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_DESCRIPTION" desc="Describes the sign in process." translateable="false"> - Signing in is fast, simple and secure. + <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY" desc="Body for mismatch dialog which is shown to prompt the user to sign in to a website using an account from an identity provider."> + You can use your <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$1<ex>idp.example</ex></ph> account on this site. To continue, sign in to <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$1<ex>idp.example</ex></ph>. </message> <message name="IDS_MULTI_IDP_ACCOUNT_SELECTION_SHEET_TITLE_EXPLICIT" desc="Header for sign in sheet when there are multiple identity providers. Sheet is shown to prompt user for sign in consent." translateable="false"> Sign in to <ph name="SITE_ETLD_PLUS_ONE">$1<ex>rp.example</ex></ph>
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT.png.sha1 deleted file mode 100644 index e6673a0..0000000 --- a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -56674d659ebb0147c25aab1bbf395f39a35f0de6 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY.png.sha1 b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY.png.sha1 new file mode 100644 index 0000000..f07c644 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY.png.sha1
@@ -0,0 +1 @@ +32d89cb58c73d012381ec33e99aa207fa1d6d967 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE.png.sha1 b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE.png.sha1 new file mode 100644 index 0000000..f07c644 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE.png.sha1
@@ -0,0 +1 @@ +32d89cb58c73d012381ec33e99aa207fa1d6d967 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1 index 25c9faa0..902fa96 100644 --- a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1
@@ -1 +1 @@ -4efee63dc4f1982ba125f9fd7cce0f5b47d67dbe \ No newline at end of file +a369e1093b34d2b0bb9cb5b6247283cb70daa409 \ No newline at end of file
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn index 919626372..13d97ca2 100644 --- a/chrome/app/vector_icons/BUILD.gn +++ b/chrome/app/vector_icons/BUILD.gn
@@ -136,6 +136,7 @@ "notes.icon", "open_in_new.icon", "open_in_new_chrome_refresh.icon", + "open_in_new_off_chrome_refresh.icon", "overflow_chevron.icon", "paintbrush.icon", "palette.icon",
diff --git a/chrome/app/vector_icons/open_in_new_off_chrome_refresh.icon b/chrome/app/vector_icons/open_in_new_off_chrome_refresh.icon new file mode 100644 index 0000000..e6be88d --- /dev/null +++ b/chrome/app/vector_icons/open_in_new_off_chrome_refresh.icon
@@ -0,0 +1,45 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +R_MOVE_TO, 16.19f, 18.34f, +R_LINE_TO, -1.17f, -1.17f, +R_CUBIC_TO, -0.02f, 0, -0.03f, 0, -0.04f, 0, +H_LINE_TO, 4.56f, +R_CUBIC_TO, -0.48f, 0, -0.89f, -0.17f, -1.22f, -0.5f, +R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, -0.5f, -1.22f, +V_LINE_TO, 5.02f, +R_CUBIC_TO, 0, -0.01f, 0, -0.02f, 0, -0.04f, +LINE_TO, 1.66f, 3.81f, +R_LINE_TO, 1.11f, -1.11f, +R_LINE_TO, 14.52f, 14.52f, +CLOSE, +MOVE_TO, 4.56f, 15.44f, +R_H_LINE_TO, 8.73f, +R_LINE_TO, -3.75f, -3.77f, +LINE_TO, 8.22f, 13, +LINE_TO, 7, 11.78f, +R_LINE_TO, 1.33f, -1.32f, +R_LINE_TO, -3.77f, -3.75f, +CLOSE, +MOVE_TO, 6.86f, 4.56f, +LINE_TO, 5.14f, 2.83f, +H_LINE_TO, 10, +R_V_LINE_TO, 1.73f, +CLOSE, +R_MOVE_TO, 4.88f, 4.91f, +R_LINE_TO, -1.22f, -1.22f, +R_LINE_TO, 3.69f, -3.69f, +H_LINE_TO, 12, +V_LINE_TO, 2.83f, +R_H_LINE_TO, 5.17f, +V_LINE_TO, 8, +R_H_LINE_TO, -1.73f, +V_LINE_TO, 5.78f, +CLOSE, +R_MOVE_TO, 5.42f, 5.39f, +R_LINE_TO, -1.73f, -1.73f, +V_LINE_TO, 10, +R_H_LINE_TO, 1.73f, +CLOSE \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index d96f137..8272774 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -7930,16 +7930,6 @@ "grit/dev_ui_browser_resources.h", "dev_ui_browser_resources.pak", ] - - deps = [] - - if (is_android || is_linux || is_chromeos || is_win) { - deps += [ "//chrome/browser/resources/sandbox_internals:build_ts" ] - } - - if (is_android) { - deps += [ "//chrome/browser/resources/internals/query_tiles:build_ts" ] - } } action("expired_flags_list_gen") {
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index d331991..8cf5a7d 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -5769,6 +5769,11 @@ {"android-app-inintegration", flag_descriptions::kAndroidAppIntegrationName, flag_descriptions::kAndroidAppIntegrationDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegration)}, + + {"android-app-inintegration-safesearch", + flag_descriptions::kAndroidAppIntegrationSafeSearchName, + flag_descriptions::kAndroidAppIntegrationSafeSearchDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegrationSafeSearch)}, #endif // BUILDFLAG(IS_ANDROID) {"omnibox-local-history-zero-suggest-beyond-ntp", @@ -6362,6 +6367,12 @@ commerce::flag_descriptions::kShoppingListDescription, kOsAndroid | kOsDesktop, FEATURE_VALUE_TYPE(commerce::kShoppingList)}, + {"shopping-list-track-by-default", + commerce::flag_descriptions::kShoppingListTrackByDefaultName, + commerce::flag_descriptions::kShoppingListTrackByDefaultDescription, + kOsAndroid | kOsDesktop, + FEATURE_VALUE_TYPE(commerce::kShoppingListTrackByDefault)}, + {"local-pdp-detection", commerce::flag_descriptions::kCommerceLocalPDPDetectionName, commerce::flag_descriptions::kCommerceLocalPDPDetectionDescription,
diff --git a/chrome/browser/android/compositor/layer/tab_handle_layer.cc b/chrome/browser/android/compositor/layer/tab_handle_layer.cc index 997b90f3..fc26bc6 100644 --- a/chrome/browser/android/compositor/layer/tab_handle_layer.cc +++ b/chrome/browser/android/compositor/layer/tab_handle_layer.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/android/compositor/layer/tab_handle_layer.h" +#include <math.h> + #include <vector> #include "base/feature_list.h" @@ -109,6 +111,7 @@ height = margin_height; } height -= top_margin; + height = ceil(height); gfx::Size tab_bounds(width, height - bottom_margin); layer_->SetPosition(gfx::PointF(x, y));
diff --git a/chrome/browser/android/metrics/BUILD.gn b/chrome/browser/android/metrics/BUILD.gn index 8452afdd..5a4a725 100644 --- a/chrome/browser/android/metrics/BUILD.gn +++ b/chrome/browser/android/metrics/BUILD.gn
@@ -10,6 +10,7 @@ _test_jni_sources = [ "javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java" ] android_library("java") { + srcjar_deps = [ ":jni_headers" ] sources = [ "java/src/org/chromium/chrome/browser/metrics/AndroidSessionDurationsServiceState.java", "java/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics.java", @@ -27,7 +28,6 @@ "//content/public/android:content_java", "//third_party/androidx:androidx_annotation_annotation_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } static_library("ukm_utils_for_test") { @@ -53,9 +53,9 @@ android_library("ukm_java_test_support") { testonly = true + srcjar_deps = [ ":test_jni_headers" ] sources = _test_jni_sources deps = [ "//base:jni_java" ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } android_library("ukm_javatests") {
diff --git a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc index 68e8015..758d8ba 100644 --- a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc +++ b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc
@@ -26,7 +26,7 @@ : profile_(profile), app_platform_metrics_(app_platform_metrics) { DCHECK(app_platform_metrics); - apps::InstanceRegistry::Observer::Observe(&instance_registry); + instance_registry_observation_.Observe(&instance_registry); app_platform_metrics_->AddObserver(this); } @@ -134,7 +134,7 @@ void AppDiscoveryMetrics::OnInstanceRegistryWillBeDestroyed( InstanceRegistry* cache) { - apps::InstanceRegistry::Observer::Observe(nullptr); + instance_registry_observation_.Reset(); } bool AppDiscoveryMetrics::IsAppSyncEnabled() {
diff --git a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h index 53247ef..6fdc922 100644 --- a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h +++ b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h
@@ -9,6 +9,7 @@ #include <set> #include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" #include "base/unguessable_token.h" #include "chrome/browser/apps/app_service/metrics/app_platform_metrics.h" #include "chrome/browser/profiles/profile.h" @@ -106,6 +107,9 @@ // Map associating app_ids to instance_ids. std::map<std::string, std::set<base::UnguessableToken>> app_id_to_instance_ids_; + + base::ScopedObservation<InstanceRegistry, InstanceRegistry::Observer> + instance_registry_observation_{this}; }; } // namespace apps
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc index 9c994b31..2bbbe32 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc +++ b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc
@@ -140,7 +140,7 @@ Profile* profile, InstanceRegistry& instance_registry) : profile_(profile) { - InstanceRegistry::Observer::Observe(&instance_registry); + instance_registry_observation_.Observe(&instance_registry); if (ash::Shell::HasInstance()) { ash::Shell::Get()->AddPreTargetHandler(this); } @@ -229,7 +229,7 @@ void AppPlatformInputMetrics::OnInstanceRegistryWillBeDestroyed( InstanceRegistry* cache) { - InstanceRegistry::Observer::Observe(nullptr); + instance_registry_observation_.Reset(); } void AppPlatformInputMetrics::SetAppInfoForActivatedWindow(
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h index 6351d9c..d6a6dd28 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h +++ b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h
@@ -9,6 +9,7 @@ #include "base/containers/flat_map.h" #include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" #include "chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h" #include "chrome/browser/apps/app_service/metrics/browser_to_tab_list.h" #include "chrome/browser/profiles/profile.h" @@ -134,6 +135,9 @@ // }, std::map<std::string, EventSourceToCounts> app_id_to_event_count_per_two_hours_; + + base::ScopedObservation<InstanceRegistry, InstanceRegistry::Observer> + instance_registry_observation_{this}; }; } // namespace apps
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc index 61854cf..db2c4dd4 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc +++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
@@ -451,7 +451,7 @@ InstanceRegistry& instance_registry) : profile_(profile), app_registry_cache_(app_registry_cache) { apps::AppRegistryCache::Observer::Observe(&app_registry_cache); - apps::InstanceRegistry::Observer::Observe(&instance_registry); + instance_registry_observation_.Observe(&instance_registry); user_type_by_device_type_ = GetUserTypeByDeviceTypeMetrics(); InitRunningDuration(); LoadAppsUsageTimeUkmFromPref(); @@ -873,7 +873,7 @@ void AppPlatformMetrics::OnInstanceRegistryWillBeDestroyed( apps::InstanceRegistry* cache) { - apps::InstanceRegistry::Observer::Observe(nullptr); + instance_registry_observation_.Reset(); } void AppPlatformMetrics::GetBrowserInstanceInfo(
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.h b/chrome/browser/apps/app_service/metrics/app_platform_metrics.h index 41880cc..a5126f2 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.h +++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.h
@@ -13,6 +13,7 @@ #include "base/memory/raw_ref.h" #include "base/observer_list.h" #include "base/observer_list_types.h" +#include "base/scoped_observation.h" #include "base/strings/string_piece_forward.h" #include "base/time/time.h" #include "base/unguessable_token.h" @@ -358,6 +359,9 @@ std::vector<std::unique_ptr<UsageTime>> usage_times_from_pref_; base::ObserverList<Observer> observers_; + + base::ScopedObservation<InstanceRegistry, InstanceRegistry::Observer> + instance_registry_observation_{this}; }; } // namespace apps
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc b/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc index f20652b..710ef64 100644 --- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc +++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/scoped_observation.h" #include "chrome/browser/apps/app_service/publishers/web_apps_crosapi.h" #include "ash/public/cpp/shelf_item_delegate.h" @@ -19,6 +20,7 @@ #include "chrome/browser/web_applications/web_app_id.h" #include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h" #include "components/services/app_service/public/cpp/app_launch_util.h" +#include "components/services/app_service/public/cpp/instance_registry.h" #include "content/public/test/browser_test.h" #include "ui/base/models/simple_menu_model.h" @@ -31,9 +33,9 @@ apps::InstanceState state = apps::InstanceState(apps::kVisible | apps::kActive | apps::kRunning | apps::kStarted)) - : apps::InstanceRegistry::Observer(&instance_registry), - app_id_(app_id), - state_(state) {} + : app_id_(app_id), state_(state) { + observation_.Observe(&instance_registry); + } ~AppInstanceWaiter() override = default; void Await() { run_loop_.Run(); } @@ -52,6 +54,9 @@ const std::string app_id_; const apps::InstanceState state_; base::RunLoop run_loop_; + base::ScopedObservation<apps::InstanceRegistry, + apps::InstanceRegistry::Observer> + observation_{this}; }; std::vector<std::string> GetContextMenuForApp(const std::string& app_id) {
diff --git a/chrome/browser/ash/browser_context_keyed_service_factories.cc b/chrome/browser/ash/browser_context_keyed_service_factories.cc index c11ff2fd..895b58c1 100644 --- a/chrome/browser/ash/browser_context_keyed_service_factories.cc +++ b/chrome/browser/ash/browser_context_keyed_service_factories.cc
@@ -38,6 +38,7 @@ #include "chrome/browser/ash/crostini/crostini_metrics_service.h" #include "chrome/browser/ash/crostini/crostini_package_service.h" #include "chrome/browser/ash/crostini/crostini_port_forwarder.h" +#include "chrome/browser/ash/crostini/crostini_shared_devices.h" #include "chrome/browser/ash/crostini/crostini_upgrader.h" #include "chrome/browser/ash/crostini/throttle/crostini_throttle.h" #include "chrome/browser/ash/eche_app/eche_app_manager_factory.h" @@ -176,6 +177,7 @@ crostini::CrostiniMetricsService::Factory::GetInstance(); crostini::CrostiniPackageService::EnsureFactoryBuilt(); crostini::CrostiniPortForwarder::EnsureFactoryBuilt(); + crostini::CrostiniSharedDevices::EnsureFactoryBuilt(); crostini::CrostiniThrottle::EnsureFactoryBuilt(); crostini::CrostiniUpgrader::EnsureFactoryBuilt(); #if BUILDFLAG(USE_CUPS)
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc index 36bfbcf..a30632b 100644 --- a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc +++ b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc
@@ -72,7 +72,7 @@ AppServiceWrapper::AppServiceWrapper(Profile* profile) : profile_(profile) { apps::AppRegistryCache::Observer::Observe(&GetAppCache()); - apps::InstanceRegistry::Observer::Observe(&GetInstanceRegistry()); + instance_registry_observation_.Observe(&GetInstanceRegistry()); } AppServiceWrapper::~AppServiceWrapper() = default; @@ -294,7 +294,7 @@ void AppServiceWrapper::OnInstanceRegistryWillBeDestroyed( apps::InstanceRegistry* cache) { - apps::InstanceRegistry::Observer::Observe(nullptr); + instance_registry_observation_.Reset(); } apps::AppServiceProxy* AppServiceWrapper::GetAppProxy() const {
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h index 1a3398a76..12bb12ab 100644 --- a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h +++ b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h
@@ -12,6 +12,7 @@ #include "base/memory/raw_ptr.h" #include "base/observer_list.h" #include "base/observer_list_types.h" +#include "base/scoped_observation.h" #include "base/time/time.h" #include "chrome/browser/apps/app_service/app_service_proxy_forward.h" #include "components/services/app_service/public/cpp/app_registry_cache.h" @@ -169,6 +170,10 @@ base::ObserverList<EventListener> listeners_; + base::ScopedObservation<apps::InstanceRegistry, + apps::InstanceRegistry::Observer> + instance_registry_observation_{this}; + const raw_ptr<Profile, ExperimentalAsh> profile_; };
diff --git a/chrome/browser/ash/crosapi/files_app_launcher.cc b/chrome/browser/ash/crosapi/files_app_launcher.cc index 2679c90..783d61f5 100644 --- a/chrome/browser/ash/crosapi/files_app_launcher.cc +++ b/chrome/browser/ash/crosapi/files_app_launcher.cc
@@ -49,8 +49,7 @@ void FilesAppLauncher::LaunchInternal() { // Start observing the launching. - auto& instance_registry = proxy_->InstanceRegistry(); - apps::InstanceRegistry::Observer::Observe(&instance_registry); + instance_registry_observation_.Observe(&proxy_->InstanceRegistry()); // Launching traditional files.app and launching SWA files.app need quite // different procedure. @@ -83,13 +82,13 @@ // So launching is progressed. Stop observing and run the callback // to notify the caller of Launch(). - apps::InstanceRegistry::Observer::Observe(nullptr); + instance_registry_observation_.Reset(); std::move(callback_).Run(); } void FilesAppLauncher::OnInstanceRegistryWillBeDestroyed( apps::InstanceRegistry* cache) { - apps::InstanceRegistry::Observer::Observe(nullptr); + instance_registry_observation_.Reset(); } } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/files_app_launcher.h b/chrome/browser/ash/crosapi/files_app_launcher.h index dd64e2e0..7d7cfc6bd 100644 --- a/chrome/browser/ash/crosapi/files_app_launcher.h +++ b/chrome/browser/ash/crosapi/files_app_launcher.h
@@ -8,6 +8,7 @@ #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "base/scoped_observation.h" #include "chrome/browser/apps/app_service/app_service_proxy_forward.h" #include "components/services/app_service/public/cpp/app_registry_cache.h" #include "components/services/app_service/public/cpp/instance_registry.h" @@ -48,6 +49,10 @@ base::OnceClosure callback_; + base::ScopedObservation<apps::InstanceRegistry, + apps::InstanceRegistry::Observer> + instance_registry_observation_{this}; + base::WeakPtrFactory<FilesAppLauncher> weak_factory_{this}; };
diff --git a/chrome/browser/ash/crostini/crostini_shared_devices.cc b/chrome/browser/ash/crostini/crostini_shared_devices.cc index f41be93..ebce9e5 100644 --- a/chrome/browser/ash/crostini/crostini_shared_devices.cc +++ b/chrome/browser/ash/crostini/crostini_shared_devices.cc
@@ -107,6 +107,10 @@ } } +void CrostiniSharedDevices::EnsureFactoryBuilt() { + CrostiniSharedDevicesFactory::GetInstance(); +} + void CrostiniSharedDevices::ApplySharingState( const guest_os::GuestId container_id, base::Value::Dict next_shared_devices,
diff --git a/chrome/browser/ash/crostini/crostini_shared_devices.h b/chrome/browser/ash/crostini/crostini_shared_devices.h index fcbee39..2c038f67 100644 --- a/chrome/browser/ash/crostini/crostini_shared_devices.h +++ b/chrome/browser/ash/crostini/crostini_shared_devices.h
@@ -55,6 +55,8 @@ bool shared, ResultCallback callback); + static void EnsureFactoryBuilt(); + private: void ApplySharingState(guest_os::GuestId container_id, base::Value::Dict next_shared_devices,
diff --git a/chrome/browser/ash/drive/drive_integration_service_browsertest.cc b/chrome/browser/ash/drive/drive_integration_service_browsertest.cc index 7743beb..561d32e 100644 --- a/chrome/browser/ash/drive/drive_integration_service_browsertest.cc +++ b/chrome/browser/ash/drive/drive_integration_service_browsertest.cc
@@ -626,7 +626,10 @@ protected: DriveIntegrationServiceBrowserTestLacros() { scoped_feature_list_.InitWithFeatures( - {ash::features::kLacrosSupport, ash::features::kLacrosPrimary}, {}); + {ash::features::kLacrosSupport, ash::features::kLacrosPrimary, + ash::features::kLacrosOnly, + ash::features::kLacrosProfileMigrationForceOff}, + {}); } // browser() does not exist in Lacros, so get the profile from ProfileManager.
diff --git a/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc b/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc index 3c16ece8..4862f6fb 100644 --- a/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc +++ b/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc
@@ -40,6 +40,8 @@ "|AM-C5000" "|AM-C6000" "|DS-790WN" + "|DS-C420W" + "|DS-C480W" "|LM-C4000" "|LM-C5000" "|LM-C6000"
diff --git a/chrome/browser/autofill/test/BUILD.gn b/chrome/browser/autofill/test/BUILD.gn index 10282861..22577ac9 100644 --- a/chrome/browser/autofill/test/BUILD.gn +++ b/chrome/browser/autofill/test/BUILD.gn
@@ -31,13 +31,13 @@ testonly = true resources_package = "org.chromium.chrome.browser.autofill" + srcjar_deps = [ ":jni_headers" ] sources = [ "android/java/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java" ] deps = [ ":jni_headers", "//base:jni_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] public_deps = [ "//base:base_java_test_support",
diff --git a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java index 465d2df..4e49536 100644 --- a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java +++ b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java
@@ -29,7 +29,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Batch; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; @@ -529,8 +528,9 @@ @Test @SmallTest - @DisabledTest(message = "https://crbug.com/1454222") @Feature({"Autofill"}) + @Features.DisableFeatures(ChromeFeatureList.AUTOFILL_ENABLE_RANKING_FORMULA_ADDRESS_PROFILES) + // TODO(crbug.com/1454591): Add test for ranking profiles with new algorithm. public void testProfilesFrecency() throws TimeoutException { // Create 3 profiles. AutofillProfile profile1 = AutofillProfile.builder() @@ -594,6 +594,8 @@ @Test @SmallTest @Feature({"Autofill"}) + @Features.DisableFeatures(ChromeFeatureList.AUTOFILL_ENABLE_RANKING_FORMULA_CREDIT_CARDS) + // TODO(crbug.com/1454591): Add test for ranking credit cards with new algorithm. public void testCreditCardsFrecency() throws TimeoutException { // Create 3 credit cards. CreditCard card1 = createLocalCreditCard("Visa", "1234123412341234", "5", "2020");
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 35a4e72..868575f 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -197,6 +197,7 @@ #include "third_party/blink/public/common/switches.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/color/color_provider_manager.h" #if BUILDFLAG(ENABLE_COMPONENT_UPDATER) #include "chrome/browser/component_updater/registration.h"
diff --git a/chrome/browser/companion/core/mojom/companion.mojom b/chrome/browser/companion/core/mojom/companion.mojom index c1ae22b..84f08b8 100644 --- a/chrome/browser/companion/core/mojom/companion.mojom +++ b/chrome/browser/companion/core/mojom/companion.mojom
@@ -131,6 +131,11 @@ kATX = 9, }; +struct VisualSearchResult { + // Encoded image bytes + string data_uri; +}; + // Factory method for creating a new WebUI page handler. interface CompanionPageHandlerFactory { // The WebUI calls this method when the page is first initialized. @@ -215,4 +220,7 @@ // `text_directives` and `results` have the same length. OnCqFindTextResultsAvailable(array<string> text_directives, array<bool> results); + + // Pass back results from visual classifier for rendering. + OnDeviceVisualClassificationResult(array<VisualSearchResult> results); };
diff --git a/chrome/browser/dev_ui_browser_resources.grd b/chrome/browser/dev_ui_browser_resources.grd index e996d03..e2988a11 100644 --- a/chrome/browser/dev_ui_browser_resources.grd +++ b/chrome/browser/dev_ui_browser_resources.grd
@@ -22,21 +22,6 @@ <include name="IDR_DEVICE_LOG_UI_JS" file="resources\device_log_ui\device_log_ui.js" preprocess="true" type="BINDATA" /> <include name="IDR_DEVICE_LOG_UI_CSS" file="resources\device_log_ui\device_log_ui.css" type="BINDATA" /> - <if expr="is_android or is_linux or is_chromeos"> - <include name="IDR_SANDBOX_INTERNALS_HTML" file="resources\sandbox_internals\sandbox_internals.html" preprocess="true" type="BINDATA" /> - <include name="IDR_SANDBOX_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\sandbox_internals\tsc\sandbox_internals.js" use_base_dir="false" type="BINDATA" /> - </if> - <if expr="is_win"> - <include name="IDR_SANDBOX_INTERNALS_HTML" file="resources\sandbox_internals\sandbox_internals.html" preprocess="true" type="BINDATA" /> - <include name="IDR_SANDBOX_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\sandbox_internals\tsc\sandbox_internals_win.js" use_base_dir="false" type="BINDATA" /> - </if> - - <if expr="is_android"> - <include name="IDR_QUERY_TILES_INTERNALS_HTML" file="resources\internals\query_tiles\query_tiles_internals.html" type="BINDATA" /> - <include name="IDR_QUERY_TILES_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\internals\query_tiles\tsc\query_tiles_internals.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_QUERY_TILES_INTERNALS_BROWSER_PROXY_JS" file="${root_gen_dir}\chrome\browser\resources\internals\query_tiles\tsc\query_tiles_internals_browser_proxy.js" use_base_dir="false" type="BINDATA" /> - </if> - <if expr="enable_supervised_users"> <include name="IDR_FAMILY_LINK_USER_INTERNALS_HTML" file="resources\family_link_user_internals\family_link_user_internals.html" allowexternalscript="true" type="BINDATA" /> <include name="IDR_FAMILY_LINK_USER_INTERNALS_CSS" file="resources\family_link_user_internals\family_link_user_internals.css" type="BINDATA" />
diff --git a/chrome/browser/enterprise/util/BUILD.gn b/chrome/browser/enterprise/util/BUILD.gn index fc241e54..771ab22a 100644 --- a/chrome/browser/enterprise/util/BUILD.gn +++ b/chrome/browser/enterprise/util/BUILD.gn
@@ -10,6 +10,7 @@ ] android_library("java") { + srcjar_deps = [ ":jni_headers" ] sources = _jni_sources sources += [ "android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java" ] @@ -21,7 +22,6 @@ "//chrome/browser/profiles/android:java", "//third_party/androidx:androidx_annotation_annotation_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } generate_jni("jni_headers") {
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 62ded0d3..934560d4 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -716,8 +716,6 @@ "webstore_install_with_prompt.h", "webstore_installer.cc", "webstore_installer.h", - "webstore_installer_callback_delegate.cc", - "webstore_installer_callback_delegate.h", "webstore_reinstaller.cc", "webstore_reinstaller.h", "webstore_standalone_installer.cc",
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc index ddc38df9..54b46fb 100644 --- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -10,6 +10,7 @@ #include <utility> #include <vector> +#include "base/auto_reset.h" #include "base/base64.h" #include "base/containers/cxx20_erase_vector.h" #include "base/functional/bind.h" @@ -32,7 +33,6 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/install_tracker.h" #include "chrome/browser/extensions/scoped_active_install.h" -#include "chrome/browser/extensions/webstore_installer_callback_delegate.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_observer.h" @@ -238,7 +238,7 @@ // The number of user gestures to trace back for the referrer chain. const int kExtensionReferrerUserGestureLimit = 2; -WebstoreInstaller::Delegate* test_webstore_installer_delegate = nullptr; +WebstorePrivateApi::Delegate* test_delegate = nullptr; // We allow the web store to set a string containing login information when a // purchase is made, so that when a user logs into sync with a different @@ -402,9 +402,10 @@ } // namespace // static -void WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting( - WebstoreInstaller::Delegate* delegate) { - test_webstore_installer_delegate = delegate; +base::AutoReset<WebstorePrivateApi::Delegate*> +WebstorePrivateApi::SetDelegateForTesting(Delegate* delegate) { + CHECK_EQ(nullptr, test_delegate); + return base::AutoReset<Delegate*>(&test_delegate, delegate); } // static @@ -656,8 +657,8 @@ void WebstorePrivateBeginInstallWithManifest3Function:: OnExtensionApprovalCanceled() { - if (test_webstore_installer_delegate) { - test_webstore_installer_delegate->OnExtensionInstallFailure( + if (test_delegate) { + test_delegate->OnExtensionInstallFailure( dummy_extension_->id(), kWebstoreParentPermissionFailedError, WebstoreInstaller::FailureReason::FAILURE_REASON_CANCELLED); } @@ -667,8 +668,8 @@ void WebstorePrivateBeginInstallWithManifest3Function:: OnExtensionApprovalFailed() { - if (test_webstore_installer_delegate) { - test_webstore_installer_delegate->OnExtensionInstallFailure( + if (test_delegate) { + test_delegate->OnExtensionInstallFailure( dummy_extension_->id(), kWebstoreParentPermissionFailedError, WebstoreInstaller::FailureReason::FAILURE_REASON_OTHER); } @@ -1022,13 +1023,12 @@ // the allowlist entry will bypass the normal permissions install dialog. scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller( profile, - std::make_unique<WebstoreInstallerCallbackDelegate>( - base::BindOnce(&WebstorePrivateCompleteInstallFunction:: - OnExtensionInstallSuccess, - weak_ptr_factory_.GetWeakPtr()), - base::BindOnce(&WebstorePrivateCompleteInstallFunction:: - OnExtensionInstallFailure, - weak_ptr_factory_.GetWeakPtr())), + base::BindOnce( + &WebstorePrivateCompleteInstallFunction::OnExtensionInstallSuccess, + weak_ptr_factory_.GetWeakPtr()), + base::BindOnce( + &WebstorePrivateCompleteInstallFunction::OnExtensionInstallFailure, + weak_ptr_factory_.GetWeakPtr()), web_contents, params->expected_id, std::move(approval_), WebstoreInstaller::INSTALL_SOURCE_OTHER); installer->Start(); @@ -1052,9 +1052,8 @@ const std::string& id, const std::string& error, WebstoreInstaller::FailureReason reason) { - if (test_webstore_installer_delegate) { - test_webstore_installer_delegate->OnExtensionInstallFailure(id, error, - reason); + if (test_delegate) { + test_delegate->OnExtensionInstallFailure(id, error, reason); } VLOG(1) << "Install failed, sending response"; @@ -1068,8 +1067,9 @@ void WebstorePrivateCompleteInstallFunction::OnInstallSuccess( const std::string& id) { - if (test_webstore_installer_delegate) - test_webstore_installer_delegate->OnExtensionInstallSuccess(id); + if (test_delegate) { + test_delegate->OnExtensionInstallSuccess(id); + } } WebstorePrivateEnableAppLauncherFunction::
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.h b/chrome/browser/extensions/api/webstore_private/webstore_private_api.h index cad3f594..957ab11 100644 --- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.h +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "base/auto_reset.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/values.h" @@ -45,9 +46,18 @@ class WebstorePrivateApi { public: - // Allows you to override the WebstoreInstaller delegate for testing. - static void SetWebstoreInstallerDelegateForTesting( - WebstoreInstaller::Delegate* delegate); + class Delegate { + public: + virtual ~Delegate() = default; + virtual void OnExtensionInstallSuccess(const std::string& id) {} + virtual void OnExtensionInstallFailure( + const std::string& id, + const std::string& error, + WebstoreInstaller::FailureReason reason) {} + }; + + // Sets a delegate for testing. + static base::AutoReset<Delegate*> SetDelegateForTesting(Delegate* delegate); // Gets the pending approval for the |extension_id| in |profile|. Pending // approvals are held between the calls to beginInstallWithManifest and
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc index 6e0071dc..a27a979 100644 --- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc +++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -5,6 +5,7 @@ #include <memory> #include <vector> +#include "base/auto_reset.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/run_loop.h" @@ -76,7 +77,7 @@ constexpr char kExtensionId[] = "enfkhcelefdadlmkffamgdlgplcionje"; -class WebstoreInstallListener : public WebstoreInstaller::Delegate { +class WebstoreInstallListener : public WebstorePrivateApi::Delegate { public: WebstoreInstallListener() : received_failure_(false), received_success_(false), waiting_(false) {} @@ -294,7 +295,7 @@ IN_PROC_BROWSER_TEST_P(ExtensionWebstorePrivateApiTestParameterized, AppInstallBubble) { WebstoreInstallListener listener; - WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener); + auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener); ASSERT_TRUE(RunInstallTest("app_install_bubble.html", "app.crx")); listener.Wait(); ASSERT_TRUE(listener.received_success()); @@ -345,7 +346,7 @@ IN_PROC_BROWSER_TEST_P(ExtensionWebstorePrivateApiTestParameterized, InstallTheme) { WebstoreInstallListener listener; - WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener); + auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener); ASSERT_TRUE(RunInstallTest("theme.html", "../../theme.crx")); listener.Wait(); ASSERT_TRUE(listener.received_success()); @@ -524,7 +525,7 @@ IN_PROC_BROWSER_TEST_P(SupervisedUserExtensionWebstorePrivateApiTest, ParentPermissionGranted) { WebstoreInstallListener listener; - WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener); + auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener); set_next_dialog_action(NextDialogAction::kAccept); ASSERT_TRUE(RunInstallTest("install_child.html", "app.crx")); @@ -546,7 +547,7 @@ ParentPermissionCanceled) { WebstoreInstallListener listener; set_next_dialog_action(NextDialogAction::kCancel); - WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener); + auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener); ASSERT_TRUE(RunInstallTest("install_cancel_child.html", "app.crx")); listener.Wait(); ASSERT_TRUE(listener.received_failure()); @@ -566,7 +567,7 @@ IN_PROC_BROWSER_TEST_P(SupervisedUserExtensionWebstorePrivateApiTest, NoParentPermissionRequiredForTheme) { WebstoreInstallListener listener; - WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener); + auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener); ASSERT_TRUE(RunInstallTest("theme.html", "../../theme.crx")); listener.Wait(); ASSERT_TRUE(listener.received_success());
diff --git a/chrome/browser/extensions/navigation_observer_browsertest.cc b/chrome/browser/extensions/navigation_observer_browsertest.cc index a35833e4..c4ebda9 100644 --- a/chrome/browser/extensions/navigation_observer_browsertest.cc +++ b/chrome/browser/extensions/navigation_observer_browsertest.cc
@@ -225,22 +225,22 @@ // The SiteInstance of the disabled extension frame should be different from // the SiteInstance of the enabled extension subframe. It should reference the // invalid extension ID or the error page URL. - // TODO(crbug.com/1234637): remove the exception for the - // SubframeShutdownDelay experiment below. It is temporary, intended to allow - // the experiment to proceed while the reason for it causing - // |extension_site_instance| to be reused is addressed separately. - if (!base::FeatureList::IsEnabled(features::kSubframeShutdownDelay)) { - EXPECT_NE(subframe->GetSiteInstance(), extension_site_instance); - if (content::SiteIsolationPolicy::IsErrorPageIsolationEnabled(false)) { - EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(), - GURL(content::kUnreachableWebDataURL)); - } else { - EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(), - GURL(chrome::kExtensionInvalidRequestURL)); - // The disabled extension process should be locked. - EXPECT_TRUE(subframe->GetProcess()->IsProcessLockedToSiteForTesting()); - } + // TODO(crbug.com/1234637): remove the exceptions for Mac and Windows below + // once renderer-process shutdown delay causing `extension_site_instance` to + // be reused is addressed (see + // RendererProcessHostImpl::ShouldDelayProcessShutdown() for details). +#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_WIN) + EXPECT_NE(subframe->GetSiteInstance(), extension_site_instance); + if (content::SiteIsolationPolicy::IsErrorPageIsolationEnabled(false)) { + EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(), + GURL(content::kUnreachableWebDataURL)); + } else { + EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(), + GURL(chrome::kExtensionInvalidRequestURL)); + // The disabled extension process should be locked. + EXPECT_TRUE(subframe->GetProcess()->IsProcessLockedToSiteForTesting()); } +#endif // !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_WIN) // Re-enable the extension. extension_service()->EnableExtension(extension->id());
diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc index 597f394e77..3078917f 100644 --- a/chrome/browser/extensions/webstore_installer.cc +++ b/chrome/browser/extensions/webstore_installer.cc
@@ -210,14 +210,6 @@ return url; } -void WebstoreInstaller::Delegate::OnExtensionDownloadStarted( - const std::string& id, - download::DownloadItem* item) {} - -void WebstoreInstaller::Delegate::OnExtensionDownloadProgress( - const std::string& id, - download::DownloadItem* item) {} - WebstoreInstaller::Approval::Approval() = default; std::unique_ptr<WebstoreInstaller::Approval> @@ -263,14 +255,16 @@ } WebstoreInstaller::WebstoreInstaller(Profile* profile, - std::unique_ptr<Delegate> delegate, + SuccessCallback success_callback, + FailureCallback failure_callback, content::WebContents* web_contents, const std::string& id, std::unique_ptr<Approval> approval, InstallSource source) : web_contents_(web_contents->GetWeakPtr()), profile_(profile), - delegate_(std::move(delegate)), + success_callback_(std::move(success_callback)), + failure_callback_(std::move(failure_callback)), id_(id), install_source_(source), approval_(approval.release()) { @@ -389,10 +383,6 @@ } } -void WebstoreInstaller::InvalidateDelegate() { - delegate_ = nullptr; -} - void WebstoreInstaller::SetDownloadDirectoryForTests( base::FilePath* directory) { g_download_directory_for_tests = directory; @@ -460,9 +450,6 @@ } if (!download_started_) { - if (delegate_) { - delegate_->OnExtensionDownloadStarted(id_, download_item_); - } download_started_ = true; } } @@ -497,19 +484,12 @@ if (pending_modules_.size() == 1) { // The download is the last module - the extension main module. - if (delegate_) { - delegate_->OnExtensionDownloadProgress(id_, download); - } extensions::InstallTracker* tracker = extensions::InstallTrackerFactory::GetForBrowserContext(profile_); tracker->OnDownloadProgress(id_, 100); } break; case DownloadItem::IN_PROGRESS: { - if (delegate_ && pending_modules_.size() == 1) { - // Only report download progress for the main module to |delegrate_|. - delegate_->OnExtensionDownloadProgress(id_, download); - } UpdateDownloadProgress(); break; } @@ -718,10 +698,10 @@ void WebstoreInstaller::ReportFailure(const std::string& error, FailureReason reason) { - if (delegate_) { - delegate_->OnExtensionInstallFailure(id_, error, reason); - delegate_.reset(); - } + CHECK(failure_callback_); + std::move(failure_callback_).Run(id_, error, reason); + success_callback_ = base::NullCallback(); + extension_registry_observation_.Reset(); extensions::InstallTracker* tracker = extensions::InstallTrackerFactory::GetForBrowserContext(profile_); @@ -731,10 +711,10 @@ } void WebstoreInstaller::ReportSuccess() { - if (delegate_) { - delegate_->OnExtensionInstallSuccess(id_); - delegate_.reset(); - } + CHECK(success_callback_); + std::move(success_callback_).Run(id_); + failure_callback_ = base::NullCallback(); + extension_registry_observation_.Reset(); Release(); // Balanced in Start(). }
diff --git a/chrome/browser/extensions/webstore_installer.h b/chrome/browser/extensions/webstore_installer.h index 4070288..42a1ad7 100644 --- a/chrome/browser/extensions/webstore_installer.h +++ b/chrome/browser/extensions/webstore_installer.h
@@ -81,18 +81,9 @@ MANIFEST_CHECK_LEVEL_STRICT, }; - class Delegate { - public: - virtual ~Delegate() = default; - virtual void OnExtensionDownloadStarted(const std::string& id, - download::DownloadItem* item); - virtual void OnExtensionDownloadProgress(const std::string& id, - download::DownloadItem* item); - virtual void OnExtensionInstallSuccess(const std::string& id) = 0; - virtual void OnExtensionInstallFailure(const std::string& id, - const std::string& error, - FailureReason reason) = 0; - }; + using SuccessCallback = base::OnceCallback<void(const std::string&)>; + using FailureCallback = base::OnceCallback< + void(const std::string&, const std::string&, FailureReason)>; // Contains information about what parts of the extension install process can // be skipped or modified. If one of these is present, it means that a CRX @@ -178,14 +169,13 @@ const download::DownloadItem& download); // Creates a WebstoreInstaller for downloading and installing the extension - // with the given |id| from the Chrome Web Store. If |delegate| is not - // nullptr, it will be notified when the install succeeds or fails. The - // installer will use the specified |controller| to download the extension. - // Only one WebstoreInstaller can use a specific controller at any given time. - // This also associates the |approval| with this install. Note: the delegate - // should stay alive until being called back. + // with the given `id` from the Chrome Web Store. If `success_callback` is + // non-null, it will be run if the install succeeds. If `failure_callback` + // is non-null, it will be run if the install fails. This also associates + // the `approval` with this install. WebstoreInstaller(Profile* profile, - std::unique_ptr<Delegate> delegate, + SuccessCallback success_callback, + FailureCallback failure_callback, content::WebContents* web_contents, const std::string& id, std::unique_ptr<Approval> approval, @@ -199,10 +189,6 @@ const Extension* extension, bool is_update) override; - // Removes the reference to the delegate passed in the constructor. Used when - // the delegate object must be deleted before this object. - void InvalidateDelegate(); - // Instead of using the default download directory, use |directory| instead. // This does *not* transfer ownership of |directory|. static void SetDownloadDirectoryForTests(base::FilePath* directory); @@ -263,7 +249,8 @@ extension_registry_observation_{this}; base::WeakPtr<content::WebContents> web_contents_; raw_ptr<Profile> profile_; - std::unique_ptr<Delegate> delegate_; + SuccessCallback success_callback_; + FailureCallback failure_callback_; std::string id_; InstallSource install_source_; // The DownloadItem is owned by the DownloadManager and is valid from when
diff --git a/chrome/browser/extensions/webstore_installer_browsertest.cc b/chrome/browser/extensions/webstore_installer_browsertest.cc index 00a09ff..92b6ad7 100644 --- a/chrome/browser/extensions/webstore_installer_browsertest.cc +++ b/chrome/browser/extensions/webstore_installer_browsertest.cc
@@ -11,7 +11,6 @@ #include "base/values.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/scripting_permissions_modifier.h" -#include "chrome/browser/extensions/webstore_installer_callback_delegate.h" #include "chrome/browser/extensions/webstore_installer_test.h" #include "content/public/test/browser_test.h" #include "extensions/browser/extension_registry.h" @@ -41,13 +40,15 @@ class TestWebstoreInstaller : public WebstoreInstaller { public: TestWebstoreInstaller(Profile* profile, - std::unique_ptr<WebstoreInstaller::Delegate> delegate, + SuccessCallback success_callback, + FailureCallback failure_callback, content::WebContents* web_contents, const std::string& id, std::unique_ptr<Approval> approval, InstallSource source) : WebstoreInstaller(profile, - std::move(delegate), + std::move(success_callback), + std::move(failure_callback), web_contents, id, std::move(approval), @@ -139,13 +140,10 @@ SetDoneClosure(run_loop.QuitClosure()); TestWebstoreInstaller* installer = new TestWebstoreInstaller( browser()->profile(), - std::make_unique<WebstoreInstallerCallbackDelegate>( - base::BindOnce( - &WebstoreInstallerBrowserTest::OnExtensionInstallSuccess, - base::Unretained(this)), - base::BindOnce( - &WebstoreInstallerBrowserTest::OnExtensionInstallFailure, - base::Unretained(this))), + base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallSuccess, + base::Unretained(this)), + base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallFailure, + base::Unretained(this)), active_web_contents, kTestExtensionId, std::move(approval), WebstoreInstaller::INSTALL_SOURCE_OTHER); installer->Start(); @@ -173,13 +171,10 @@ SetDoneClosure(run_loop.QuitClosure()); scoped_refptr<TestWebstoreInstaller> installer = new TestWebstoreInstaller( browser()->profile(), - std::make_unique<WebstoreInstallerCallbackDelegate>( - base::BindOnce( - &WebstoreInstallerBrowserTest::OnExtensionInstallSuccess, - base::Unretained(this)), - base::BindOnce( - &WebstoreInstallerBrowserTest::OnExtensionInstallFailure, - base::Unretained(this))), + base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallSuccess, + base::Unretained(this)), + base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallFailure, + base::Unretained(this)), active_web_contents, kTestExtensionId, std::move(approval), WebstoreInstaller::INSTALL_SOURCE_OTHER); installer->Start(); @@ -261,13 +256,10 @@ SetDoneClosure(run_loop.QuitClosure()); TestWebstoreInstaller* installer = new TestWebstoreInstaller( browser()->profile(), - std::make_unique<WebstoreInstallerCallbackDelegate>( - base::BindOnce( - &WebstoreInstallerBrowserTest::OnExtensionInstallSuccess, - base::Unretained(this)), - base::BindOnce( - &WebstoreInstallerBrowserTest::OnExtensionInstallFailure, - base::Unretained(this))), + base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallSuccess, + base::Unretained(this)), + base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallFailure, + base::Unretained(this)), active_web_contents, kTestExtensionWithPermissionsId, std::move(approval), WebstoreInstaller::INSTALL_SOURCE_OTHER); installer->Start();
diff --git a/chrome/browser/extensions/webstore_installer_callback_delegate.cc b/chrome/browser/extensions/webstore_installer_callback_delegate.cc deleted file mode 100644 index f134bbfd..0000000 --- a/chrome/browser/extensions/webstore_installer_callback_delegate.cc +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/webstore_installer_callback_delegate.h" - -#include <string> - -#include "base/functional/callback.h" -#include "chrome/browser/extensions/webstore_installer.h" - -namespace extensions { - -WebstoreInstallerCallbackDelegate::WebstoreInstallerCallbackDelegate( - SuccessCallback success_callback, - FailureCallback failure_callback) - : success_callback_(std::move(success_callback)), - failure_callback_(std::move(failure_callback)) { - CHECK(success_callback_); - CHECK(failure_callback_); -} - -WebstoreInstallerCallbackDelegate::~WebstoreInstallerCallbackDelegate() = - default; - -void WebstoreInstallerCallbackDelegate::OnExtensionInstallSuccess( - const std::string& id) { - CHECK(success_callback_); - std::move(success_callback_).Run(id); -} - -void WebstoreInstallerCallbackDelegate::OnExtensionInstallFailure( - const std::string& id, - const std::string& error, - FailureReason reason) { - CHECK(failure_callback_); - std::move(failure_callback_).Run(id, error, reason); -} - -} // namespace extensions
diff --git a/chrome/browser/extensions/webstore_installer_callback_delegate.h b/chrome/browser/extensions/webstore_installer_callback_delegate.h deleted file mode 100644 index 0fba473..0000000 --- a/chrome/browser/extensions/webstore_installer_callback_delegate.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_CALLBACK_DELEGATE_H_ -#define CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_CALLBACK_DELEGATE_H_ - -#include <string> - -#include "base/functional/callback.h" -#include "chrome/browser/extensions/webstore_installer.h" - -namespace extensions { - -// A utility class for binding callbacks to the WebstoreInstaller::Delegate -// events. -class WebstoreInstallerCallbackDelegate : public WebstoreInstaller::Delegate { - public: - using FailureReason = WebstoreInstaller::FailureReason; - using SuccessCallback = base::OnceCallback<void(const std::string&)>; - using FailureCallback = base::OnceCallback< - void(const std::string&, const std::string&, FailureReason)>; - - WebstoreInstallerCallbackDelegate(SuccessCallback success_callback, - FailureCallback failure_callback); - ~WebstoreInstallerCallbackDelegate() override; - - // WebstoreInstaller::Delegate - void OnExtensionInstallSuccess(const std::string& id) override; - void OnExtensionInstallFailure(const std::string& id, - const std::string& error, - FailureReason reason) override; - - private: - SuccessCallback success_callback_; - FailureCallback failure_callback_; -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_CALLBACK_DELEGATE_H_
diff --git a/chrome/browser/extensions/webstore_standalone_installer.cc b/chrome/browser/extensions/webstore_standalone_installer.cc index 166a5203..8d4835f1 100644 --- a/chrome/browser/extensions/webstore_standalone_installer.cc +++ b/chrome/browser/extensions/webstore_standalone_installer.cc
@@ -17,7 +17,6 @@ #include "chrome/browser/extensions/install_tracker.h" #include "chrome/browser/extensions/scoped_active_install.h" #include "chrome/browser/extensions/webstore_data_fetcher.h" -#include "chrome/browser/extensions/webstore_installer_callback_delegate.h" #include "chrome/browser/profiles/profile.h" #include "components/crx_file/id_util.h" #include "content/public/browser/storage_partition.h" @@ -219,13 +218,10 @@ auto installer = base::MakeRefCounted<WebstoreInstaller>( profile_, - std::make_unique<WebstoreInstallerCallbackDelegate>( - base::BindOnce( - &WebstoreStandaloneInstaller::OnExtensionInstallSuccess, - weak_ptr_factory_.GetWeakPtr()), - base::BindOnce( - &WebstoreStandaloneInstaller::OnExtensionInstallFailure, - weak_ptr_factory_.GetWeakPtr())), + base::BindOnce(&WebstoreStandaloneInstaller::OnExtensionInstallSuccess, + weak_ptr_factory_.GetWeakPtr()), + base::BindOnce(&WebstoreStandaloneInstaller::OnExtensionInstallFailure, + weak_ptr_factory_.GetWeakPtr()), GetWebContents(), id_, std::move(approval), install_source_); installer->Start(); }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index d3c7e2e..a9e3fd0 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -155,6 +155,11 @@ "expiry_milestone": 130 }, { + "name": "android-app-inintegration-safesearch", + "owners": [ "thaothao", "public-content-toast@google.com" ], + "expiry_milestone": 130 + }, + { "name": "android-extended-keyboard-shortcuts", "owners": [ "wbjacksonjr@google.com"], "expiry_milestone": 119 @@ -6975,6 +6980,11 @@ "expiry_milestone": 118 }, { + "name": "shopping-list-track-by-default", + "owners": [ "mdjones", "chrome-shopping-eng@google.com" ], + "expiry_milestone": 120 + }, + { "name": "shortcut-customization-jelly", "owners": [ "jimmyxgong", "zentaro", "cros-peripherals@google.com" ], "expiry_milestone": 122
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 3b5c8a9..f62b8cc 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -72,6 +72,11 @@ const char kAndroidAppIntegrationDescription[] = "If enabled, allows Chrome to integrate with the Android App Search."; +const char kAndroidAppIntegrationSafeSearchName[] = + "SafeSearch in Android App Search"; +const char kAndroidAppIntegrationSafeSearchDescription[] = + "If enabled, allows Chrome to filter out sensitive urls"; + const char kAndroidExtendedKeyboardShortcutsName[] = "Android Extended Keyboard Shortcuts"; const char kAndroidExtendedKeyboardShortcutsDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 2b7601a..6ca6ec0e 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -68,6 +68,9 @@ extern const char kAndroidAppIntegrationName[]; extern const char kAndroidAppIntegrationDescription[]; +extern const char kAndroidAppIntegrationSafeSearchName[]; +extern const char kAndroidAppIntegrationSafeSearchDescription[]; + extern const char kAndroidExtendedKeyboardShortcutsName[]; extern const char kAndroidExtendedKeyboardShortcutsDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 2962062..e6fc12d 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -159,6 +159,7 @@ &kAddToHomescreenIPH, &kAllowNewIncognitoTabIntents, &kAndroidAppIntegration, + &kAndroidAppIntegrationSafeSearch, &kAndroidSearchEngineChoiceNotification, &kAndroidImprovedBookmarks, &kAnimatedImageDragShadow, @@ -282,6 +283,7 @@ &kShowScrollableMVTOnNTPAndroid, &kFeedPositionAndroid, &kSearchResumptionModuleAndroid, + &kScrollToTLDOptimization, &kShareSheetMigrationAndroid, &kShareSheetCustomActionsPolish, &kShouldIgnoreIntentSkipInternalCheck, @@ -448,6 +450,10 @@ "AndroidAppIntegration", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kAndroidAppIntegrationSafeSearch, + "AndroidAppIntegrationSafeSearch", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kAndroidSearchEngineChoiceNotification, "AndroidSearchEngineChoiceNotification", base::FEATURE_ENABLED_BY_DEFAULT); @@ -927,6 +933,10 @@ "SafeModeForCachedFlags", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kScrollToTLDOptimization, + "ScrollToTLDOptimization", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kShowScrollableMVTOnNTPAndroid, "ShowScrollableMVTOnNTPAndroid", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 40fc30e4..5b9e916c 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -20,6 +20,7 @@ BASE_DECLARE_FEATURE(kAddToHomescreenIPH); BASE_DECLARE_FEATURE(kAllowNewIncognitoTabIntents); BASE_DECLARE_FEATURE(kAndroidAppIntegration); +BASE_DECLARE_FEATURE(kAndroidAppIntegrationSafeSearch); BASE_DECLARE_FEATURE(kAndroidSearchEngineChoiceNotification); BASE_DECLARE_FEATURE(kAndroidImprovedBookmarks); BASE_DECLARE_FEATURE(kAnimatedImageDragShadow); @@ -152,6 +153,7 @@ BASE_DECLARE_FEATURE(kShowScrollableMVTOnNTPAndroid); BASE_DECLARE_FEATURE(kFeedPositionAndroid); BASE_DECLARE_FEATURE(kSafeModeForCachedFlags); +BASE_DECLARE_FEATURE(kScrollToTLDOptimization); BASE_DECLARE_FEATURE(kSearchResumptionModuleAndroid); BASE_DECLARE_FEATURE(kShouldIgnoreIntentSkipInternalCheck); BASE_DECLARE_FEATURE(kShareSheetCustomActionsPolish);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index caefa8c..e734231 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -108,6 +108,8 @@ public static final String ADD_TO_HOMESCREEN_IPH = "AddToHomescreenIPH"; public static final String ALLOW_NEW_INCOGNITO_TAB_INTENTS = "AllowNewIncognitoTabIntents"; public static final String ANDROID_APP_INTEGRATION = "AndroidAppIntegration"; + public static final String ANDROID_APP_INTEGRATION_SAFE_SEARCH = + "AndroidAppIntegrationSafeSearch"; public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION = "AndroidSearchEngineChoiceNotification"; public static final String ANDROID_IMPROVED_BOOKMARKS = "AndroidImprovedBookmarks"; @@ -127,6 +129,10 @@ "AutofillEnableNewCardArtAndNetworkImages"; public static final String AUTOFILL_ENABLE_PAYMENTS_MANDATORY_REAUTH = "AutofillEnablePaymentsMandatoryReauth"; + public static final String AUTOFILL_ENABLE_RANKING_FORMULA_ADDRESS_PROFILES = + "AutofillEnableRankingFormulaAddressProfiles"; + public static final String AUTOFILL_ENABLE_RANKING_FORMULA_CREDIT_CARDS = + "AutofillEnableRankingFormulaCreditCards"; public static final String AUTOFILL_ENABLE_SUPPORT_FOR_HONORIFIC_PREFIXES = "AutofillEnableSupportForHonorificPrefixes"; public static final String AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT = @@ -392,6 +398,7 @@ public static final String SAFE_BROWSING_DELAYED_WARNINGS = "SafeBrowsingDelayedWarnings"; public static final String SAFE_MODE_FOR_CACHED_FLAGS = "SafeModeForCachedFlags"; public static final String SCREENSHOTS_FOR_ANDROID_V2 = "ScreenshotsForAndroidV2"; + public static final String SCROLL_TO_TLD_OPTIMIZATION = "ScrollToTLDOptimization"; public static final String SEARCH_RESUMPTION_MODULE_ANDROID = "SearchResumptionModuleAndroid"; public static final String SHOULD_IGNORE_INTENT_SKIP_INTERNAL_CHECK = "ShouldIgnoreIntentSkipInternalCheck";
diff --git a/chrome/browser/locale/BUILD.gn b/chrome/browser/locale/BUILD.gn index 013a143..45b7ce3 100644 --- a/chrome/browser/locale/BUILD.gn +++ b/chrome/browser/locale/BUILD.gn
@@ -72,6 +72,7 @@ } android_library("util_java") { + srcjar_deps = [ ":jni_headers" ] sources = [ "java/src/org/chromium/chrome/browser/locale/LocaleTemplateUrlLoader.java", ] @@ -79,7 +80,7 @@ "//base:jni_java", "//build/android:build_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + resources_package = "org.chromium.chrome.browser.locale" }
diff --git a/chrome/browser/page_load_metrics/BUILD.gn b/chrome/browser/page_load_metrics/BUILD.gn index 6eb931b..c7277b58 100644 --- a/chrome/browser/page_load_metrics/BUILD.gn +++ b/chrome/browser/page_load_metrics/BUILD.gn
@@ -5,6 +5,7 @@ import("//build/config/android/rules.gni") android_library("java") { + srcjar_deps = [ ":jni_headers" ] sources = [ "java/src/org/chromium/chrome/browser/page_load_metrics/PageLoadMetrics.java" ] deps = [ @@ -12,7 +13,6 @@ "//base:jni_java", "//content/public/android:content_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } generate_jni("jni_headers") {
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 59f5a26..c8d8650 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -254,6 +254,10 @@ "//chrome/browser/resources/webapks:resources", ] } + + if (is_android || is_linux || is_chromeos || is_win) { + public_deps += [ "//chrome/browser/resources/sandbox_internals:resources" ] + } } repack("dev_ui_paks") { @@ -298,5 +302,9 @@ ] } + if (is_android || is_linux || is_chromeos || is_win) { + sources += [ "$root_gen_dir/chrome/sandbox_internals_resources.pak" ] + } + deps = [ ":dev_ui_resources" ] }
diff --git a/chrome/browser/resources/internals/BUILD.gn b/chrome/browser/resources/internals/BUILD.gn index 6e23859f4..d05dd8d7 100644 --- a/chrome/browser/resources/internals/BUILD.gn +++ b/chrome/browser/resources/internals/BUILD.gn
@@ -20,10 +20,12 @@ deps = [ "lens:build_grdp", "notifications:build_grdp", + "query_tiles:build_grdp", ] grdp_files = [ "$target_gen_dir/lens/resources.grdp", "$target_gen_dir/notifications/resources.grdp", + "$target_gen_dir/query_tiles/resources.grdp", ] } }
diff --git a/chrome/browser/resources/internals/lens/BUILD.gn b/chrome/browser/resources/internals/lens/BUILD.gn index 727bd5b1b..02a48b9 100644 --- a/chrome/browser/resources/internals/lens/BUILD.gn +++ b/chrome/browser/resources/internals/lens/BUILD.gn
@@ -2,28 +2,23 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//tools/typescript/ts_library.gni") -import("//ui/webui/resources/tools/generate_grd.gni") +import("//ui/webui/resources/tools/build_webui.gni") assert(is_android) -ts_library("build_ts") { - root_dir = "." - out_dir = "$target_gen_dir/tsc" - in_files = [ +build_webui("build") { + grd_prefix = "lens_internals" + + static_files = [ "lens_internals.html" ] + + non_web_component_files = [ "lens_internals.ts", "lens_internals_browser_proxy.ts", ] - definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] - deps = [ "//ui/webui/resources/js:build_ts" ] -} -generate_grd("build_grdp") { - grd_prefix = "lens_internals" - out_grd = "$target_gen_dir/resources.grdp" - input_files = [ "lens_internals.html" ] - input_files_base_dir = rebase_path(".", "//") - deps = [ ":build_ts" ] - manifest_files = - filter_include(get_target_outputs(":build_ts"), [ "*_manifest.json" ]) + ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] + ts_deps = [ "//ui/webui/resources/js:build_ts" ] + + generate_grdp = true + grd_resource_path_prefix = "lens" }
diff --git a/chrome/browser/resources/internals/lens/lens_internals.html b/chrome/browser/resources/internals/lens/lens_internals.html index a06d9f5..1c69153 100644 --- a/chrome/browser/resources/internals/lens/lens_internals.html +++ b/chrome/browser/resources/internals/lens/lens_internals.html
@@ -21,6 +21,6 @@ <div id="debug-data-container"> <table id="debug-data-table" hidden></table> </div> - <script type="module" src="lens_internals.js"></script> + <script type="module" src="/lens/lens_internals.js"></script> </body> </html>
diff --git a/chrome/browser/resources/internals/notifications/BUILD.gn b/chrome/browser/resources/internals/notifications/BUILD.gn index a45e8cf..ceb7e5b 100644 --- a/chrome/browser/resources/internals/notifications/BUILD.gn +++ b/chrome/browser/resources/internals/notifications/BUILD.gn
@@ -2,28 +2,23 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//tools/typescript/ts_library.gni") -import("//ui/webui/resources/tools/generate_grd.gni") +import("//ui/webui/resources/tools/build_webui.gni") assert(is_android) -ts_library("build_ts") { - root_dir = "." - out_dir = "$target_gen_dir/tsc" - in_files = [ +build_webui("build") { + grd_prefix = "notifications_internals" + + static_files = [ "notifications_internals.html" ] + + non_web_component_files = [ "notifications_internals.ts", "notifications_internals_browser_proxy.ts", ] - definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] - deps = [ "//ui/webui/resources/js:build_ts" ] -} -generate_grd("build_grdp") { - grd_prefix = "notifications_internals" - out_grd = "$target_gen_dir/resources.grdp" - input_files = [ "notifications_internals.html" ] - input_files_base_dir = rebase_path(".", "//") - deps = [ ":build_ts" ] - manifest_files = - filter_include(get_target_outputs(":build_ts"), [ "*_manifest.json" ]) + ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] + ts_deps = [ "//ui/webui/resources/js:build_ts" ] + + generate_grdp = true + grd_resource_path_prefix = "notifications" }
diff --git a/chrome/browser/resources/internals/notifications/notifications_internals.html b/chrome/browser/resources/internals/notifications/notifications_internals.html index 7ed87b2..c4f6d36 100644 --- a/chrome/browser/resources/internals/notifications/notifications_internals.html +++ b/chrome/browser/resources/internals/notifications/notifications_internals.html
@@ -31,6 +31,7 @@ <div> <button id="schedule-notification">Schedule</button> </div> - <script type="module" src="notifications_internals.js"></script> + <script type="module" src="/notifications/notifications_internals.js"> + </script> </body> </html>
diff --git a/chrome/browser/resources/internals/query_tiles/BUILD.gn b/chrome/browser/resources/internals/query_tiles/BUILD.gn index 272d3aed..dbf5b08a 100644 --- a/chrome/browser/resources/internals/query_tiles/BUILD.gn +++ b/chrome/browser/resources/internals/query_tiles/BUILD.gn
@@ -2,17 +2,23 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//tools/typescript/ts_library.gni") +import("//ui/webui/resources/tools/build_webui.gni") assert(is_android) -ts_library("build_ts") { - root_dir = "." - out_dir = "$target_gen_dir/tsc" - in_files = [ +build_webui("build") { + grd_prefix = "query_tiles_internals" + + static_files = [ "query_tiles_internals.html" ] + + non_web_component_files = [ "query_tiles_internals.ts", "query_tiles_internals_browser_proxy.ts", ] - definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] - deps = [ "//ui/webui/resources/js:build_ts" ] + + ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] + ts_deps = [ "//ui/webui/resources/js:build_ts" ] + + generate_grdp = true + grd_resource_path_prefix = "query-tiles" }
diff --git a/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html b/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html index 5a4d0907..948d73c 100644 --- a/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html +++ b/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html
@@ -34,6 +34,6 @@ Tile proto: <span id="tile-proto"></span> <div> </div> - <script type="module" src="query_tiles_internals.js"></script> + <script type="module" src="/query-tiles/query_tiles_internals.js"></script> </body> </html>
diff --git a/chrome/browser/resources/sandbox_internals/BUILD.gn b/chrome/browser/resources/sandbox_internals/BUILD.gn index e6734e5..190f7568 100644 --- a/chrome/browser/resources/sandbox_internals/BUILD.gn +++ b/chrome/browser/resources/sandbox_internals/BUILD.gn
@@ -2,33 +2,21 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//tools/grit/preprocess_if_expr.gni") -import("//tools/typescript/ts_library.gni") +import("//ui/webui/resources/tools/build_webui.gni") assert(is_android || is_linux || is_chromeos || is_win) -preprocess_folder = "preprocessed" +build_webui("build") { + grd_prefix = "sandbox_internals" + static_files = [ "sandbox_internals.html" ] -if (is_win) { - ts_files = [ "sandbox_internals_win.ts" ] -} else { - ts_files = [ "sandbox_internals.ts" ] -} - -preprocess_if_expr("preprocess") { - out_folder = "$target_gen_dir/$preprocess_folder" - in_files = ts_files -} - -ts_library("build_ts") { - root_dir = "$target_gen_dir/$preprocess_folder" - out_dir = "$target_gen_dir/tsc" - in_files = ts_files - - if (is_android) { - definitions = [ "./sandbox_android.d.ts" ] + if (is_win) { + non_web_component_files = [ "sandbox_internals_win.ts" ] + } else { + non_web_component_files = [ "sandbox_internals.ts" ] } - - deps = [ "//ui/webui/resources/js:build_ts" ] - extra_deps = [ ":preprocess" ] + ts_deps = [ "//ui/webui/resources/js:build_ts" ] + if (is_android) { + ts_definitions = [ "./sandbox_android.d.ts" ] + } }
diff --git a/chrome/browser/resources/sandbox_internals/sandbox_internals.html b/chrome/browser/resources/sandbox_internals/sandbox_internals.html index eb67433..388c65c 100644 --- a/chrome/browser/resources/sandbox_internals/sandbox_internals.html +++ b/chrome/browser/resources/sandbox_internals/sandbox_internals.html
@@ -41,7 +41,12 @@ } </if> </style> +<if expr="not is_win"> <script type="module" src="sandbox_internals.js"></script> +</if> +<if expr="is_win"> + <script type="module" src="sandbox_internals_win.js"></script> +</if> </head> <body> <h1>Sandbox Status</h1>
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html index e25fecd..7e2e70d 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html +++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html
@@ -108,7 +108,7 @@ </template> <cr-link-row id="keyboardShortcutViewer" class="hr" on-click="onShowKeyboardShortcutViewerClick" - label="$i18n{viewAndCustomizeKeyboardShortcut}" + label="$i18n{showKeyboardShortcutViewer}" external deep-link-focus-id$="[[Setting.kKeyboardShortcuts]]"> </cr-link-row>
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts index 5b8715c..e7c85f0 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts +++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts
@@ -44,7 +44,7 @@ canBeDisabled: boolean|undefined; } -interface NetworkProxySectionElement { +export interface NetworkProxySectionElement { $: { allowShared: SettingsToggleButtonElement, confirmAllowSharedDialog: CrDialogElement, @@ -60,7 +60,7 @@ Constructor<PolymerElement&I18nMixinInterface&RouteObserverMixinInterface& PrefsMixinInterface&CrPolicyNetworkBehaviorMojoInterface>; -class NetworkProxySectionElement extends NetworkProxySectionElementBase { +export class NetworkProxySectionElement extends NetworkProxySectionElementBase { static get is() { return 'network-proxy-section' as const; }
diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.ts b/chrome/browser/resources/settings/chromeos/lazy_load.ts index a68aa2f..c81cd5b 100644 --- a/chrome/browser/resources/settings/chromeos/lazy_load.ts +++ b/chrome/browser/resources/settings/chromeos/lazy_load.ts
@@ -133,6 +133,7 @@ export {SettingsGuestOsSharedUsbDevicesElement} from './guest_os/guest_os_shared_usb_devices.js'; export {SettingsHotspotSubpageElement} from './internet_page/hotspot_subpage.js'; export {NetworkAlwaysOnVpnElement} from './internet_page/network_always_on_vpn.js'; +export {NetworkProxySectionElement} from './internet_page/network_proxy_section.js'; export {SettingsPasspointSubpageElement} from './internet_page/passpoint_subpage.js'; export {TetherConnectionDialogElement} from './internet_page/tether_connection_dialog.js'; export {KerberosAccount, KerberosAccountsBrowserProxy, KerberosAccountsBrowserProxyImpl, KerberosConfigErrorCode, KerberosErrorType, ValidateKerberosConfigResult} from './kerberos_page/kerberos_accounts_browser_proxy.js';
diff --git a/chrome/browser/resources/side_panel/companion/companion.ts b/chrome/browser/resources/side_panel/companion/companion.ts index ebed8e6..3f8e53d7 100644 --- a/chrome/browser/resources/side_panel/companion/companion.ts +++ b/chrome/browser/resources/side_panel/companion/companion.ts
@@ -8,7 +8,7 @@ import {loadTimeData} from '//resources/js/load_time_data.js'; import {Url} from '//resources/mojo/url/mojom/url.mojom-webui.js'; -import {ImageQuery, MethodType, PromoAction, PromoType} from './companion.mojom-webui.js'; +import {ImageQuery, MethodType, PromoAction, PromoType, VisualSearchResult} from './companion.mojom-webui.js'; import {CompanionProxy, CompanionProxyImpl} from './companion_proxy.js'; /** @@ -62,6 +62,9 @@ // Arguments for sending text find results from browser to iframe. CQ_TEXT_FIND_RESULTS = 'cqTextFindResults', + + // Arguments for sending Visual Search results from browser to iframe. + VISUAL_SEARCH_PARAMS = 'visualSearchParams', } const companionProxy: CompanionProxy = CompanionProxyImpl.getInstance(); @@ -168,6 +171,21 @@ companionProxy.handler.showUI(); } +// POST dataUris from the Visual Search classification results to the iframe +companionProxy.callbackRouter.onDeviceVisualClassificationResult.addListener( + (results: VisualSearchResult[]) => { + const dataUris = results.map(result => result.dataUri); + const message = {[ParamType.VISUAL_SEARCH_PARAMS]: dataUris}; + + const companionOrigin = + new URL(loadTimeData.getString('companion_origin')).origin; + const frame = document.body.querySelector('iframe'); + assert(frame); + if (frame.contentWindow) { + frame.contentWindow.postMessage(message, companionOrigin); + } + }); + // Handler for postMessage() calls from the embedded iframe. function onCompanionMessageEvent(event: MessageEvent) { // Because the |companion_origin| string has a trailing slash that can cause
diff --git a/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc b/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc index ea3cd13..4c00ff0 100644 --- a/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc +++ b/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc
@@ -164,6 +164,7 @@ "fr-CA", // French (Canada) "fr-CH", // French (Switzerland) "fr-FR", // French (France) + "id", // Indonesian "it", // Italian "it-CH", // Italian (Switzerland) "it-IT", // Italian (Italy) @@ -172,6 +173,7 @@ "pt", // Portuguese "pt-BR", // Portuguese (Brazil) "pt-PT", // Portuguese (Portugal) + "ru", // Russian "sv", // Swedish "tr", // Turkish });
diff --git a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc index 87f713d..d801e7c0 100644 --- a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc +++ b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
@@ -5,8 +5,6 @@ #include "chrome/browser/storage_access_api/storage_access_grant_permission_context.h" #include "base/barrier_callback.h" -#include "base/run_loop.h" -#include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" @@ -128,13 +126,13 @@ DIPSService* dips_service = DIPSService::Get(browser_context()); CHECK(dips_service); - base::RunLoop run_loop; + base::test::TestFuture<void> future; dips_service->storage() ->AsyncCall(&DIPSStorage::RecordInteraction) .WithArgs(GetRequesterURL(), base::Time::Now(), DIPSCookieMode::kBlock3PC) - .Then(run_loop.QuitClosure()); - run_loop.Run(); + .Then(future.GetCallback()); + ASSERT_TRUE(future.Wait()); } void TearDown() override { @@ -405,19 +403,15 @@ const int implicit_grant_limit = blink::features::kStorageAccessAPIImplicitGrantLimit.Get(); - base::RunLoop run_loop; - auto barrier = base::BarrierCallback<ContentSetting>( - implicit_grant_limit, - base::BindLambdaForTesting( - [&](const std::vector<ContentSetting> results) { - run_loop.Quit(); - })); + base::test::TestFuture<const std::vector<ContentSetting>> future; + auto barrier = base::BarrierCallback<ContentSetting>(implicit_grant_limit, + future.GetCallback()); for (int grant_id = 0; grant_id < implicit_grant_limit; grant_id++) { permission_context.DecidePermissionForTesting( fake_id, requesting_origin, GetDummyEmbeddingUrl(grant_id), /*user_gesture=*/true, barrier); } - run_loop.Run(); + ASSERT_TRUE(future.Wait()); EXPECT_FALSE(request_manager()->IsRequestInProgress()); }
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn index 06c5d71..79f095f 100644 --- a/chrome/browser/tab/BUILD.gn +++ b/chrome/browser/tab/BUILD.gn
@@ -59,6 +59,8 @@ ] srcjar_deps = [ + ":jni_headers", + # TabSelectionType, TabLaunchType "//chrome/browser/ui:tab_model_enums_java", @@ -111,7 +113,6 @@ "//url:origin_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] resources_package = "org.chromium.chrome.browser.tab" }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java index 3bd9977..9cf2e14e6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -9,6 +9,7 @@ import android.graphics.Paint; import android.graphics.Rect; import android.os.Build; +import android.os.SystemClock; import android.provider.Settings; import android.text.Editable; import android.text.InputType; @@ -39,8 +40,11 @@ import org.chromium.base.SysUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.compat.ApiHelperForO; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.back_press.BackPressManager; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.MutableFlagWithSafeDefault; import org.chromium.components.browser_ui.share.ShareHelper; import org.chromium.components.browser_ui.util.FirstDrawDetector; import org.chromium.ui.KeyboardVisibilityDelegate; @@ -62,6 +66,9 @@ private static final int MAX_DISPLAYABLE_LENGTH = 4000; private static final int MAX_DISPLAYABLE_LENGTH_LOW_END = 1000; + private static final MutableFlagWithSafeDefault sScrollToTLDOptimizationsFlag = + new MutableFlagWithSafeDefault(ChromeFeatureList.SCROLL_TO_TLD_OPTIMIZATION, false); + // Stylus handwriting: Setting this ime option instructs stylus writing service to restrict // capturing writing events slightly outside the Url bar area. This is needed to prevent stylus // handwriting in inputs in web content area that are very close to url bar area, from being @@ -685,6 +692,18 @@ scrollDisplayTextInternal(mScrollType); } + private boolean isVisibleTextTheSame(Editable text) { + if (text == null) { + return false; + } + + if (mVisibleTextPrefixHint != null) { + return TextUtils.indexOf(text, mVisibleTextPrefixHint) == 0; + } + + return TextUtils.equals(text, mPreviousScrollText); + } + /** * Scrolls the omnibox text to the position specified, based on the {@link ScrollType}. * @@ -708,19 +727,23 @@ boolean currentIsRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; int measuredWidth = getVisibleMeasuredViewportWidth(); - if (scrollType == mPreviousScrollType && TextUtils.equals(text, mPreviousScrollText) + + if (scrollType == mPreviousScrollType && measuredWidth == mPreviousScrollViewWidth // Font size is float but it changes in discrete range (eg small font, big font), // therefore false negative using regular equality is unlikely. && currentTextSize == mPreviousScrollFontSize - && currentIsRtl == mPreviousScrollWasRtl) { + && currentIsRtl == mPreviousScrollWasRtl && isVisibleTextTheSame(text)) { scrollTo(mPreviousScrollResultXPosition, getScrollY()); return; } switch (scrollType) { case ScrollType.SCROLL_TO_TLD: + final long startTime = SystemClock.elapsedRealtime(); scrollToTLD(); + RecordHistogram.recordTimesHistogram( + "Omnibox.ScrollToTLD.Duration", SystemClock.elapsedRealtime() - startTime); break; case ScrollType.SCROLL_TO_BEGINNING: scrollToBeginning(); @@ -809,10 +832,7 @@ mVisibleTextPrefixHint = url.subSequence(0, Math.min(originEndIndex + 1, urlTextLength)); } else { - int finalVisibleCharIndex = textLayout.getOffsetForHorizontal(0, measuredWidth); - if (finalVisibleCharIndex == urlTextLength - && textLayout.getPrimaryHorizontal(finalVisibleCharIndex) - <= measuredWidth) { + if (textLayout.getPrimaryHorizontal(urlTextLength) <= measuredWidth) { // Only store the visibility hint if the text is wider than the viewport. Text // narrower than the viewport is not a useful hint because a consumer would not // understand if a subsequent character would be visible on screen or not. @@ -823,6 +843,18 @@ // padding. mVisibleTextPrefixHint = null; } else { + int finalVisibleCharIndex; + if (sScrollToTLDOptimizationsFlag.isEnabled()) { + // getOffsetForHorizontal is very slow. getOffsetForAdvance is much faster. + finalVisibleCharIndex = textLayout.getPaint().getOffsetForAdvance( + url, 0, urlTextLength, 0, urlTextLength, false, measuredWidth); + assert finalVisibleCharIndex + == textLayout.getOffsetForHorizontal(0, measuredWidth) + : "scrollToTLD incorrect optimized finalVisibleCharIndex"; + } else { + finalVisibleCharIndex = textLayout.getOffsetForHorizontal(0, measuredWidth); + } + // To avoid issues where a small portion of the character following // finalVisibleCharIndex is visible on screen, be more conservative and extend // the visual hint by an additional character. In testing,
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java index 7425918c..a34ed22 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java
@@ -175,7 +175,7 @@ updateUrlBarText( getUrlText() + "/foooooo", UrlBar.ScrollType.SCROLL_TO_TLD, domain.length()); - assertTextEquals(urlText + "/", getVisibleTextPrefixHint()); + assertTextEquals(urlText, getVisibleTextPrefixHint()); } @Test
diff --git a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc index bf526e3..ac4851e3 100644 --- a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc +++ b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc
@@ -4,14 +4,21 @@ #include "chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h" +#include <algorithm> +#include <functional> #include <memory> #include <string> #include <utility> +#include <vector> #include "ash/glanceables/classroom/glanceables_classroom_types.h" +#include "base/barrier_closure.h" #include "base/check.h" +#include "base/containers/flat_map.h" #include "base/functional/bind.h" +#include "base/functional/callback_forward.h" #include "base/functional/callback_helpers.h" +#include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "base/types/expected.h" #include "google_apis/classroom/classroom_api_course_work_response_types.h" @@ -116,6 +123,21 @@ return GlanceablesClassroomStudentSubmission::State::kOther; } +// TODO(b/283369115): consider doing this only once after fetching all +// submissions. +base::flat_map<std::string, std::vector<GlanceablesClassroomStudentSubmission*>> +GroupStudentSubmissionsByCourseWorkId( + const std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>& + student_submissions) { + base::flat_map<std::string, + std::vector<GlanceablesClassroomStudentSubmission*>> + grouped_submissions; + for (const auto& submission : student_submissions) { + grouped_submissions[submission->course_work_id].push_back(submission.get()); + } + return grouped_submissions; +} + } // namespace GlanceablesClassroomClientImpl::GlanceablesClassroomClientImpl( @@ -125,38 +147,113 @@ GlanceablesClassroomClientImpl::~GlanceablesClassroomClientImpl() = default; +void GlanceablesClassroomClientImpl::IsStudentRoleActive( + IsRoleEnabledCallback callback) { + CHECK(callback); + + InvokeOnceStudentDataFetched(base::BindOnce( + [](base::WeakPtr<GlanceablesClassroomClientImpl> self, + base::OnceCallback<void(bool active)> callback) { + if (!self) { + std::move(callback).Run(false); + return; + } + std::move(callback).Run(!self->student_courses_.empty()); + }, + weak_factory_.GetWeakPtr(), std::move(callback))); +} + +void GlanceablesClassroomClientImpl::GetCompletedStudentAssignments( + GetStudentAssignmentsCallback callback) { + CHECK(callback); + + auto due_predicate = base::BindRepeating( + [](const absl::optional<base::Time>& due) { return true; }); + auto submission_state_predicate = base::BindRepeating( + [](GlanceablesClassroomStudentSubmission::State state) { + return state == + GlanceablesClassroomStudentSubmission::State::kTurnedIn || + state == GlanceablesClassroomStudentSubmission::State::kGraded; + }); + InvokeOnceStudentDataFetched(base::BindOnce( + &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments, + weak_factory_.GetWeakPtr(), std::move(due_predicate), + std::move(submission_state_predicate), std::move(callback))); +} + +void GlanceablesClassroomClientImpl:: + GetStudentAssignmentsWithApproachingDueDate( + GetStudentAssignmentsCallback callback) { + CHECK(callback); + + auto due_predicate = base::BindRepeating( + [](const base::Time& now, const absl::optional<base::Time>& due) { + return due.has_value() && now < due.value(); + }, + base::Time::Now()); + auto submission_state_predicate = base::BindRepeating( + [](GlanceablesClassroomStudentSubmission::State state) { + return state == GlanceablesClassroomStudentSubmission::State::kAssigned; + }); + InvokeOnceStudentDataFetched(base::BindOnce( + &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments, + weak_factory_.GetWeakPtr(), std::move(due_predicate), + std::move(submission_state_predicate), std::move(callback))); +} + +void GlanceablesClassroomClientImpl::GetStudentAssignmentsWithMissedDueDate( + GetStudentAssignmentsCallback callback) { + CHECK(callback); + + auto due_predicate = base::BindRepeating( + [](const base::Time& now, const absl::optional<base::Time>& due) { + return due.has_value() && now > due.value(); + }, + base::Time::Now()); + auto submission_state_predicate = base::BindRepeating( + [](GlanceablesClassroomStudentSubmission::State state) { + return state == GlanceablesClassroomStudentSubmission::State::kAssigned; + }); + InvokeOnceStudentDataFetched(base::BindOnce( + &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments, + weak_factory_.GetWeakPtr(), std::move(due_predicate), + std::move(submission_state_predicate), std::move(callback))); +} + +void GlanceablesClassroomClientImpl::GetStudentAssignmentsWithoutDueDate( + GetStudentAssignmentsCallback callback) { + CHECK(callback); + + auto due_predicate = base::BindRepeating( + [](const absl::optional<base::Time>& due) { return !due.has_value(); }); + auto submission_state_predicate = base::BindRepeating( + [](GlanceablesClassroomStudentSubmission::State state) { + return state == GlanceablesClassroomStudentSubmission::State::kAssigned; + }); + InvokeOnceStudentDataFetched(base::BindOnce( + &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments, + weak_factory_.GetWeakPtr(), std::move(due_predicate), + std::move(submission_state_predicate), std::move(callback))); +} + void GlanceablesClassroomClientImpl::FetchStudentCourses( FetchCoursesCallback callback) { CHECK(callback); - if (student_courses_) { - // Invoke callback immediately with previously cached student courses. - std::move(callback).Run(student_courses_.get()); - return; - } - - student_courses_ = - std::make_unique<ui::ListModel<GlanceablesClassroomCourse>>(); - FetchCoursesPage(/*student_id=*/kOwnCoursesFilterValue, /*teacher_id=*/"", - /*page_token=*/"", student_courses_.get(), - std::move(callback)); + student_courses_.clear(); + FetchCoursesPage( + /*student_id=*/kOwnCoursesFilterValue, /*teacher_id=*/"", + /*page_token=*/"", student_courses_, std::move(callback)); } void GlanceablesClassroomClientImpl::FetchTeacherCourses( FetchCoursesCallback callback) { CHECK(callback); - if (teacher_courses_) { - // Invoke callback immediately with previously cached teacher courses. - std::move(callback).Run(teacher_courses_.get()); - return; - } - - teacher_courses_ = - std::make_unique<ui::ListModel<GlanceablesClassroomCourse>>(); - FetchCoursesPage(/*student_id=*/"", /*teacher_id=*/kOwnCoursesFilterValue, - /*page_token=*/"", teacher_courses_.get(), - std::move(callback)); + teacher_courses_.clear(); + FetchCoursesPage( + /*student_id=*/"", /*teacher_id=*/kOwnCoursesFilterValue, + /*page_token=*/"", teacher_courses_, std::move(callback)); } void GlanceablesClassroomClientImpl::FetchCourseWork( @@ -167,12 +264,9 @@ const auto [iter, inserted] = course_work_.emplace( course_id, - std::make_unique<ui::ListModel<GlanceablesClassroomCourseWorkItem>>()); - + std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>()); if (!inserted) { - // Invoke callback immediately with previously cached course work items. - std::move(callback).Run(iter->second.get()); - return; + iter->second.clear(); } FetchCourseWorkPage(course_id, /*page_token=*/"", std::move(callback)); @@ -186,26 +280,43 @@ const auto [iter, inserted] = student_submissions_.emplace( course_id, - std::make_unique<ui::ListModel<GlanceablesClassroomStudentSubmission>>()); - + std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>()); if (!inserted) { - // Invoke callback immediately with previously cached student submissions. - std::move(callback).Run(iter->second.get()); - return; + iter->second.clear(); } FetchStudentSubmissionsPage(course_id, /*page_token=*/"", std::move(callback)); } +void GlanceablesClassroomClientImpl::InvokeOnceStudentDataFetched( + base::OnceClosure callback) { + CHECK(callback); + + if (student_data_fetch_status_ == FetchStatus::kFetched) { + std::move(callback).Run(); + return; + } + + callbacks_waiting_for_student_data_.push_back(std::move(callback)); + + if (student_data_fetch_status_ == FetchStatus::kNotFetched) { + student_data_fetch_status_ = FetchStatus::kFetching; + FetchStudentCourses(base::BindOnce( + &GlanceablesClassroomClientImpl::OnCoursesFetched, + weak_factory_.GetWeakPtr(), + base::BindOnce(&GlanceablesClassroomClientImpl::OnStudentDataFetched, + weak_factory_.GetWeakPtr()))); + } +} + void GlanceablesClassroomClientImpl::FetchCoursesPage( const std::string& student_id, const std::string& teacher_id, const std::string& page_token, - ui::ListModel<GlanceablesClassroomCourse>* courses_container, + std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses_container, FetchCoursesCallback callback) { CHECK(!student_id.empty() || !teacher_id.empty()); - CHECK(courses_container); CHECK(callback); auto* const request_sender = GetRequestSender(); @@ -214,33 +325,30 @@ request_sender, student_id, teacher_id, page_token, base::BindOnce(&GlanceablesClassroomClientImpl::OnCoursesPageFetched, weak_factory_.GetWeakPtr(), student_id, teacher_id, - courses_container, std::move(callback)))); + std::ref(courses_container), std::move(callback)))); } void GlanceablesClassroomClientImpl::OnCoursesPageFetched( const std::string& student_id, const std::string& teacher_id, - ui::ListModel<GlanceablesClassroomCourse>* courses_container, + std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses_container, FetchCoursesCallback callback, base::expected<std::unique_ptr<Courses>, ApiErrorCode> result) { CHECK(!student_id.empty() || !teacher_id.empty()); - CHECK(courses_container); CHECK(callback); if (!result.has_value()) { // TODO(b/282013130): handle failures of a single page fetch request more // gracefully (retry and/or reflect errors on UI). - courses_container->DeleteAll(); + courses_container.clear(); std::move(callback).Run(courses_container); return; } for (const auto& item : result.value()->items()) { if (item->state() == Course::State::kActive) { - courses_container->Add(std::make_unique<GlanceablesClassroomCourse>( + courses_container.push_back(std::make_unique<GlanceablesClassroomCourse>( item->id(), item->name())); - FetchCourseWork(item->id(), base::DoNothing()); - FetchStudentSubmissions(item->id(), base::DoNothing()); } } @@ -252,6 +360,35 @@ } } +void GlanceablesClassroomClientImpl::OnCoursesFetched( + base::OnceClosure on_course_work_and_student_submissions_fetched, + const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses) { + CHECK(on_course_work_and_student_submissions_fetched); + + // `FetchCourseWork()` + `FetchStudentSubmissions()` per course. + const auto expected_callback_calls = courses.size() * 2; + const auto barrier_closure = base::BarrierClosure( + expected_callback_calls, + std::move(on_course_work_and_student_submissions_fetched)); + + for (const auto& course : courses) { + // Helps to prevent the presubmit error. Otherwise it thinks explicit + // `std::unique_ptr` constructor is called with `barrier_closure` and asks + // to use `std::make_unique<T>()` or `base::WrapUnique` instead. Looks like + // a false-positive regular expression match. + using FetchCourseWorkIgnoredArg = + const std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>&; + using FetchStudentSubmissionsIgnoredArg = const std::vector< + std::unique_ptr<GlanceablesClassroomStudentSubmission>>&; + + FetchCourseWork(course->id, base::IgnoreArgs<FetchCourseWorkIgnoredArg>( + barrier_closure)); + FetchStudentSubmissions( + course->id, + base::IgnoreArgs<FetchStudentSubmissionsIgnoredArg>(barrier_closure)); + } +} + void GlanceablesClassroomClientImpl::FetchCourseWorkPage( const std::string& course_id, const std::string& page_token, @@ -280,21 +417,22 @@ if (!result.has_value()) { // TODO(b/282013130): handle failures of a single page fetch request more // gracefully (retry and/or reflect errors on UI). - iter->second->DeleteAll(); - std::move(callback).Run(iter->second.get()); + iter->second.clear(); + std::move(callback).Run(iter->second); return; } for (const auto& item : result.value()->items()) { if (item->state() == CourseWorkItem::State::kPublished) { - iter->second->Add(std::make_unique<GlanceablesClassroomCourseWorkItem>( - item->id(), item->title(), item->alternate_link(), - ConvertCourseWorkItemDue(item->due_date_time()))); + iter->second.push_back( + std::make_unique<GlanceablesClassroomCourseWorkItem>( + item->id(), item->title(), item->alternate_link(), + ConvertCourseWorkItemDue(item->due_date_time()))); } } if (result.value()->next_page_token().empty()) { - std::move(callback).Run(iter->second.get()); + std::move(callback).Run(iter->second); } else { FetchCourseWorkPage(course_id, result.value()->next_page_token(), std::move(callback)); @@ -330,25 +468,85 @@ if (!result.has_value()) { // TODO(b/282013130): handle failures of a single page fetch request more // gracefully (retry and/or reflect errors on UI). - iter->second->DeleteAll(); - std::move(callback).Run(iter->second.get()); + iter->second.clear(); + std::move(callback).Run(iter->second); return; } for (const auto& item : result.value()->items()) { - iter->second->Add(std::make_unique<GlanceablesClassroomStudentSubmission>( - item->id(), item->course_work_id(), - CalculateStudentSubmissionState(item))); + iter->second.push_back( + std::make_unique<GlanceablesClassroomStudentSubmission>( + item->id(), item->course_work_id(), + CalculateStudentSubmissionState(item))); } if (result.value()->next_page_token().empty()) { - std::move(callback).Run(iter->second.get()); + std::move(callback).Run(iter->second); } else { FetchStudentSubmissionsPage(course_id, result.value()->next_page_token(), std::move(callback)); } } +void GlanceablesClassroomClientImpl::OnStudentDataFetched() { + student_data_fetch_status_ = FetchStatus::kFetched; + for (auto& cb : callbacks_waiting_for_student_data_) { + std::move(cb).Run(); + } +} + +void GlanceablesClassroomClientImpl::GetFilteredStudentAssignments( + base::RepeatingCallback<bool(const absl::optional<base::Time>&)> + due_predicate, + base::RepeatingCallback<bool(GlanceablesClassroomStudentSubmission::State)> + submission_state_predicate, + GetStudentAssignmentsCallback callback) { + CHECK(due_predicate); + CHECK(submission_state_predicate); + CHECK(callback); + + std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>> + filtered_assignments; + + for (const auto& course : student_courses_) { + const auto course_work_iter = course_work_.find(course->id); + const auto submissions_iter = student_submissions_.find(course->id); + if (course_work_iter == course_work_.end() || + submissions_iter == student_submissions_.end()) { + continue; + } + + const auto submissions = + GroupStudentSubmissionsByCourseWorkId(submissions_iter->second); + + for (const auto& course_work_item : course_work_iter->second) { + if (!due_predicate.Run(course_work_item->due)) { + continue; + } + + const auto submission_iter = submissions.find(course_work_item->id); + if (submission_iter == submissions.end()) { + continue; + } + + // There should be only one iteration, because course work item and + // student submission have 1:1 relationship for students. + for (const auto* const submission : submission_iter->second) { + if (!submission_state_predicate.Run(submission->state)) { + continue; + } + + filtered_assignments.push_back( + std::make_unique<GlanceablesClassroomStudentAssignment>( + course->name, course_work_item->title, course_work_item->link, + course_work_item->due)); + } + } + } + + std::move(callback).Run(std::move(filtered_assignments)); +} + RequestSender* GlanceablesClassroomClientImpl::GetRequestSender() { if (!request_sender_) { CHECK(create_request_sender_callback_);
diff --git a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h index 53fc984..83cd8b91 100644 --- a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h +++ b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h
@@ -10,13 +10,15 @@ #include <vector> #include "ash/glanceables/classroom/glanceables_classroom_client.h" +#include "ash/glanceables/classroom/glanceables_classroom_types.h" #include "base/containers/flat_map.h" #include "base/functional/callback_forward.h" +#include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" #include "base/types/expected.h" #include "google_apis/common/api_error_codes.h" #include "google_apis/common/request_sender.h" -#include "ui/base/models/list_model.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace google_apis::classroom { class Courses; @@ -30,10 +32,6 @@ namespace ash { -struct GlanceablesClassroomCourse; -struct GlanceablesClassroomCourseWorkItem; -struct GlanceablesClassroomStudentSubmission; - // Provides implementation for `GlanceablesClassroomClient`. Responsible for // communication with Google Classroom API. class GlanceablesClassroomClientImpl : public GlanceablesClassroomClient { @@ -44,26 +42,58 @@ const std::vector<std::string>& scopes, const net::NetworkTrafficAnnotationTag& traffic_annotation_tag)>; - // Done callback for fetching all courses for student or teacher roles. - using FetchCoursesCallback = base::OnceCallback<void( - ui::ListModel<GlanceablesClassroomCourse>* courses)>; - - // Done callback for fetching all course work items in a course. - using FetchCourseWorkCallback = base::OnceCallback<void( - ui::ListModel<GlanceablesClassroomCourseWorkItem>* course_work)>; - - // Done callback for fetching all student submissions in a course. - using FetchStudentSubmissionsCallback = base::OnceCallback<void( - ui::ListModel<GlanceablesClassroomStudentSubmission>* - student_submissions)>; - explicit GlanceablesClassroomClientImpl( const CreateRequestSenderCallback& create_request_sender_callback); GlanceablesClassroomClientImpl(const GlanceablesClassroomClientImpl&) = delete; GlanceablesClassroomClientImpl& operator=( const GlanceablesClassroomClientImpl&) = delete; - ~GlanceablesClassroomClientImpl(); + ~GlanceablesClassroomClientImpl() override; + + // GlanceablesClassroomClient: + void IsStudentRoleActive(IsRoleEnabledCallback callback) override; + void GetCompletedStudentAssignments( + GetStudentAssignmentsCallback callback) override; + void GetStudentAssignmentsWithApproachingDueDate( + GetStudentAssignmentsCallback callback) override; + void GetStudentAssignmentsWithMissedDueDate( + GetStudentAssignmentsCallback callback) override; + void GetStudentAssignmentsWithoutDueDate( + GetStudentAssignmentsCallback callback) override; + + private: + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, FetchCourses); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, + FetchCoursesOnHttpError); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, + FetchCoursesMultiplePages); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, FetchCourseWork); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, + FetchCourseWorkOnHttpError); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, + FetchCourseWorkMultiplePages); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, + FetchStudentSubmissions); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, + FetchStudentSubmissionsOnHttpError); + FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, + FetchStudentSubmissionsMultiplePages); + + // Done callback for fetching all courses for student or teacher roles. + using FetchCoursesCallback = base::OnceCallback<void( + const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses)>; + + // Done callback for fetching all course work items in a course. + using FetchCourseWorkCallback = base::OnceCallback<void( + const std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>& + course_work)>; + + // Done callback for fetching all student submissions in a course. + using FetchStudentSubmissionsCallback = base::OnceCallback<void( + const std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>& + student_submissions)>; + + enum class FetchStatus { kNotFetched, kFetching, kFetched }; // Fetches all courses for student and teacher roles and invokes `callback` // when done. @@ -80,7 +110,9 @@ void FetchStudentSubmissions(const std::string& course_id, FetchStudentSubmissionsCallback callback); - private: + // Delays executing `callback` until all student data are fetched. + void InvokeOnceStudentDataFetched(base::OnceClosure callback); + // Fetches one page of courses. // `student_id` - restricts returned courses to those having a student // with the specified identifier. Use an empty string @@ -101,7 +133,8 @@ const std::string& student_id, const std::string& teacher_id, const std::string& page_token, - ui::ListModel<GlanceablesClassroomCourse>* courses_container, + std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& + courses_container, FetchCoursesCallback callback); // Callback for `FetchCoursesPage()`. If `next_page_token()` in the `result` @@ -110,11 +143,19 @@ void OnCoursesPageFetched( const std::string& student_id, const std::string& teacher_id, - ui::ListModel<GlanceablesClassroomCourse>* courses_container, + std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& + courses_container, FetchCoursesCallback callback, base::expected<std::unique_ptr<google_apis::classroom::Courses>, google_apis::ApiErrorCode> result); + // Callback for `FetchStudentCourses()` or `FetchTeacherCourses()`. Triggers + // fetching course work and student submissions for fetched `courses` and + // invokes `on_course_work_and_student_submissions_fetched` when done. + void OnCoursesFetched( + base::OnceClosure on_course_work_and_student_submissions_fetched, + const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses); + // Fetches one page of course work items. // `course_id` - identifier of the course. // `page_token` - token specifying the result page to return, comes from the @@ -160,6 +201,25 @@ std::unique_ptr<google_apis::classroom::StudentSubmissions>, google_apis::ApiErrorCode> result); + // Invokes all pending callbacks from `callbacks_waiting_for_student_data_` + // once all student data are fetched (courses + course work + student + // submissions). + void OnStudentDataFetched(); + + // Selects student assignments that satisfy both filtering predicates below. + // `due_predicate` - returns `true` if passed due date/time + // satisfies filtering requirements. + // `submission_state_predicate` - returns `true` if passed submission state + // satisfies filtering requirements. + // `callback` - invoked with filtered results. + void GetFilteredStudentAssignments( + base::RepeatingCallback<bool(const absl::optional<base::Time>&)> + due_predicate, + base::RepeatingCallback< + bool(GlanceablesClassroomStudentSubmission::State)> + submission_state_predicate, + GetStudentAssignmentsCallback callback); + // Returns lazily initialized `request_sender_`. google_apis::RequestSender* GetRequestSender(); @@ -170,24 +230,28 @@ // Helper class that sends requests, handles retries and authentication. std::unique_ptr<google_apis::RequestSender> request_sender_; - // Available courses for student and teacher roles. Initialized after the - // first fetch request to distinguish between "not fetched yet" vs. "fetched, - // but has no items". - std::unique_ptr<ui::ListModel<GlanceablesClassroomCourse>> student_courses_; - std::unique_ptr<ui::ListModel<GlanceablesClassroomCourse>> teacher_courses_; + // Available courses for student and teacher roles. + std::vector<std::unique_ptr<GlanceablesClassroomCourse>> student_courses_; + std::vector<std::unique_ptr<GlanceablesClassroomCourse>> teacher_courses_; // All course work items grouped by course id. base::flat_map< std::string, - std::unique_ptr<ui::ListModel<GlanceablesClassroomCourseWorkItem>>> + std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>> course_work_; // All student submissions grouped by course id. base::flat_map< std::string, - std::unique_ptr<ui::ListModel<GlanceablesClassroomStudentSubmission>>> + std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>> student_submissions_; + // Fetch status of all student data. + FetchStatus student_data_fetch_status_ = FetchStatus::kNotFetched; + + // Pending callbacks awaiting all student data. + std::vector<base::OnceClosure> callbacks_waiting_for_student_data_; + base::WeakPtrFactory<GlanceablesClassroomClientImpl> weak_factory_{this}; };
diff --git a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc index b509aaf..f9f6f319 100644 --- a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc +++ b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc
@@ -13,10 +13,11 @@ #include "base/command_line.h" #include "base/functional/bind.h" #include "base/memory/scoped_refptr.h" +#include "base/run_loop.h" #include "base/test/bind.h" -#include "base/test/repeating_test_future.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" +#include "base/time/time_override.h" #include "content/public/test/browser_task_environment.h" #include "google_apis/common/dummy_auth_service.h" #include "google_apis/common/request_sender.h" @@ -30,12 +31,11 @@ #include "services/network/test/test_shared_url_loader_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/models/list_model.h" namespace ash { namespace { -using ::base::test::RepeatingTestFuture; +using ::base::subtle::ScopedTimeClockOverrides; using ::base::test::TestFuture; using ::google_apis::util::FormatTimeAsString; using ::net::test_server::BasicHttpResponse; @@ -103,6 +103,22 @@ test_server_.base_url().spec()); } + void ExpectActiveCourse() { + EXPECT_CALL(request_handler(), + HandleRequest( + Field(&HttpRequest::relative_url, HasSubstr("/courses?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "courses": [ + { + "id": "course-id-1", + "name": "Active Course 1", + "courseState": "ACTIVE" + } + ] + })")))); + } + GlanceablesClassroomClientImpl* client() { return client_.get(); } TestRequestHandler& request_handler() { return request_handler_; } @@ -144,16 +160,6 @@ ] })"); })); - EXPECT_CALL(request_handler(), - HandleRequest( - Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) - .WillRepeatedly(Invoke( - []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); })); - EXPECT_CALL(request_handler(), - HandleRequest(Field(&HttpRequest::relative_url, - HasSubstr("/studentSubmissions?")))) - .WillRepeatedly(Invoke( - []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); })); auto fetch_courses_methods = std::vector<base::RepeatingCallback<void( GlanceablesClassroomClientImpl::FetchCoursesCallback)>>{ @@ -163,70 +169,19 @@ base::Unretained(client()))}; for (auto fetch_method : fetch_courses_methods) { - TestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future; - fetch_method.Run(future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + fetch_method.Run(base::BindLambdaForTesting( + [&run_loop]( + const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& + courses) { + run_loop.Quit(); - const auto* const courses = future.Get(); - ASSERT_EQ(courses->item_count(), 1u); + ASSERT_EQ(courses.size(), 1u); - EXPECT_EQ(courses->GetItemAt(0)->id, "course-id-1"); - EXPECT_EQ(courses->GetItemAt(0)->name, "Active Course 1"); - } -} - -TEST_F(GlanceablesClassroomClientImplTest, FetchCoursesOnSubsequentCalls) { - EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, - HasSubstr("/courses?")))) - .Times( - 2 /* 1 for `FetchStudentCourses()` + 1 for `FetchTeacherCourses()` */) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( - { - "courses": [ - { - "id": "course-id-1", - "name": "Active Course 1", - "courseState": "ACTIVE" - }, - { - "id": "course-id-2", - "name": "??? Course 2", - "courseState": "???" - } - ] - })"); - })); - EXPECT_CALL(request_handler(), - HandleRequest( - Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) - .WillRepeatedly(Invoke( - []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); })); - EXPECT_CALL(request_handler(), - HandleRequest(Field(&HttpRequest::relative_url, - HasSubstr("/studentSubmissions?")))) - .WillRepeatedly(Invoke( - []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); })); - - auto fetch_courses_methods = std::vector<base::RepeatingCallback<void( - GlanceablesClassroomClientImpl::FetchCoursesCallback)>>{ - base::BindRepeating(&GlanceablesClassroomClientImpl::FetchStudentCourses, - base::Unretained(client())), - base::BindRepeating(&GlanceablesClassroomClientImpl::FetchTeacherCourses, - base::Unretained(client()))}; - - for (auto fetch_method : fetch_courses_methods) { - RepeatingTestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future; - fetch_method.Run(future.GetCallback()); - ASSERT_TRUE(future.Wait()); - - const auto* const courses = future.Take(); - - // Subsequent request doesn't trigger another network call and returns a - // pointer to the same `ui::ListModel`. - fetch_method.Run(future.GetCallback()); - ASSERT_TRUE(future.Wait()); - EXPECT_EQ(future.Take(), courses); + EXPECT_EQ(courses.at(0)->id, "course-id-1"); + EXPECT_EQ(courses.at(0)->name, "Active Course 1"); + })); + run_loop.Run(); } } @@ -243,12 +198,16 @@ base::Unretained(client()))}; for (auto fetch_method : fetch_courses_methods) { - TestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future; - fetch_method.Run(future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + fetch_method.Run(base::BindLambdaForTesting( + [&run_loop]( + const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& + courses) { + run_loop.Quit(); - const auto* const courses = future.Get(); - ASSERT_EQ(courses->item_count(), 0u); + ASSERT_TRUE(courses.empty()); + })); + run_loop.Run(); } } @@ -291,16 +250,6 @@ ] })"); })); - EXPECT_CALL(request_handler(), - HandleRequest( - Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) - .WillRepeatedly(Invoke( - []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); })); - EXPECT_CALL(request_handler(), - HandleRequest(Field(&HttpRequest::relative_url, - HasSubstr("/studentSubmissions?")))) - .WillRepeatedly(Invoke( - []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); })); auto fetch_courses_methods = std::vector<base::RepeatingCallback<void( GlanceablesClassroomClientImpl::FetchCoursesCallback)>>{ @@ -310,16 +259,20 @@ base::Unretained(client()))}; for (auto fetch_method : fetch_courses_methods) { - TestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future; - fetch_method.Run(future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + fetch_method.Run(base::BindLambdaForTesting( + [&run_loop]( + const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& + courses) { + run_loop.Quit(); - const auto* const courses = future.Get(); - ASSERT_EQ(courses->item_count(), 3u); + ASSERT_EQ(courses.size(), 3u); - EXPECT_EQ(courses->GetItemAt(0)->id, "course-id-from-page-1"); - EXPECT_EQ(courses->GetItemAt(1)->id, "course-id-from-page-2"); - EXPECT_EQ(courses->GetItemAt(2)->id, "course-id-from-page-3"); + EXPECT_EQ(courses.at(0)->id, "course-id-from-page-1"); + EXPECT_EQ(courses.at(1)->id, "course-id-from-page-2"); + EXPECT_EQ(courses.at(2)->id, "course-id-from-page-3"); + })); + run_loop.Run(); } } @@ -332,8 +285,7 @@ EXPECT_CALL(request_handler(), HandleRequest( Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "courseWork": [ { @@ -362,73 +314,52 @@ } } ] - })"); - })); + })")))); - TestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*> future; - client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + client()->FetchCourseWork( + /*course_id=*/"course-123", + base::BindLambdaForTesting( + [&run_loop](const std::vector<std::unique_ptr< + GlanceablesClassroomCourseWorkItem>>& course_work) { + run_loop.Quit(); - const auto* const course_work = future.Get(); - ASSERT_EQ(course_work->item_count(), 2u); + ASSERT_EQ(course_work.size(), 2u); - EXPECT_EQ(course_work->GetItemAt(0)->id, "course-work-item-1"); - EXPECT_EQ(course_work->GetItemAt(0)->title, "Math assignment"); - EXPECT_EQ(course_work->GetItemAt(0)->link, - "https://classroom.google.com/test-link-1"); - EXPECT_FALSE(course_work->GetItemAt(0)->due); + EXPECT_EQ(course_work.at(0)->id, "course-work-item-1"); + EXPECT_EQ(course_work.at(0)->title, "Math assignment"); + EXPECT_EQ(course_work.at(0)->link, + "https://classroom.google.com/test-link-1"); + EXPECT_FALSE(course_work.at(0)->due); - EXPECT_EQ(course_work->GetItemAt(1)->id, "course-work-item-3"); - EXPECT_EQ(course_work->GetItemAt(1)->title, "Math assignment with due date"); - EXPECT_EQ(course_work->GetItemAt(1)->link, - "https://classroom.google.com/test-link-3"); - EXPECT_EQ(FormatTimeAsString(course_work->GetItemAt(1)->due.value()), - "2023-04-25T15:09:25.250Z"); -} - -TEST_F(GlanceablesClassroomClientImplTest, FetchCourseWorkOnSubsequentCalls) { - EXPECT_CALL(request_handler(), - HandleRequest( - Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) - .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( - { - "courseWork": [ - { - "id": "course-work-item-1", - "title": "Math assignment", - "state": "PUBLISHED", - "alternateLink": "https://classroom.google.com/test-link-1" - } - ] - })")))); - - RepeatingTestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*> - future; - client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback()); - ASSERT_TRUE(future.Wait()); - - const auto* const course_work = future.Take(); - - // Subsequent request doesn't trigger another network call and returns a - // pointer to the same `ui::ListModel`. - client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback()); - ASSERT_TRUE(future.Wait()); - EXPECT_EQ(future.Take(), course_work); + EXPECT_EQ(course_work.at(1)->id, "course-work-item-3"); + EXPECT_EQ(course_work.at(1)->title, + "Math assignment with due date"); + EXPECT_EQ(course_work.at(1)->link, + "https://classroom.google.com/test-link-3"); + EXPECT_EQ(FormatTimeAsString(course_work.at(1)->due.value()), + "2023-04-25T15:09:25.250Z"); + })); + run_loop.Run(); } TEST_F(GlanceablesClassroomClientImplTest, FetchCourseWorkOnHttpError) { EXPECT_CALL(request_handler(), HandleRequest( Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) - .WillRepeatedly( - Invoke([]() { return TestRequestHandler::CreateFailedResponse(); })); + .WillOnce(Return(ByMove(TestRequestHandler::CreateFailedResponse()))); - TestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*> future; - client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + client()->FetchCourseWork( + /*course_id=*/"course-123", + base::BindLambdaForTesting( + [&run_loop](const std::vector<std::unique_ptr< + GlanceablesClassroomCourseWorkItem>>& course_work) { + run_loop.Quit(); - const auto* const course_work = future.Get(); - ASSERT_EQ(course_work->item_count(), 0u); + ASSERT_TRUE(course_work.empty()); + })); + run_loop.Run(); } TEST_F(GlanceablesClassroomClientImplTest, FetchCourseWorkMultiplePages) { @@ -436,51 +367,50 @@ HandleRequest(Field(&HttpRequest::relative_url, AllOf(HasSubstr("/courseWork?"), Not(HasSubstr("pageToken")))))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "courseWork": [ {"id": "course-work-item-from-page-1", "state": "PUBLISHED"} ], "nextPageToken": "page-2-token" - })"); - })); + })")))); EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, AllOf(HasSubstr("/courseWork?"), HasSubstr("pageToken=page-2-token"))))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "courseWork": [ {"id": "course-work-item-from-page-2", "state": "PUBLISHED"} ], "nextPageToken": "page-3-token" - })"); - })); + })")))); EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, AllOf(HasSubstr("/courseWork?"), HasSubstr("pageToken=page-3-token"))))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "courseWork": [ {"id": "course-work-item-from-page-3", "state": "PUBLISHED"} ] - })"); - })); + })")))); - TestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*> future; - client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + client()->FetchCourseWork( + /*course_id=*/"course-123", + base::BindLambdaForTesting( + [&run_loop](const std::vector<std::unique_ptr< + GlanceablesClassroomCourseWorkItem>>& course_work) { + run_loop.Quit(); - const auto* const courses = future.Get(); - ASSERT_EQ(courses->item_count(), 3u); + ASSERT_EQ(course_work.size(), 3u); - EXPECT_EQ(courses->GetItemAt(0)->id, "course-work-item-from-page-1"); - EXPECT_EQ(courses->GetItemAt(1)->id, "course-work-item-from-page-2"); - EXPECT_EQ(courses->GetItemAt(2)->id, "course-work-item-from-page-3"); + EXPECT_EQ(course_work.at(0)->id, "course-work-item-from-page-1"); + EXPECT_EQ(course_work.at(1)->id, "course-work-item-from-page-2"); + EXPECT_EQ(course_work.at(2)->id, "course-work-item-from-page-3"); + })); + run_loop.Run(); } // ---------------------------------------------------------------------------- @@ -490,8 +420,7 @@ EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, HasSubstr("/studentSubmissions?")))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "studentSubmissions": [ { @@ -531,95 +460,82 @@ "state": "???" } ] - })"); - })); + })")))); - TestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*> future; - client()->FetchStudentSubmissions(/*course_id=*/"course-123", - future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + client()->FetchStudentSubmissions( + /*course_id=*/"course-123", + base::BindLambdaForTesting( + [&run_loop](const std::vector< + std::unique_ptr<GlanceablesClassroomStudentSubmission>>& + student_submissions) { + run_loop.Quit(); - const auto* const student_submissions = future.Get(); - ASSERT_EQ(student_submissions->item_count(), 7u); + ASSERT_EQ(student_submissions.size(), 7u); - EXPECT_EQ(student_submissions->GetItemAt(0)->id, "student-submission-1"); - EXPECT_EQ(student_submissions->GetItemAt(0)->course_work_id, "course-work-1"); - EXPECT_EQ(student_submissions->GetItemAt(0)->state, - GlanceablesClassroomStudentSubmission::State::kAssigned); + EXPECT_EQ(student_submissions.at(0)->id, "student-submission-1"); + EXPECT_EQ(student_submissions.at(0)->course_work_id, + "course-work-1"); + EXPECT_EQ(student_submissions.at(0)->state, + GlanceablesClassroomStudentSubmission::State::kAssigned); - EXPECT_EQ(student_submissions->GetItemAt(1)->id, "student-submission-2"); - EXPECT_EQ(student_submissions->GetItemAt(1)->course_work_id, "course-work-1"); - EXPECT_EQ(student_submissions->GetItemAt(1)->state, - GlanceablesClassroomStudentSubmission::State::kAssigned); + EXPECT_EQ(student_submissions.at(1)->id, "student-submission-2"); + EXPECT_EQ(student_submissions.at(1)->course_work_id, + "course-work-1"); + EXPECT_EQ(student_submissions.at(1)->state, + GlanceablesClassroomStudentSubmission::State::kAssigned); - EXPECT_EQ(student_submissions->GetItemAt(2)->id, "student-submission-3"); - EXPECT_EQ(student_submissions->GetItemAt(2)->course_work_id, "course-work-1"); - EXPECT_EQ(student_submissions->GetItemAt(2)->state, - GlanceablesClassroomStudentSubmission::State::kAssigned); + EXPECT_EQ(student_submissions.at(2)->id, "student-submission-3"); + EXPECT_EQ(student_submissions.at(2)->course_work_id, + "course-work-1"); + EXPECT_EQ(student_submissions.at(2)->state, + GlanceablesClassroomStudentSubmission::State::kAssigned); - EXPECT_EQ(student_submissions->GetItemAt(3)->id, "student-submission-4"); - EXPECT_EQ(student_submissions->GetItemAt(3)->course_work_id, "course-work-1"); - EXPECT_EQ(student_submissions->GetItemAt(3)->state, - GlanceablesClassroomStudentSubmission::State::kTurnedIn); + EXPECT_EQ(student_submissions.at(3)->id, "student-submission-4"); + EXPECT_EQ(student_submissions.at(3)->course_work_id, + "course-work-1"); + EXPECT_EQ(student_submissions.at(3)->state, + GlanceablesClassroomStudentSubmission::State::kTurnedIn); - EXPECT_EQ(student_submissions->GetItemAt(4)->id, "student-submission-5"); - EXPECT_EQ(student_submissions->GetItemAt(4)->course_work_id, "course-work-1"); - EXPECT_EQ(student_submissions->GetItemAt(4)->state, - GlanceablesClassroomStudentSubmission::State::kAssigned); + EXPECT_EQ(student_submissions.at(4)->id, "student-submission-5"); + EXPECT_EQ(student_submissions.at(4)->course_work_id, + "course-work-1"); + EXPECT_EQ(student_submissions.at(4)->state, + GlanceablesClassroomStudentSubmission::State::kAssigned); - EXPECT_EQ(student_submissions->GetItemAt(5)->id, "student-submission-6"); - EXPECT_EQ(student_submissions->GetItemAt(5)->course_work_id, "course-work-1"); - EXPECT_EQ(student_submissions->GetItemAt(5)->state, - GlanceablesClassroomStudentSubmission::State::kGraded); + EXPECT_EQ(student_submissions.at(5)->id, "student-submission-6"); + EXPECT_EQ(student_submissions.at(5)->course_work_id, + "course-work-1"); + EXPECT_EQ(student_submissions.at(5)->state, + GlanceablesClassroomStudentSubmission::State::kGraded); - EXPECT_EQ(student_submissions->GetItemAt(6)->id, "student-submission-7"); - EXPECT_EQ(student_submissions->GetItemAt(6)->course_work_id, "course-work-1"); - EXPECT_EQ(student_submissions->GetItemAt(6)->state, - GlanceablesClassroomStudentSubmission::State::kOther); -} - -TEST_F(GlanceablesClassroomClientImplTest, - FetchStudentSubmissionsOnSubsequentCalls) { - EXPECT_CALL(request_handler(), - HandleRequest(Field(&HttpRequest::relative_url, - HasSubstr("/studentSubmissions?")))) - .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( - { - "studentSubmissions": [ - {"id": "student-submission-1", "courseWorkId": "course-work-1"} - ] - })")))); - - RepeatingTestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*> - future; - client()->FetchStudentSubmissions(/*course_id=*/"course-123", - future.GetCallback()); - ASSERT_TRUE(future.Wait()); - - const auto* const student_submissions = future.Take(); - - // Subsequent request doesn't trigger another network call and returns a - // pointer to the same `ui::ListModel`. - client()->FetchStudentSubmissions(/*course_id=*/"course-123", - future.GetCallback()); - ASSERT_TRUE(future.Wait()); - EXPECT_EQ(future.Take(), student_submissions); + EXPECT_EQ(student_submissions.at(6)->id, "student-submission-7"); + EXPECT_EQ(student_submissions.at(6)->course_work_id, + "course-work-1"); + EXPECT_EQ(student_submissions.at(6)->state, + GlanceablesClassroomStudentSubmission::State::kOther); + })); + run_loop.Run(); } TEST_F(GlanceablesClassroomClientImplTest, FetchStudentSubmissionsOnHttpError) { EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, HasSubstr("/studentSubmissions?")))) - .WillRepeatedly( - Invoke([]() { return TestRequestHandler::CreateFailedResponse(); })); + .WillOnce(Return(ByMove(TestRequestHandler::CreateFailedResponse()))); - TestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*> future; - client()->FetchStudentSubmissions(/*course_id=*/"course-123", - future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + client()->FetchStudentSubmissions( + /*course_id=*/"course-123", + base::BindLambdaForTesting( + [&run_loop](const std::vector< + std::unique_ptr<GlanceablesClassroomStudentSubmission>>& + student_submissions) { + run_loop.Quit(); - const auto* const student_submissions = future.Get(); - ASSERT_EQ(student_submissions->item_count(), 0u); + ASSERT_TRUE(student_submissions.empty()); + })); + run_loop.Run(); } TEST_F(GlanceablesClassroomClientImplTest, @@ -628,55 +544,462 @@ HandleRequest(Field(&HttpRequest::relative_url, AllOf(HasSubstr("/studentSubmissions?"), Not(HasSubstr("pageToken")))))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "studentSubmissions": [ {"id": "student-submission-from-page-1"} ], "nextPageToken": "page-2-token" - })"); - })); + })")))); EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, AllOf(HasSubstr("/studentSubmissions?"), HasSubstr("pageToken=page-2-token"))))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "studentSubmissions": [ {"id": "student-submission-from-page-2"} ], "nextPageToken": "page-3-token" - })"); - })); + })")))); EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, AllOf(HasSubstr("/studentSubmissions?"), HasSubstr("pageToken=page-3-token"))))) - .WillRepeatedly(Invoke([]() { - return TestRequestHandler::CreateSuccessfulResponse(R"( + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( { "studentSubmissions": [ {"id": "student-submission-from-page-3"} ] - })"); - })); + })")))); - TestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*> future; - client()->FetchStudentSubmissions(/*course_id=*/"course-123", - future.GetCallback()); - ASSERT_TRUE(future.Wait()); + base::RunLoop run_loop; + client()->FetchStudentSubmissions( + /*course_id=*/"course-123", + base::BindLambdaForTesting( + [&run_loop](const std::vector< + std::unique_ptr<GlanceablesClassroomStudentSubmission>>& + student_submissions) { + run_loop.Quit(); - const auto* const student_submissions = future.Get(); - ASSERT_EQ(student_submissions->item_count(), 3u); + ASSERT_EQ(student_submissions.size(), 3u); - EXPECT_EQ(student_submissions->GetItemAt(0)->id, - "student-submission-from-page-1"); - EXPECT_EQ(student_submissions->GetItemAt(1)->id, - "student-submission-from-page-2"); - EXPECT_EQ(student_submissions->GetItemAt(2)->id, - "student-submission-from-page-3"); + EXPECT_EQ(student_submissions.at(0)->id, + "student-submission-from-page-1"); + EXPECT_EQ(student_submissions.at(1)->id, + "student-submission-from-page-2"); + EXPECT_EQ(student_submissions.at(2)->id, + "student-submission-from-page-3"); + })); + run_loop.Run(); +} + +// ---------------------------------------------------------------------------- +// Public interface, student assignments: + +TEST_F(GlanceablesClassroomClientImplTest, + StudentRoleIsActiveWithEnrolledCourses) { + ExpectActiveCourse(); + EXPECT_CALL(request_handler(), + HandleRequest( + Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) + .WillOnce( + Return(ByMove(TestRequestHandler::CreateSuccessfulResponse("{}")))); + EXPECT_CALL(request_handler(), + HandleRequest(Field(&HttpRequest::relative_url, + HasSubstr("/studentSubmissions?")))) + .WillOnce( + Return(ByMove(TestRequestHandler::CreateSuccessfulResponse("{}")))); + + TestFuture<bool> future; + client()->IsStudentRoleActive(future.GetCallback()); + + const bool active = future.Get(); + ASSERT_TRUE(active); +} + +TEST_F(GlanceablesClassroomClientImplTest, + StudentRoleIsInactiveWithoutEnrolledCourses) { + EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url, + HasSubstr("/courses?")))) + .WillOnce(Return(ByMove( + TestRequestHandler::CreateSuccessfulResponse(R"({"courses": []})")))); + + TestFuture<bool> future; + client()->IsStudentRoleActive(future.GetCallback()); + + const bool active = future.Get(); + ASSERT_FALSE(active); +} + +TEST_F(GlanceablesClassroomClientImplTest, ReturnsCompletedStudentAssignments) { + ExpectActiveCourse(); + EXPECT_CALL(request_handler(), + HandleRequest( + Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "courseWork": [ + { + "id": "course-work-item-1", + "title": "Math assignment", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-1" + }, + { + "id": "course-work-item-2", + "title": "Math assignment - submission graded", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-2" + }, + { + "id": "course-work-item-3", + "title": "Math assignment - submission turned in", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-3" + } + ] + })")))); + EXPECT_CALL(request_handler(), + HandleRequest(Field(&HttpRequest::relative_url, + HasSubstr("/studentSubmissions?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "studentSubmissions": [ + { + "id": "student-submission-1", + "courseWorkId": "course-work-item-1", + "state": "NEW" + }, + { + "id": "student-submission-2", + "courseWorkId": "course-work-item-2", + "state": "RETURNED", + "assignedGrade": 50.0 + }, + { + "id": "student-submission-3", + "courseWorkId": "course-work-item-3", + "state": "TURNED_IN" + } + ] + })")))); + + TestFuture< + std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>> + future; + client()->GetCompletedStudentAssignments(future.GetCallback()); + + const auto assignments = future.Take(); + ASSERT_EQ(assignments.size(), 2u); + + EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1"); + EXPECT_EQ(assignments.at(0)->course_work_title, + "Math assignment - submission graded"); + EXPECT_EQ(assignments.at(0)->link, + "https://classroom.google.com/test-link-2"); + EXPECT_FALSE(assignments.at(0)->due); + + EXPECT_EQ(assignments.at(1)->course_title, "Active Course 1"); + EXPECT_EQ(assignments.at(1)->course_work_title, + "Math assignment - submission turned in"); + EXPECT_EQ(assignments.at(1)->link, + "https://classroom.google.com/test-link-3"); + EXPECT_FALSE(assignments.at(1)->due); +} + +TEST_F(GlanceablesClassroomClientImplTest, + ReturnsStudentAssignmentsWithApproachingDueDate) { + base::subtle::ScopedTimeClockOverrides time_override( + []() { + base::Time now; + EXPECT_TRUE(base::Time::FromString("10 Apr 2023 00:00 GMT", &now)); + return now; + }, + nullptr, nullptr); + + ExpectActiveCourse(); + EXPECT_CALL(request_handler(), + HandleRequest( + Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "courseWork": [ + { + "id": "course-work-item-1", + "title": "Math assignment - missed due date", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-1", + "dueDate": {"year": 2023, "month": 4, "day": 5}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + }, + { + "id": "course-work-item-2", + "title": "Math assignment - approaching due date", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-2", + "dueDate": {"year": 2023, "month": 4, "day": 25}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + }, + { + "id": "course-work-item-3", + "title": "Math assignment - approaching due date, completed", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-3", + "dueDate": {"year": 2023, "month": 4, "day": 25}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + } + ] + })")))); + EXPECT_CALL(request_handler(), + HandleRequest(Field(&HttpRequest::relative_url, + HasSubstr("/studentSubmissions?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "studentSubmissions": [ + { + "id": "student-submission-1", + "courseWorkId": "course-work-item-1", + "state": "NEW" + }, + { + "id": "student-submission-2", + "courseWorkId": "course-work-item-2", + "state": "NEW" + }, + { + "id": "student-submission-3", + "courseWorkId": "course-work-item-3", + "state": "RETURNED", + "assignedGrade": 50.0 + } + ] + })")))); + + TestFuture< + std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>> + future; + client()->GetStudentAssignmentsWithApproachingDueDate(future.GetCallback()); + + const auto assignments = future.Take(); + ASSERT_EQ(assignments.size(), 1u); + + EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1"); + EXPECT_EQ(assignments.at(0)->course_work_title, + "Math assignment - approaching due date"); + EXPECT_EQ(assignments.at(0)->link, + "https://classroom.google.com/test-link-2"); + EXPECT_EQ(FormatTimeAsString(assignments.at(0)->due.value()), + "2023-04-25T15:09:25.250Z"); +} + +TEST_F(GlanceablesClassroomClientImplTest, + ReturnsStudentAssignmentsWithMissedDueDate) { + base::subtle::ScopedTimeClockOverrides time_override( + []() { + base::Time now; + EXPECT_TRUE(base::Time::FromString("10 Apr 2023 00:00 GMT", &now)); + return now; + }, + nullptr, nullptr); + + ExpectActiveCourse(); + EXPECT_CALL(request_handler(), + HandleRequest( + Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "courseWork": [ + { + "id": "course-work-item-1", + "title": "Math assignment - missed due date", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-1", + "dueDate": {"year": 2023, "month": 4, "day": 5}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + }, + { + "id": "course-work-item-2", + "title": "Math assignment - approaching due date", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-2", + "dueDate": {"year": 2023, "month": 4, "day": 25}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + }, + { + "id": "course-work-item-3", + "title": "Math assignment - missed due date, completed", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-3", + "dueDate": {"year": 2023, "month": 4, "day": 5}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + }, + { + "id": "course-work-item-4", + "title": "Math assignment - missed due date, turned in", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-4", + "dueDate": {"year": 2023, "month": 4, "day": 5}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + } + ] + })")))); + EXPECT_CALL(request_handler(), + HandleRequest(Field(&HttpRequest::relative_url, + HasSubstr("/studentSubmissions?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "studentSubmissions": [ + { + "id": "student-submission-1", + "courseWorkId": "course-work-item-1", + "state": "NEW" + }, + { + "id": "student-submission-2", + "courseWorkId": "course-work-item-2", + "state": "NEW" + }, + { + "id": "student-submission-3", + "courseWorkId": "course-work-item-3", + "state": "RETURNED", + "assignedGrade": 50.0 + }, + { + "id": "student-submission-4", + "courseWorkId": "course-work-item-4", + "state": "TURNED_IN" + } + ] + })")))); + + TestFuture< + std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>> + future; + client()->GetStudentAssignmentsWithMissedDueDate(future.GetCallback()); + + const auto assignments = future.Take(); + ASSERT_EQ(assignments.size(), 1u); + + EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1"); + EXPECT_EQ(assignments.at(0)->course_work_title, + "Math assignment - missed due date"); + EXPECT_EQ(assignments.at(0)->link, + "https://classroom.google.com/test-link-1"); + EXPECT_EQ(FormatTimeAsString(assignments.at(0)->due.value()), + "2023-04-05T15:09:25.250Z"); +} + +TEST_F(GlanceablesClassroomClientImplTest, + ReturnsStudentAssignmentsWithoutDueDate) { + ExpectActiveCourse(); + EXPECT_CALL(request_handler(), + HandleRequest( + Field(&HttpRequest::relative_url, HasSubstr("/courseWork?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "courseWork": [ + { + "id": "course-work-item-1", + "title": "Math assignment", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-1" + }, + { + "id": "course-work-item-2", + "title": "Math assignment - with due date", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-2", + "dueDate": {"year": 2023, "month": 4, "day": 25}, + "dueTime": { + "hours": 15, + "minutes": 9, + "seconds": 25, + "nanos": 250000000 + } + }, + { + "id": "course-work-item-3", + "title": "Math assignment - submission graded", + "state": "PUBLISHED", + "alternateLink": "https://classroom.google.com/test-link-3" + } + ] + })")))); + EXPECT_CALL(request_handler(), + HandleRequest(Field(&HttpRequest::relative_url, + HasSubstr("/studentSubmissions?")))) + .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"( + { + "studentSubmissions": [ + { + "id": "student-submission-1", + "courseWorkId": "course-work-item-1", + "state": "NEW" + }, + { + "id": "student-submission-2", + "courseWorkId": "course-work-item-2", + "state": "NEW" + }, + { + "id": "student-submission-3", + "courseWorkId": "course-work-item-3", + "state": "RETURNED", + "assignedGrade": 50.0 + } + ] + })")))); + + TestFuture< + std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>> + future; + client()->GetStudentAssignmentsWithoutDueDate(future.GetCallback()); + + const auto assignments = future.Take(); + ASSERT_EQ(assignments.size(), 1u); + + EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1"); + EXPECT_EQ(assignments.at(0)->course_work_title, "Math assignment"); + EXPECT_EQ(assignments.at(0)->link, + "https://classroom.google.com/test-link-1"); + EXPECT_FALSE(assignments.at(0)->due); } } // namespace ash
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc index f7e88ad..3b3bd1b 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
@@ -99,7 +99,7 @@ app_service_instance_helper_( std::make_unique<AppServiceInstanceRegistryHelper>(this)) { aura::Env::GetInstance()->AddObserver(this); - Observe(&proxy_->InstanceRegistry()); + instance_registry_observation_.Observe(&proxy_->InstanceRegistry()); if (arc::IsArcAllowedForProfile(owner->profile())) arc_tracker_ = std::make_unique<AppServiceAppWindowArcTracker>(this); @@ -457,7 +457,7 @@ void AppServiceAppWindowShelfController::OnInstanceRegistryWillBeDestroyed( apps::InstanceRegistry* instance_registry) { - Observe(nullptr); + instance_registry_observation_.Reset(); } int AppServiceAppWindowShelfController::GetActiveTaskId() const {
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h index beff921..899b6b65 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h
@@ -12,6 +12,7 @@ #include "ash/public/cpp/shelf_types.h" #include "base/memory/raw_ptr.h" #include "base/scoped_multi_source_observation.h" +#include "base/scoped_observation.h" #include "chrome/browser/apps/app_service/app_service_proxy_forward.h" #include "chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.h" #include "chrome/browser/ui/ash/shelf/app_window_shelf_controller.h" @@ -151,6 +152,9 @@ AuraWindowToAppWindow aura_window_to_app_window_; base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver> observed_windows_{this}; + base::ScopedObservation<apps::InstanceRegistry, + apps::InstanceRegistry::Observer> + instance_registry_observation_{this}; raw_ptr<apps::AppServiceProxy, ExperimentalAsh> proxy_ = nullptr; std::unique_ptr<AppServiceInstanceRegistryHelper>
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.cc b/chrome/browser/ui/content_settings/content_setting_image_model.cc index d3ed45e2..2bdd660 100644 --- a/chrome/browser/ui/content_settings/content_setting_image_model.cc +++ b/chrome/browser/ui/content_settings/content_setting_image_model.cc
@@ -50,6 +50,7 @@ #include "services/device/public/cpp/geolocation/location_system_permission_status.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/pointer/touch_ui_controller.h" +#include "ui/base/ui_base_features.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/color_utils.h" #include "ui/gfx/favicon_size.h" @@ -292,6 +293,80 @@ return nullptr; } +void GetIconChromeRefresh(ContentSettingsType type, + bool blocked, + raw_ptr<const gfx::VectorIcon>* icon) { + switch (type) { + case ContentSettingsType::COOKIES: + *icon = blocked ? &vector_icons::kCookieOffChromeRefreshIcon + : &vector_icons::kCookieChromeRefreshIcon; + return; + case ContentSettingsType::IMAGES: + *icon = blocked ? &vector_icons::kPhotoOffChromeRefreshIcon + : &vector_icons::kPhotoChromeRefreshIcon; + return; + case ContentSettingsType::JAVASCRIPT: + *icon = blocked ? &vector_icons::kCodeOffChromeRefreshIcon + : &vector_icons::kCodeChromeRefreshIcon; + return; + case ContentSettingsType::MIXEDSCRIPT: + *icon = blocked ? &vector_icons::kNotSecureWarningOffChromeRefreshIcon + : &vector_icons::kNotSecureWarningChromeRefreshIcon; + return; + case ContentSettingsType::SOUND: + *icon = blocked ? &vector_icons::kVolumeOffChromeRefreshIcon + : &vector_icons::kVolumeUpChromeRefreshIcon; + return; + case ContentSettingsType::ADS: + *icon = blocked ? &vector_icons::kAdsOffChromeRefreshIcon + : &vector_icons::kAdsChromeRefreshIcon; + return; + case ContentSettingsType::GEOLOCATION: + *icon = blocked ? &vector_icons::kLocationOffChromeRefreshIcon + : &vector_icons::kLocationOnChromeRefreshIcon; + return; + case ContentSettingsType::PROTOCOL_HANDLERS: + *icon = blocked ? &vector_icons::kProtocolHandlerOffChromeRefreshIcon + : &vector_icons::kProtocolHandlerChromeRefreshIcon; + return; + case ContentSettingsType::MIDI_SYSEX: + *icon = blocked ? &vector_icons::kMidiOffChromeRefreshIcon + : &vector_icons::kMidiChromeRefreshIcon; + return; + case ContentSettingsType::AUTOMATIC_DOWNLOADS: + *icon = blocked ? &vector_icons::kFileDownloadOffChromeRefreshIcon + : &vector_icons::kFileDownloadChromeRefreshIcon; + return; + case ContentSettingsType::CLIPBOARD_READ_WRITE: + *icon = blocked ? &vector_icons::kContentPasteOffChromeRefreshIcon + : &vector_icons::kContentPasteChromeRefreshIcon; + return; + case ContentSettingsType::MEDIASTREAM_MIC: + *icon = blocked ? &vector_icons::kMicOffChromeRefreshIcon + : &vector_icons::kMicChromeRefreshIcon; + return; + case ContentSettingsType::MEDIASTREAM_CAMERA: + *icon = blocked ? &vector_icons::kVideocamOffChromeRefreshIcon + : &vector_icons::kVideocamChromeRefreshIcon; + return; + case ContentSettingsType::NOTIFICATIONS: + *icon = blocked ? &vector_icons::kNotificationsOffChromeRefreshIcon + : &vector_icons::kNotificationsChromeRefreshIcon; + return; + case ContentSettingsType::SENSORS: + *icon = blocked ? &vector_icons::kSensorsOffChromeRefreshIcon + : &vector_icons::kSensorsChromeRefreshIcon; + return; + case ContentSettingsType::POPUPS: + *icon = blocked ? &kOpenInNewOffChromeRefreshIcon + : &kOpenInNewChromeRefreshIcon; + return; + default: + NOTREACHED(); + return; + } +} + // A wrapper function that allows returning both post-chrome-refresh and // pre-chrome-refresh icons. To minimize code churn, this method returns two // icons: a base icon and a badge. The badge is painted on top of the base icon, @@ -301,6 +376,12 @@ bool blocked, raw_ptr<const gfx::VectorIcon>* icon, raw_ptr<const gfx::VectorIcon>* badge) { + if (features::IsChromeRefresh2023()) { + *badge = &gfx::kNoneIcon; + GetIconChromeRefresh(type, blocked, icon); + return; + } + *badge = (blocked ? &vector_icons::kBlockedBadgeIcon : &gfx::kNoneIcon); switch (type) { case ContentSettingsType::COOKIES: @@ -534,6 +615,7 @@ } void ContentSettingImageModel::SetFramebustBlockedIcon() { + // TODO(https://crbug.com/1447073): Set a cr23 icon for blocked redirect. icon_ = &kBlockedRedirectIcon; icon_badge_ = &vector_icons::kBlockedBadgeIcon; }
diff --git a/chrome/browser/ui/extensions/extensions_container.h b/chrome/browser/ui/extensions/extensions_container.h index 431903d..992c8be0 100644 --- a/chrome/browser/ui/extensions/extensions_container.h +++ b/chrome/browser/ui/extensions/extensions_container.h
@@ -81,11 +81,6 @@ virtual void UpdateToolbarActionHoverCard( ToolbarActionView* action_view, ToolbarActionHoverCardUpdateType update_type) = 0; - - // Collapses the confirmation on the request access button, effectively - // hiding the button. Does nothing if the confirmation is not showing - // anymore. - virtual void CollapseConfirmation() = 0; }; #endif // CHROME_BROWSER_UI_EXTENSIONS_EXTENSIONS_CONTAINER_H_
diff --git a/chrome/browser/ui/views/extensions/extensions_request_access_button.cc b/chrome/browser/ui/views/extensions/extensions_request_access_button.cc index abc4fc49..b1f37cae 100644 --- a/chrome/browser/ui/views/extensions/extensions_request_access_button.cc +++ b/chrome/browser/ui/views/extensions/extensions_request_access_button.cc
@@ -27,10 +27,6 @@ namespace { -// TODO(crbug.com/1452171): Same as permission's ChipController. Pull out to a -// shared location. -constexpr auto kConfirmationDisplayDuration = base::Seconds(4); - std::vector<const extensions::Extension*> GetExtensions( Profile* profile, std::vector<extensions::ExtensionId>& extension_ids) { @@ -60,8 +56,6 @@ void ExtensionsRequestAccessButton::Update( std::vector<extensions::ExtensionId>& extension_ids) { - CHECK(!IsShowingConfirmation()); - extension_ids_ = extension_ids; SetVisible(!extension_ids_.empty()); @@ -77,7 +71,6 @@ l10n_util::GetStringFUTF16Int(IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON, static_cast<int>(extension_ids_.size())), color); - SetEnabled(true); } // TODO(crbug.com/1390952): Remove hover card once @@ -93,31 +86,6 @@ extensions_container_, extension_ids_); } -void ExtensionsRequestAccessButton::ResetConfirmation() { - SetVisible(false); - confirmation_origin_ = absl::nullopt; - collapse_timer_.AbandonAndStop(); -} - -bool ExtensionsRequestAccessButton::IsShowingConfirmation() const { - if (!confirmation_origin_.has_value()) { - return false; - } - - CHECK(GetVisible()); - return confirmation_origin_.has_value(); -} - -bool ExtensionsRequestAccessButton::IsShowingConfirmationFor( - const url::Origin& origin) const { - if (!confirmation_origin_.has_value()) { - return false; - } - - CHECK(GetVisible()); - return confirmation_origin_ == origin; -} - std::u16string ExtensionsRequestAccessButton::GetTooltipText( const gfx::Point& p) const { std::vector<std::u16string> tooltip_parts; @@ -140,13 +108,6 @@ return; } - // Make sure we set this before granting tab permissions, since that will - // trigger an update to the request access button for each extension that is - // granted access. - confirmation_origin_ = - web_contents->GetPrimaryMainFrame()->GetLastCommittedOrigin(); - - // Grant tab permission to all extensions. DCHECK_GT(extension_ids_.size(), 0u); std::vector<const extensions::Extension*> extensions_to_run = GetExtensions(browser_->profile(), extension_ids_); @@ -154,23 +115,6 @@ base::RecordAction(base::UserMetricsAction( "Extensions.Toolbar.ExtensionsActivatedFromRequestAccessButton")); action_runner->GrantTabPermissions(extensions_to_run); - - // Show confirmation message, and disable the button, for a specific duration. - absl::optional<SkColor> color; - SetHighlight(l10n_util::GetStringUTF16( - IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT), - color); - SetEnabled(false); - - base::TimeDelta collapse_duration = remove_confirmation_for_testing_ - ? base::Seconds(0) - : kConfirmationDisplayDuration; - // base::Unretained() below is safe because this view is tied to the lifetime - // of `extensions_container_`. - collapse_timer_.Start( - FROM_HERE, collapse_duration, - base::BindOnce(&ExtensionsContainer::CollapseConfirmation, - base::Unretained(extensions_container_))); } content::WebContents* ExtensionsRequestAccessButton::GetActiveWebContents()
diff --git a/chrome/browser/ui/views/extensions/extensions_request_access_button.h b/chrome/browser/ui/views/extensions/extensions_request_access_button.h index 3c13a23..ddf05b4 100644 --- a/chrome/browser/ui/views/extensions/extensions_request_access_button.h +++ b/chrome/browser/ui/views/extensions/extensions_request_access_button.h
@@ -5,11 +5,8 @@ #ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_ #define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_ -#include "base/timer/timer.h" #include "chrome/browser/ui/views/toolbar/toolbar_button.h" #include "extensions/common/extension_id.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "url/origin.h" namespace content { class WebContents; @@ -37,15 +34,6 @@ // Displays the button's hover card, if possible. void MaybeShowHoverCard(); - // Hides the button and resets the `confirmation_origin_` variable. - void ResetConfirmation(); - - // Returns whether the button is showing a confirmation message. - bool IsShowingConfirmation() const; - - // Returns whether the button is showing a confirmation message for `origin`. - bool IsShowingConfirmationFor(const url::Origin& origin) const; - // ToolbarButton: std::u16string GetTooltipText(const gfx::Point& p) const override; @@ -57,13 +45,9 @@ GetHoverCardCoordinatorForTesting() { return hover_card_coordinator_.get(); } - void remove_confirmation_for_testing(bool remove_confirmation) { - remove_confirmation_for_testing_ = remove_confirmation; - } private: - // Grants one-time site access to `extension_ids` and shows a confirmation - // message on the button. + // Runs `extension_ids_` actions in the current site. void OnButtonPressed(); content::WebContents* GetActiveWebContents() const; @@ -76,16 +60,6 @@ // Extensions included in the request access button. std::vector<extensions::ExtensionId> extension_ids_; - - // The origin for which the button is displaying a confirmation message, if - // any. - absl::optional<url::Origin> confirmation_origin_; - - // A timer used to collapse the button after showing a confirmation message. - base::OneShotTimer collapse_timer_; - - // Flag to not show confirmation message in tests. - bool remove_confirmation_for_testing_{false}; }; #endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc index 3855d0d..22b0904 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
@@ -512,35 +512,6 @@ extensions::MaybeShowExtensionControlledNewTabPage(browser_, selection.new_contents); - - // Request access button confirmation is tab-specific. Therefore, we need to - // reset if the active tab changes. - if (extensions_controls_ && extensions_controls_->IsShowingConfirmation()) { - extensions_controls_->ResetConfirmation(); - UpdateControlsVisibility(); - } -} - -void ExtensionsToolbarContainer::TabChangedAt(content::WebContents* contents, - int index, - TabChangeType change_type) { - // Ignore changes that don't affect all the tab contents (e.g loading - // changes). - if (change_type != TabChangeType::kAll) { - return; - } - - // Request access button confirmation is tab-specific for a specific origin. - // Therefore, we need to reset it if it's currently showing, we are on the - // same tab and we have navigated to another origin. - // Note: When we switch tabs, `OnTabStripModelChanged` is called before - // `TabChangedAt` and takes care of resetting the confirmation if shown. - if (extensions_controls_ && extensions_controls_->IsShowingConfirmation() && - !extensions_controls_->IsShowingConfirmationFor( - contents->GetPrimaryMainFrame()->GetLastCommittedOrigin())) { - extensions_controls_->ResetConfirmation(); - UpdateControlsVisibility(); - } } void ExtensionsToolbarContainer::OnToolbarActionAdded( @@ -1005,15 +976,6 @@ action_hover_card_controller_->UpdateHoverCard(action_view, update_type); } -void ExtensionsToolbarContainer::CollapseConfirmation() { - if (!extensions_controls_->IsShowingConfirmation()) { - return; - } - - extensions_controls_->ResetConfirmation(); - UpdateControlsVisibility(); -} - void ExtensionsToolbarContainer::OnMouseExited(const ui::MouseEvent& event) { UpdateToolbarActionHoverCard(nullptr, ToolbarActionHoverCardUpdateType::kHover);
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h index 0f45497..65e2e62 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
@@ -167,7 +167,6 @@ void UpdateToolbarActionHoverCard( ToolbarActionView* action_view, ToolbarActionHoverCardUpdateType update_type) override; - void CollapseConfirmation() override; // ToolbarActionView::Delegate: content::WebContents* GetCurrentWebContents() override; @@ -262,9 +261,6 @@ TabStripModel* tab_strip_model, const TabStripModelChange& change, const TabStripSelectionChange& selection) override; - void TabChangedAt(content::WebContents* contents, - int index, - TabChangeType change_type) override; // ToolbarActionsModel::Observer: void OnToolbarActionAdded(
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc index 7aac0728..6a3b7451 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc
@@ -976,10 +976,6 @@ EXPECT_EQ(permissions_manager->GetUserSiteAccess(*extensionC, url), UserSiteAccess::kOnAllSites); - // Don't show the confirmation since it's dependent on time, and we have other - // tests for it. - request_access_button()->remove_confirmation_for_testing(true); - // Click the request access button to grant one-time access. A reload page // dialog will appear since extension A needs a page reload to run its action. auto* action_runner = @@ -997,11 +993,10 @@ EXPECT_TRUE(script_injection_listener.WaitUntilSatisfied()); EXPECT_FALSE(request_access_button()->GetVisible()); } else { - // Site interaction should change but script should not be injected since - // permission was granted but page was not reloaded. The request access - // button should be hidden, even without a reload, because the user granted - // access to the extensions. - EXPECT_FALSE(request_access_button()->GetVisible()); + // Site interaction should change but script should not be injected + // since permission was granted but page was reloaded. The request access + // button should remain visible since we didn't reload. + EXPECT_TRUE(request_access_button()->GetVisible()); // TODO(crbug.com/1400812): Is there a way to confirm we didn't inject the // script besides reusing the // chrome/test/data/extensions/blocked_actions/content_scripts/ test @@ -1095,10 +1090,6 @@ EXPECT_EQ(permissions_manager->GetUserSiteAccess(*extensionC, url), UserSiteAccess::kOnAllSites); - // Don't show the confirmation since it's dependent on time, and we have other - // tests for it. - request_access_button()->remove_confirmation_for_testing(true); - // Click the request access button to grant one-time access. Since no // extensions need page refresh to run their actions, it immediately grants // access and the script is injected. @@ -1142,55 +1133,3 @@ EXPECT_EQ(permissions_helper.GetSiteInteraction(*extensionC, web_contents()), SiteInteraction::kGranted); } - -// Tests that when the user clicks on the request access button and immediately -// navigates to a different site, the confirmation text is collapsed and the -// button displays the extensions requesting access to the new site (if any). -IN_PROC_BROWSER_TEST_F( - ExtensionsToolbarContainerFeatureUITest, - ClickingRequestAccessButton_ConfirmationCollapsedOnNavigation) { - auto extension = InstallExtensionWithHostPermissions( - "Extension", "<all_urls>", "document_idle"); - extensions::ScriptingPermissionsModifier(profile(), extension) - .SetWithholdHostPermissions(true); - - // Navigate to a site where the extension has withheld access. - GURL url = embedded_test_server()->GetURL("example.com", "/title1.html"); - NavigateToUrl(url); - - // Verify request access button is visible because extension is requesting - // site access. - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(), - testing::ElementsAre(extension->id())); - - // Click the button to grant one-time access on example.com. Verify - // confirmation message appears on the request access button. - ClickButton(request_access_button()); - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_EQ(request_access_button()->GetText(), - l10n_util::GetStringUTF16( - IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT)); - - // While the confirmation message is still visible, navigate to a site where - // the extension has withheld access. Verify the confirmation is not longer - // shown, and the button shows the extension requesting access. - NavigateToUrl(embedded_test_server()->GetURL("other.com", "/title1.html")); - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(), - testing::ElementsAre(extension->id())); - - // Click the button to grant one-time access on example.com. Verify - // confirmation message appears on the request access button. - ClickButton(request_access_button()); - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_EQ(request_access_button()->GetText(), - l10n_util::GetStringUTF16( - IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT)); - - // While the confirmation message is still visible, navigate to a site where - // no extensions are allowed while the confirmation message is still visible. - // Verify the confirmation is not longer shown and the button is hidden. - NavigateToUrl(GURL("chrome://extensions")); - EXPECT_FALSE(request_access_button()->GetVisible()); -}
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc index 4c3766ed..4c451c7 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc
@@ -81,13 +81,6 @@ const std::vector<std::unique_ptr<ToolbarActionViewController>>& actions, extensions::PermissionsManager::UserSiteSetting site_setting, content::WebContents* web_contents) { - // Don't update the button if the confirmation message is currently showing; - // it'll go away after a few seconds. Once the confirmation is collapsed, - // button should be updated again. - if (request_access_button_->IsShowingConfirmation()) { - return; - } - // Extensions are included in the request access button only when the site // allows customizing site access by extension, and when the extension // itself can show access requests in the toolbar and hasn't been dismissed. @@ -108,18 +101,5 @@ request_access_button_->Update(extensions); } -void ExtensionsToolbarControls::ResetConfirmation() { - request_access_button_->ResetConfirmation(); -} - -bool ExtensionsToolbarControls::IsShowingConfirmation() const { - return request_access_button_->IsShowingConfirmation(); -} - -bool ExtensionsToolbarControls::IsShowingConfirmationFor( - const url::Origin& origin) const { - return request_access_button_->IsShowingConfirmationFor(origin); -} - BEGIN_METADATA(ExtensionsToolbarControls, ToolbarIconContainerView) END_METADATA
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h index 124c828..260f82a 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h
@@ -55,15 +55,6 @@ extensions::PermissionsManager::UserSiteSetting site_setting, content::WebContents* web_contents); - // Hides the confirmation message in the request access button. - void ResetConfirmation(); - - // Returns whether the button is showing a confirmation message. - bool IsShowingConfirmation() const; - - // Returns whether the button is showing a confirmation message for `origin`. - bool IsShowingConfirmationFor(const url::Origin& origin) const; - // ToolbarIconContainerView: void UpdateAllIcons() override;
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc index ff05ac1..65225ca 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
@@ -20,17 +20,8 @@ #include "extensions/test/permissions_manager_waiter.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/l10n/l10n_util.h" #include "url/origin.h" -namespace { - -// TODO(crbug.com/1452171): Same as permission's ChipController. Pull out to a -// shared location. -base::TimeDelta kConfirmationDisplayDuration = base::Seconds(4); - -} // namespace - class ExtensionsToolbarControlsUnitTest : public ExtensionsToolbarUnitTest { public: ExtensionsToolbarControlsUnitTest(); @@ -57,9 +48,7 @@ raw_ptr<content::WebContentsTester, DanglingUntriaged> web_contents_tester_; }; -ExtensionsToolbarControlsUnitTest::ExtensionsToolbarControlsUnitTest() - : ExtensionsToolbarUnitTest( - base::test::TaskEnvironment::TimeSource::MOCK_TIME) { +ExtensionsToolbarControlsUnitTest::ExtensionsToolbarControlsUnitTest() { scoped_feature_list_.InitAndEnableFeature( extensions_features::kExtensionsMenuAccessControl); } @@ -451,7 +440,7 @@ base::UserActionTester user_action_tester; auto* permissions = extensions::PermissionsManager::Get(profile()); - // Request access button is visible because the extension is requesting + // Request access button is visible because extension A is requesting // access. ASSERT_TRUE(request_access_button()->GetVisible()); EXPECT_EQ(user_action_tester.GetActionCount(kActivatedUserAction), 0); @@ -467,86 +456,18 @@ WaitForAnimation(); LayoutContainerIfNecessary(); - // Verify extension was executed and extensions menu button has "any - // extension has access" state. Extension's site access should have not - // changed, since clicking the button grants one time access. + // Verify request access button is hidden since extension executed its + // action. Extension's site access should have not changed, since clicking the + // button grants one time access. + ASSERT_FALSE(request_access_button()->GetVisible()); EXPECT_EQ(user_action_tester.GetActionCount(kActivatedUserAction), 1); - EXPECT_EQ(extensions_button()->GetStateForTesting(), - ExtensionsToolbarButton::State::kAnyExtensionHasAccess); EXPECT_EQ(permissions->GetUserSiteAccess(*extension, url), extensions::PermissionsManager::UserSiteAccess::kOnClick); - // Verify confirmation message appears on the request access button. - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_EQ(request_access_button()->GetText(), - l10n_util::GetStringUTF16( - IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT)); - - // Force the confirmation to be collapsed. - task_environment()->AdvanceClock(kConfirmationDisplayDuration); - base::RunLoop().RunUntilIdle(); - - // Verify the request access button is hidden. - ASSERT_FALSE(request_access_button()->GetVisible()); -} - -// Tests that if an update comes in between the request access button is clicked -// and the confirmation is collapsed, the button is updated afterwards with the -// correct information. -TEST_F(ExtensionsToolbarControlsUnitTest, - RequestAccessButton_UpdateInBetweenClickAndConfirmationCollapse) { - auto extension_A = - InstallExtensionWithHostPermissions("Extension A", {"<all_urls>"}); - auto extension_B = - InstallExtensionWithHostPermissions("Extension B", {"<all_urls>"}); - auto extension_C = - InstallExtensionWithHostPermissions("Extension C", {"<all_urls>"}); - WithholdHostPermissions(extension_A.get()); - WithholdHostPermissions(extension_B.get()); - - const GURL url("http://www.example.com"); - NavigateAndCommit(url); - LayoutContainerIfNecessary(); - - // Request access button is visible because extension A and B are requesting - // access. - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(), - testing::ElementsAre(extension_A->id(), extension_B->id())); - - ClickButton(request_access_button()); - WaitForAnimation(); - LayoutContainerIfNecessary(); - - // Verify confirmation message appears on the request access button after - // clicking on it - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_EQ(request_access_button()->GetText(), - l10n_util::GetStringUTF16( - IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT)); - - // Update a different extension before the confirmation is collapsed. - content::WebContents* web_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - UpdateUserSiteAccess( - *extension_C, web_contents, - extensions::PermissionsManager::UserSiteAccess::kOnClick); - - // Confirmation is still showing since collapse time hasn't elapsed. - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_EQ(request_access_button()->GetText(), - l10n_util::GetStringUTF16( - IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT)); - - // Force the confirmation to be collapsed. - task_environment()->AdvanceClock(kConfirmationDisplayDuration); - base::RunLoop().RunUntilIdle(); - - // Verify the request access button is visible since extension C is now - // requesting access. - EXPECT_TRUE(request_access_button()->GetVisible()); - EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(), - testing::ElementsAre(extension_C->id())); + // Verify extensions menu button has "any extension has access" state, since + // the extension executed its action. + EXPECT_EQ(extensions_button()->GetStateForTesting(), + ExtensionsToolbarButton::State::kAnyExtensionHasAccess); } class ExtensionsToolbarControlsWithPermittedSitesUnitTest
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc index 33a99f0..aa8c5d6d 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
@@ -41,10 +41,6 @@ } // namespace -ExtensionsToolbarUnitTest::ExtensionsToolbarUnitTest( - base::test::TaskEnvironment::TimeSource time_source) - : TestWithBrowserView(time_source) {} - void ExtensionsToolbarUnitTest::SetUp() { TestWithBrowserView::SetUp();
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h index d2fcc350..b0595bc5 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
@@ -26,8 +26,6 @@ class ExtensionsToolbarUnitTest : public TestWithBrowserView { public: ExtensionsToolbarUnitTest() = default; - explicit ExtensionsToolbarUnitTest( - base::test::TaskEnvironment::TimeSource time_source); ~ExtensionsToolbarUnitTest() override = default; ExtensionsToolbarUnitTest(const ExtensionsToolbarUnitTest&) = delete; const ExtensionsToolbarUnitTest& operator=(const ExtensionsToolbarUnitTest&) =
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc index 2e26805..3c0d7cd 100644 --- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc +++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -584,41 +584,21 @@ views::BoxLayout::Orientation::kVertical, gfx::Insets::VH(0, kLeftRightPadding))); - // Add column for text. - views::View* const text_column = - row->AddChildView(std::make_unique<views::View>()); - text_column->SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical)); - - // Add body for mismatch dialog. - views::Label* const body = - text_column->AddChildView(std::make_unique<views::Label>( - l10n_util::GetStringFUTF16(IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY, - idp_for_display, top_frame_for_display), - views::style::CONTEXT_DIALOG_TITLE, views::style::STYLE_PRIMARY)); + // Add body. + views::Label* const body = row->AddChildView(std::make_unique<views::Label>( + l10n_util::GetStringFUTF16(IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY, + idp_for_display), + views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_SECONDARY)); body->SetMultiLine(true); - body->SetBorder( - views::CreateEmptyBorder(gfx::Insets::VH(kVerticalSpacing, 0))); body->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - constexpr int kBodyLineHeight = 22; + constexpr int kBodyLineHeight = 20; body->SetLineHeight(kBodyLineHeight); - // Add description for signing in. - views::Label* const description = - text_column->AddChildView(std::make_unique<views::Label>( - l10n_util::GetStringUTF16( - IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_DESCRIPTION), - views::style::CONTEXT_DIALOG_BODY_TEXT, - views::style::STYLE_SECONDARY)); - description->SetMultiLine(true); - description->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - constexpr int kDescriptionLineHeight = 20; - description->SetLineHeight(kDescriptionLineHeight); - - // The space between the description and the continue button. + // Add space between the body and the separator and the body and the continue + // button. constexpr int kBottomSpacing = 16; - description->SetBorder( - views::CreateEmptyBorder(gfx::Insets::TLBR(0, 0, kBottomSpacing, 0))); + body->SetBorder(views::CreateEmptyBorder( + gfx::Insets::TLBR(kVerticalSpacing, 0, kBottomSpacing, 0))); // Add continue button. auto button = std::make_unique<ContinueButton>(
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc index 465a9a39..30720d6c 100644 --- a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
@@ -378,25 +378,12 @@ failure_dialog->children(); ASSERT_EQ(failure_dialog_children.size(), 2u); - const views::View* text_column = failure_dialog_children[0]; - const std::vector<views::View*> text_column_children = - text_column->children(); - ASSERT_EQ(text_column_children.size(), 2u); - // Check the body shown. - views::Label* body = static_cast<views::Label*>(text_column_children[0]); + views::Label* body = static_cast<views::Label*>(failure_dialog_children[0]); ASSERT_TRUE(body); EXPECT_EQ(body->GetText(), - u"Use your idp-example.com account to sign in to " - u"top-frame-example.com"); - - // Check the description shown. - views::Label* description = - static_cast<views::Label*>(text_column_children[1]); - ASSERT_TRUE(description); - EXPECT_EQ(description->GetText(), - l10n_util::GetStringUTF16( - IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_DESCRIPTION)); + u"You can use your idp-example.com account on this site. To " + u"continue, sign in to idp-example.com."); // Check the "Continue" button. views::MdTextButton* button =
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.cc b/chrome/browser/ui/web_applications/web_app_browser_controller.cc index 832bba0..2cdf302 100644 --- a/chrome/browser/ui/web_applications/web_app_browser_controller.cc +++ b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/web_applications/web_app_browser_controller.h" +#include "base/callback_list.h" #include "base/check_is_test.h" #include "base/containers/flat_set.h" #include "base/functional/callback.h"
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.h b/chrome/browser/ui/web_applications/web_app_browser_controller.h index 99fbcef..c32b237d 100644 --- a/chrome/browser/ui/web_applications/web_app_browser_controller.h +++ b/chrome/browser/ui/web_applications/web_app_browser_controller.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "base/callback_list.h" #include "base/functional/callback.h" #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h"
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc index 35538072f..f970e50 100644 --- a/chrome/browser/ui/webauthn/sheet_models.cc +++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -1331,11 +1331,11 @@ } std::u16string AuthenticatorConnectedSheetModel::GetStepTitle() const { - return l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLE_ACTIVATE_TITLE_DEVICE); + return l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION); } std::u16string AuthenticatorConnectedSheetModel::GetStepDescription() const { - return l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION); + return u""; } // AuthenticatorCableErrorSheetModel ------------------------------------------
diff --git a/chrome/browser/ui/webui/internals/internals_ui.cc b/chrome/browser/ui/webui/internals/internals_ui.cc index 538a0166..e3ef306f 100644 --- a/chrome/browser/ui/webui/internals/internals_ui.cc +++ b/chrome/browser/ui/webui/internals/internals_ui.cc
@@ -112,11 +112,8 @@ } void InternalsUI::AddQueryTilesInternals(content::WebUI* web_ui) { - source_->AddResourcePath("query_tiles_internals.js", - IDR_QUERY_TILES_INTERNALS_JS); - source_->AddResourcePath("query_tiles_internals_browser_proxy.js", - IDR_QUERY_TILES_INTERNALS_BROWSER_PROXY_JS); - source_->AddResourcePath("query-tiles", IDR_QUERY_TILES_INTERNALS_HTML); + source_->AddResourcePath( + "query-tiles", IDR_QUERY_TILES_INTERNALS_QUERY_TILES_INTERNALS_HTML); web_ui->AddMessageHandler( std::make_unique<QueryTilesInternalsUIMessageHandler>(profile_)); }
diff --git a/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc b/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc index b8e43498..4993a17 100644 --- a/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc +++ b/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc
@@ -9,7 +9,8 @@ #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" -#include "chrome/grit/dev_ui_browser_resources.h" +#include "chrome/grit/sandbox_internals_resources.h" +#include "chrome/grit/sandbox_internals_resources_map.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -68,8 +69,9 @@ void CreateAndAddDataSource(Profile* profile) { content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd( profile, chrome::kChromeUISandboxHost); - source->SetDefaultResource(IDR_SANDBOX_INTERNALS_HTML); - source->AddResourcePath("sandbox_internals.js", IDR_SANDBOX_INTERNALS_JS); + source->AddResourcePaths(base::make_span(kSandboxInternalsResources, + kSandboxInternalsResourcesSize)); + source->SetDefaultResource(IDR_SANDBOX_INTERNALS_SANDBOX_INTERNALS_HTML); #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) SetSandboxStatusData(source);
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc index a5cc1b49..aa16a4d6 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc
@@ -64,10 +64,18 @@ 0xc2, 0xd9, 0xf2, 0x02, 0x03, 0x42, 0x18, 0x10, 0x12, 0x26, 0x62, 0x88, 0xf6, 0xa3, 0xa5, 0x47, 0x14, 0x69, 0x00, 0x73}; -class MockIsolatedWebAppTrustChecker : public IsolatedWebAppTrustChecker { +// This class needs to be a IsolatedWebAppTrustChecker, but also must +// provide a TestingPrefServiceSimple that outlives it. So rather than +// making TestingPrefServiceSimple a member, make it the leftmost base class. +class MockIsolatedWebAppTrustChecker : private TestingPrefServiceSimple, + public IsolatedWebAppTrustChecker { public: MockIsolatedWebAppTrustChecker() - : IsolatedWebAppTrustChecker(TestingPrefServiceSimple()) {} + : IsolatedWebAppTrustChecker( + // Disambiguate the constructor using the form that takes the + // already-initialized leftmost base class, rather than the copy + // constructor for the uninitialized rightmost base class. + *static_cast<TestingPrefServiceSimple*>(this)) {} MOCK_METHOD( IsolatedWebAppTrustChecker::Result,
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index d50ca208b..cb4e633 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -48,6 +48,7 @@ #if BUILDFLAG(IS_MAC) #include "base/mac/mac_util.h" +#include "device/fido/mac/util.h" #endif namespace { @@ -414,14 +415,24 @@ ? Step::kPreSelectSingleAccount : Step::kPreSelectAccount); } else { - // For requests with an allow list, pre-select a random credential and - // show that one to the user. For platform authenticators with optional - // UV (e.g. Touch ID), this step essentially acts as the user presence - // check. + // For requests with an allow list, pre-select a random credential. ephemeral_state_.creds_ = { transport_availability_ .recognized_platform_authenticator_credentials.front()}; - SetCurrentStep(Step::kPreSelectSingleAccount); +#if BUILDFLAG(IS_MAC) + if (base::FeatureList::IsEnabled( + device::kWebAuthnSkipSingleAccountMacOS) && + device::fido::mac::DeviceHasBiometricsAvailable()) { + // If we can do Touch ID, jump directly to it. + HideDialogAndDispatchToPlatformAuthenticator(); + } else +#endif + { + // Otherwise show the chosen credential to the user. For platform + // authenticators with optional UV (e.g. Touch ID), this step + // essentially acts as the user presence check. + SetCurrentStep(Step::kPreSelectSingleAccount); + } } return; }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 00abfe7..0c07a14 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1686635928-bc283fb9a126d45ee82f6c2ab113bcbaff2108f1.profdata +chrome-linux-main-1686679195-33c434849e7a07bda6014953a718b27a46cc63a8.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 767b3eb..78212a9 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1686671915-f57d526d51a94ee5a559d6811ac713b0a4ae0f8e.profdata +chrome-mac-arm-main-1686679195-d48d2451e080e197d155bf47e1f9e6dda617e83c.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 0d921a7..45f51ca 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1686635928-3621cd5bcdbf9d17753b5f865b3c1ec900dc1d05.profdata +chrome-mac-main-1686679195-ac74d94d2c6336a23baa367010b37789b8e53e48.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index ef1cc46..d6f09d6 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1686668293-636d121caa311b2a70ca16e74db8bab74bc34891.profdata +chrome-win32-main-1686679195-96705c2194956572f5a48a9ee26ddce3b2ee8709.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 3c60a77..0e50c53 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1686657517-dfc3ec36cfe59c606c3820dc0b1500d86a337274.profdata +chrome-win64-main-1686679195-ae4cf23745fe2676f2bda242ad2b7d7e2f515af2.profdata
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg index c0890200..76f3356 100644 --- a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg +++ b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg index c0890200..76f3356 100644 --- a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg +++ b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg index ffb8f30..b8a9c9d 100644 --- a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg +++ b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg index ffb8f30..b8a9c9d 100644 --- a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg +++ b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg index a826f7b..44b7cf7b 100644 --- a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg +++ b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg index a826f7b..44b7cf7b 100644 --- a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg +++ b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg Binary files differ
diff --git a/chrome/test/data/webui/cr_components/color_change_listener_test.ts b/chrome/test/data/webui/cr_components/color_change_listener_test.ts index 94ebddd..b675d4d 100644 --- a/chrome/test/data/webui/cr_components/color_change_listener_test.ts +++ b/chrome/test/data/webui/cr_components/color_change_listener_test.ts
@@ -5,7 +5,7 @@ // clang-format off import {COLORS_CSS_SELECTOR, ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js'; // <if expr="chromeos_ash"> -import {addColorChangeListener, removeColorChangeListener} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js'; +import {COLOR_PROVIDER_CHANGED} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js'; // </if> import {getTrustedHTML} from 'chrome://resources/js/static_types.js'; @@ -112,33 +112,19 @@ }); // <if expr="chromeos_ash"> - test('RegistersColorChangeListener', async () => { + test('AddAndRemoveColorProviderChangedListener', async () => { let listenerCalledTimes = 0; - addColorChangeListener(() => { - listenerCalledTimes++; - }); + const listener = () => listenerCalledTimes++; + updater.eventTarget.addEventListener(COLOR_PROVIDER_CHANGED, listener); // Emulate a color change event from the mojo pipe. await updater.onColorProviderChanged(); - assertEquals(listenerCalledTimes, 1); - }); - test('RemovesColorChangeListener', async () => { - let listenerCalledTimes = 0; - const listener = () => { - listenerCalledTimes++; - }; - addColorChangeListener(listener); + updater.eventTarget.removeEventListener(COLOR_PROVIDER_CHANGED, listener); // Emulate a color change event from the mojo pipe. await updater.onColorProviderChanged(); - - removeColorChangeListener(listener); - - // Emulate a color change event from the mojo pipe. - await updater.onColorProviderChanged(); - assertEquals(listenerCalledTimes, 1); }); // </if>
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn index 309acc8..1956092 100644 --- a/chrome/test/data/webui/settings/chromeos/BUILD.gn +++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -56,7 +56,6 @@ "nearby_share_receive_dialog_tests.js", "nearby_share_subpage_tests.js", "network_device_info_dialog_test.js", - "network_proxy_section_test.js", "onc_mojo_test.ts", "os_about_page_tests.js", "os_edit_dictionary_page_test.js", @@ -147,6 +146,7 @@ "internet_page/internet_config_test.ts", "internet_page/internet_detail_subpage_tests.js", "internet_page/network_always_on_vpn_test.ts", + "internet_page/network_proxy_section_test.ts", "internet_page/network_summary_item_test.ts", "internet_page/network_summary_test.ts", "internet_page/passpoint_subpage_test.ts",
diff --git a/chrome/test/data/webui/settings/chromeos/internet_page/network_proxy_section_test.ts b/chrome/test/data/webui/settings/chromeos/internet_page/network_proxy_section_test.ts new file mode 100644 index 0000000..c795470 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/internet_page/network_proxy_section_test.ts
@@ -0,0 +1,138 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://os-settings/lazy_load.js'; + +import {NetworkProxySectionElement} from 'chrome://os-settings/lazy_load.js'; +import {NetworkProxyElement} from 'chrome://resources/ash/common/network/network_proxy.js'; +import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; +import {ConnectionStateType, NetworkType, OncSource, PolicySource, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; + +suite('<network-proxy-section>', () => { + let proxySection: NetworkProxySectionElement; + let props: ManagedProperties; + + function initializeProps(): ManagedProperties { + return proxySection.managedProperties = { + connectionState: ConnectionStateType.MIN_VALUE, + source: OncSource.MIN_VALUE, + connectable: false, + portalState: PortalState.MIN_VALUE, + errorState: undefined, + guid: '', + ipAddressConfigType: { + activeValue: '', + policySource: PolicySource.MIN_VALUE, + policyValue: undefined, + }, + ipConfigs: undefined, + metered: undefined, + name: undefined, + nameServersConfigType: { + activeValue: '', + policySource: PolicySource.MIN_VALUE, + policyValue: undefined, + }, + priority: undefined, + proxySettings: undefined, + staticIpConfig: undefined, + savedIpConfig: undefined, + type: NetworkType.MIN_VALUE, + typeProperties: { + cellular: undefined, + ethernet: undefined, + tether: undefined, + vpn: undefined, + wifi: undefined, + }, + trafficCounterProperties: { + lastResetTime: undefined, + friendlyDate: undefined, + autoReset: false, + userSpecifiedResetDay: 0, + }, + }; + } + + setup(() => { + proxySection = document.createElement('network-proxy-section'); + proxySection.prefs = { + // prefs.settings.use_shared_proxies is set by the proxy service in CrOS, + // which does not run in the browser_tests environment. + 'settings': { + 'use_shared_proxies': { + key: 'use_shared_proxies', + type: chrome.settingsPrivate.PrefType.BOOLEAN, + value: true, + }, + }, + 'ash': { + 'lacros_proxy_controlling_extension': { + key: 'ash.lacros_proxy_controlling_extension', + type: chrome.settingsPrivate.PrefType.DICTIONARY, + value: {}, + }, + }, + }; + props = initializeProps(); + document.body.appendChild(proxySection); + flush(); + }); + + teardown(() => { + proxySection.remove(); + }); + + test('Visibility of Allow Shared toggle', () => { + const allowSharedToggle = proxySection.$.allowShared; + + proxySection.managedProperties = { + ...props, + source: OncSource.kNone, + }; + assertTrue(allowSharedToggle.hidden); + + proxySection.managedProperties = { + ...props, + source: OncSource.kDevice, + }; + assertFalse(allowSharedToggle.hidden); + + proxySection.managedProperties = { + ...props, + source: OncSource.kDevicePolicy, + }; + assertFalse(allowSharedToggle.hidden); + + proxySection.managedProperties = { + ...props, + source: OncSource.kUser, + }; + assertTrue(allowSharedToggle.hidden); + + proxySection.managedProperties = { + ...props, + source: OncSource.kUserPolicy, + }; + assertTrue(allowSharedToggle.hidden); + }); + + test('Disabled UI state', () => { + const allowSharedToggle = proxySection.$.allowShared; + const networkProxy = + proxySection.shadowRoot!.querySelector<NetworkProxyElement>( + 'network-proxy'); + assertTrue(!!networkProxy); + + assertFalse(allowSharedToggle.disabled); + assertTrue(networkProxy.editable); + + proxySection.disabled = true; + + assertTrue(allowSharedToggle.disabled); + assertFalse(networkProxy.editable); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js b/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js deleted file mode 100644 index 6e28c7c..0000000 --- a/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'chrome://os-settings/lazy_load.js'; - -import {OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; -import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -suite('NetworkProxySection', function() { - /** @type {!NetworkProxySectionElement|undefined} */ - let proxySection; - - setup(function() { - proxySection = document.createElement('network-proxy-section'); - proxySection.prefs = { - // prefs.settings.use_shared_proxies is set by the proxy service in CrOS, - // which does not run in the browser_tests environment. - 'settings': { - 'use_shared_proxies': { - key: 'use_shared_proxies', - type: chrome.settingsPrivate.PrefType.BOOLEAN, - value: true, - }, - }, - 'ash': { - 'lacros_proxy_controlling_extension': { - key: 'ash.lacros_proxy_controlling_extension', - type: chrome.settingsPrivate.PrefType.DICTIONARY, - value: {}, - }, - }, - }; - document.body.appendChild(proxySection); - flush(); - }); - - test('Visibility of Allow Shared toggle', function() { - const allowSharedToggle = proxySection.$.allowShared; - assertTrue(!!allowSharedToggle); - - proxySection.managedProperties = { - source: OncSource.kNone, - }; - assertTrue(allowSharedToggle.hidden); - - proxySection.managedProperties = { - source: OncSource.kDevice, - }; - assertFalse(allowSharedToggle.hidden); - - proxySection.managedProperties = { - source: OncSource.kDevicePolicy, - }; - assertFalse(allowSharedToggle.hidden); - - proxySection.managedProperties = { - source: OncSource.kUser, - }; - assertTrue(allowSharedToggle.hidden); - - proxySection.managedProperties = { - source: OncSource.kUserPolicy, - }; - assertTrue(allowSharedToggle.hidden); - }); - - test('Disabled UI state', function() { - const allowSharedToggle = proxySection.$.allowShared; - const networkProxy = proxySection.shadowRoot.querySelector('network-proxy'); - - assertFalse(allowSharedToggle.disabled); - assertTrue(networkProxy.editable); - - proxySection.disabled = true; - - assertTrue(allowSharedToggle.disabled); - assertFalse(networkProxy.editable); - }); -});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js index 47af7646..15bd779 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -316,6 +316,10 @@ 'InternetPageNetworkAlwaysOnVpn', 'internet_page/network_always_on_vpn_test.js' ], + [ + 'InternetPageNetworkProxySection', + 'internet_page/network_proxy_section_test.js' + ], ['InternetPageNetworkSummary', 'internet_page/network_summary_test.js'], [ 'InternetPageNetworkSummaryItem', @@ -412,7 +416,6 @@ 'nearby_share_subpage_tests.js', {enabled: ['features::kNearbySharing']}, ], - ['NetworkProxySection', 'network_proxy_section_test.js'], ['NetworkDeviceInfoDialog', 'network_device_info_dialog_test.js'], ['OncMojoTest', 'onc_mojo_test.js'], [
diff --git a/chrome/test/fuzzing/BUILD.gn b/chrome/test/fuzzing/BUILD.gn index 8e1e7ec..bffd1bcb 100644 --- a/chrome/test/fuzzing/BUILD.gn +++ b/chrome/test/fuzzing/BUILD.gn
@@ -3,6 +3,8 @@ # found in the LICENSE file. import("//build/buildflag_header.gni") +import("//build/config/ozone.gni") +import("//build/config/ui.gni") import("//chrome/test/fuzzing/in_process_fuzzer.gni") # This target exists to reference other test executables to bring these files @@ -39,5 +41,18 @@ sources = [ "kombucha_in_process_fuzzer.cc" ] proto_source = "kombucha_in_process_fuzzer.proto" + + deps = [] + + # Used for UI controls + if (use_aura) { + deps += [ "//ui/aura:test_support" ] + } + if (use_aura && use_ozone) { + deps += [ + "//ui/ozone", + "//ui/platform_window/common:common", + ] + } } }
diff --git a/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc b/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc index 9bc50f4..685584c 100644 --- a/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc +++ b/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc
@@ -26,6 +26,22 @@ #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/interactive_test.h" +// The following includes are used to enable ui_controls only. +#include "ui/base/test/ui_controls.h" +#if BUILDFLAG(IS_OZONE) +#include "ui/views/test/test_desktop_screen_ozone.h" +#endif +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/test/ui_controls_ash.h" +#elif BUILDFLAG(IS_WIN) +#include "base/win/scoped_com_initializer.h" +#include "ui/aura/test/ui_controls_aurawin.h" +#endif +#if defined(USE_AURA) && BUILDFLAG(IS_OZONE) +#include "ui/ozone/public/ozone_platform.h" +#include "ui/platform_window/common/platform_window_defaults.h" +#endif // defined(USE_AURA) && BUILDFLAG(IS_OZONE) + #define DEFINE_BINARY_PROTO_IN_PROCESS_FUZZER(arg) \ DEFINE_PROTO_FUZZER_IN_PROCESS_IMPL(true, arg) @@ -41,13 +57,41 @@ class KombuchaInProcessFuzzer : virtual public InteractiveBrowserTestT<InProcessFuzzer> { public: + ~KombuchaInProcessFuzzer() override = default; void SetUp() override { scoped_feature_list_.InitWithFeatures( {features::kTabGroupsSave, features::kExtensionsMenuInAppMenu}, {}); + + // Mouse movements require enabling ui_controls manually for tests + // that live outside the ui_interaction_test directory. + // The following is copied from + // chrome/test/base/interactive_ui_tests_main.cc +#if BUILDFLAG(IS_CHROMEOS_ASH) + ash::test::EnableUIControlsAsh(); +#elif BUILDFLAG(IS_WIN) + com_initializer_ = std::make_unique<base::win::ScopedCOMInitializer>(); + aura::test::EnableUIControlsAuraWin(); +#elif BUILDFLAG(IS_OZONE) + // Notifies the platform that test config is needed. For Wayland, for + // example, makes its possible to use emulated input. + ui::test::EnableTestConfigForPlatformWindows(); + ui::OzonePlatform::InitParams params; + params.single_process = true; + ui::OzonePlatform::InitializeForUI(params); + ui_controls::EnableUIControls(); +#else + ui_controls::EnableUIControls(); +#endif + InteractiveBrowserTestT::SetUp(); } - void SetUpOnMainThread() override; +#if BUILDFLAG(IS_WIN) + void TearDown() override { + InteractiveBrowserTestT::TearDown(); + com_initializer_.reset(); + } +#endif int Fuzz(const uint8_t* data, size_t size) override; static std::unique_ptr<net::test_server::HttpResponse> HandleHTTPRequest( base::WeakPtr<KombuchaInProcessFuzzer> fuzzer_weak, @@ -91,6 +135,10 @@ private: base::test::ScopedFeatureList scoped_feature_list_; +#if BUILDFLAG(IS_WIN) + std::unique_ptr<base::win::ScopedCOMInitializer> com_initializer_; +#endif + base::WeakPtrFactory<KombuchaInProcessFuzzer> weak_ptr_factory_{this}; }; @@ -102,6 +150,7 @@ base::BindRepeating(&KombuchaInProcessFuzzer::HandleHTTPRequest, weak_ptr_factory_.GetWeakPtr())); ASSERT_TRUE(embedded_test_server()->Start()); + // Accelerators for using in fuzzing chrome::AcceleratorProviderForBrowser(browser())->GetAcceleratorForCommandId( IDC_FULLSCREEN, &fullscreen_accelerator_);
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn index f19f4ab..1ad00b41 100644 --- a/chrome/updater/BUILD.gn +++ b/chrome/updater/BUILD.gn
@@ -714,6 +714,7 @@ testonly = true sources = [ "app/app_server_unittest.cc", + "app/app_uninstall_unittest.cc", "constants_unittest.cc", "device_management/dm_client_unittest.cc", "device_management/dm_message_unittest.cc",
diff --git a/chrome/updater/app/app_uninstall.cc b/chrome/updater/app/app_uninstall.cc index dd674cd..1f42223 100644 --- a/chrome/updater/app/app_uninstall.cc +++ b/chrome/updater/app/app_uninstall.cc
@@ -16,6 +16,7 @@ #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/process/launch.h" +#include "base/strings/utf_string_conversions.h" #include "base/task/sequenced_task_runner.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -28,6 +29,7 @@ #include "chrome/updater/lock.h" #include "chrome/updater/persisted_data.h" #include "chrome/updater/prefs.h" +#include "chrome/updater/updater_scope.h" #include "chrome/updater/updater_version.h" #include "chrome/updater/util/util.h" #include "components/update_client/update_client.h" @@ -40,43 +42,85 @@ #endif namespace updater { -namespace { -// Uninstalls all versions not matching this version of the updater for the -// given `scope`. -void UninstallOtherVersions(UpdaterScope scope) { +std::vector<base::FilePath> GetVersionExecutablePaths(UpdaterScope scope) { const absl::optional<base::FilePath> updater_folder_path = GetInstallDirectory(scope); if (!updater_folder_path) { - LOG(ERROR) << "Failed to get updater folder path."; - return; + LOG(ERROR) << __func__ << ": failed to get the updater install directory."; + return {}; } - base::FileEnumerator file_enumerator(*updater_folder_path, true, + std::vector<base::FilePath> version_executable_paths; + base::FileEnumerator file_enumerator(*updater_folder_path, false, base::FileEnumerator::DIRECTORIES); for (base::FilePath version_folder_path = file_enumerator.Next(); - !version_folder_path.empty() && - version_folder_path != GetVersionedInstallDirectory(scope); + !version_folder_path.empty(); version_folder_path = file_enumerator.Next()) { + // Skip the current version. + if (version_folder_path == GetVersionedInstallDirectory(scope)) { + VLOG(1) << __func__ + << " : skipping the current version: " << version_folder_path; + continue; + } + +#if BUILDFLAG(IS_WIN) + const base::Version folder_version( + base::WideToASCII(version_folder_path.BaseName().value())); +#else + const base::Version folder_version(version_folder_path.BaseName().value()); +#endif // BUILDFLAG(IS_WIN) + + // Skip if the folder is not named as a valid version. All updater version + // directories are named as valid versions. + if (!folder_version.IsValid()) { + continue; + } + const base::FilePath version_executable_path = version_folder_path.Append(GetExecutableRelativePath()); if (base::PathExists(version_executable_path)) { - base::CommandLine command_line(version_executable_path); - command_line.AppendSwitch(kUninstallSelfSwitch); - if (IsSystemInstall(scope)) { - command_line.AppendSwitch(kSystemSwitch); - } - command_line.AppendSwitch(kEnableLoggingSwitch); - command_line.AppendSwitchASCII(kLoggingModuleSwitch, - kLoggingModuleSwitchValue); - int exit_code = -1; - std::string output; - base::GetAppOutputWithExitCode(command_line, &output, &exit_code); + version_executable_paths.push_back(version_executable_path); + VLOG(1) << __func__ << " : added to version_executable_paths: " + << version_executable_path; } else { - VLOG(1) << base::CommandLine::ForCurrentProcess()->GetCommandLineString() - << " : Path doesn't exist: " << version_executable_path; + VLOG(1) << __func__ + << " : File does not exist: " << version_executable_path; } } + + return version_executable_paths; +} + +base::CommandLine GetUninstallSelfCommandLine( + UpdaterScope scope, + const base::FilePath& executable_path) { + base::CommandLine command_line(executable_path); + command_line.AppendSwitch(kUninstallSelfSwitch); + if (IsSystemInstall(scope)) { + command_line.AppendSwitch(kSystemSwitch); + } + command_line.AppendSwitch(kEnableLoggingSwitch); + command_line.AppendSwitchASCII(kLoggingModuleSwitch, + kLoggingModuleSwitchValue); + return command_line; +} + +namespace { + +// Uninstalls all versions not matching the current version of the updater for +// the given `scope`. +void UninstallOtherVersions(UpdaterScope scope) { + for (const base::FilePath& version_executable_path : + GetVersionExecutablePaths(scope)) { + const base::CommandLine command_line( + GetUninstallSelfCommandLine(scope, version_executable_path)); + int exit_code = -1; + std::string output; + base::GetAppOutputWithExitCode(command_line, &output, &exit_code); + VLOG(1) << __func__ << ": Ran: " << command_line.GetCommandLineString() + << ": " << output << ": " << exit_code; + } } } // namespace
diff --git a/chrome/updater/app/app_uninstall.h b/chrome/updater/app/app_uninstall.h index 6b798bac..969c5be 100644 --- a/chrome/updater/app/app_uninstall.h +++ b/chrome/updater/app/app_uninstall.h
@@ -5,12 +5,26 @@ #ifndef CHROME_UPDATER_APP_APP_UNINSTALL_H_ #define CHROME_UPDATER_APP_APP_UNINSTALL_H_ +#include <vector> + +#include "base/command_line.h" +#include "base/files/file_path.h" #include "base/memory/scoped_refptr.h" +#include "chrome/updater/updater_scope.h" namespace updater { class App; +// Returns a vector of updater executable paths from all versions underneath the +// official install directory for `scope`, excluding the current version. +std::vector<base::FilePath> GetVersionExecutablePaths(UpdaterScope scope); + +// Returns a command line to uninstall the updater at `executable_path`. +base::CommandLine GetUninstallSelfCommandLine( + UpdaterScope scope, + const base::FilePath& executable_path); + scoped_refptr<App> MakeAppUninstall(); } // namespace updater
diff --git a/chrome/updater/app/app_uninstall_unittest.cc b/chrome/updater/app/app_uninstall_unittest.cc new file mode 100644 index 0000000..d775038 --- /dev/null +++ b/chrome/updater/app/app_uninstall_unittest.cc
@@ -0,0 +1,65 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/updater/app/app_uninstall.h" + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/test/task_environment.h" +#include "base/version.h" +#include "chrome/updater/constants.h" +#include "chrome/updater/test_scope.h" +#include "chrome/updater/updater_scope.h" +#include "chrome/updater/updater_version.h" +#include "chrome/updater/util/unittest_util.h" +#include "chrome/updater/util/util.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace updater { + +class AppUninstallTest : public testing::Test { + private: + base::test::TaskEnvironment environment_; +}; + +TEST_F(AppUninstallTest, GetVersionExecutablePaths) { +#if BUILDFLAG(IS_MAC) + // Cannot create global prefs in the macOS system scope. + if (IsSystemInstall(GetTestScope())) { + return; + } +#endif // BUILDFLAG(IS_MAC) + + for (int major_version_offset : {-2, -1, 0, 1}) { + updater::test::SetupFakeUpdaterVersion( + GetTestScope(), base::Version(kUpdaterVersion), major_version_offset, + /*should_create_updater_executable=*/true); + } + + for (int major_version_offset : {2, 3}) { + updater::test::SetupFakeUpdaterVersion( + GetTestScope(), base::Version(kUpdaterVersion), major_version_offset, + /*should_create_updater_executable=*/false); + } + + ASSERT_EQ(GetVersionExecutablePaths(GetTestScope()).size(), 3u); + + const absl::optional<base::FilePath> path = + GetInstallDirectory(GetTestScope()); + ASSERT_TRUE(path); + ASSERT_TRUE(base::DeletePathRecursively(*path)); +} + +TEST_F(AppUninstallTest, GetUninstallSelfCommandLine) { + const base::CommandLine command_line(GetUninstallSelfCommandLine( + GetTestScope(), base::FilePath(FILE_PATH_LITERAL("foobar.executable")))); + + EXPECT_TRUE(command_line.HasSwitch(kUninstallSelfSwitch)); + EXPECT_EQ(command_line.HasSwitch(kSystemSwitch), + IsSystemInstall(GetTestScope())); +} + +} // namespace updater
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc index b60c59a..5032112e 100644 --- a/chrome/updater/test/integration_tests_impl.cc +++ b/chrome/updater/test/integration_tests_impl.cc
@@ -492,46 +492,16 @@ ASSERT_TRUE(base::DeleteFile(path)); } -void SetupFakeUpdaterPrefs(UpdaterScope scope, const base::Version& version) { - scoped_refptr<GlobalPrefs> global_prefs = CreateGlobalPrefs(scope); - ASSERT_TRUE(global_prefs) << "No global prefs."; - global_prefs->SetActiveVersion(version.GetString()); - global_prefs->SetSwapping(false); - PrefsCommitPendingWrites(global_prefs->GetPrefService()); - - ASSERT_EQ(version.GetString(), global_prefs->GetActiveVersion()); -} - -void SetupFakeUpdaterInstallFolder(UpdaterScope scope, - const base::Version& version) { - absl::optional<base::FilePath> folder_path = - GetVersionedInstallDirectory(scope, version); - ASSERT_TRUE(folder_path); - ASSERT_TRUE(base::CreateDirectory( - folder_path->Append(GetExecutableRelativePath()).DirName())); -} - -void SetupFakeUpdater(UpdaterScope scope, const base::Version& version) { - SetupFakeUpdaterPrefs(scope, version); - SetupFakeUpdaterInstallFolder(scope, version); -} - -void SetupFakeUpdaterVersion(UpdaterScope scope, int offset) { - ASSERT_NE(offset, 0); - std::vector<uint32_t> components = - base::Version(kUpdaterVersion).components(); - base::CheckedNumeric<uint32_t> new_version = components[0]; - new_version += offset; - ASSERT_TRUE(new_version.AssignIfValid(&components[0])); - SetupFakeUpdater(scope, base::Version(std::move(components))); -} - void SetupFakeUpdaterLowerVersion(UpdaterScope scope) { - SetupFakeUpdaterVersion(scope, -1); + SetupFakeUpdaterVersion(scope, base::Version(kUpdaterVersion), + /*major_version_offset=*/-1, + /*should_create_updater_executable=*/false); } void SetupFakeUpdaterHigherVersion(UpdaterScope scope) { - SetupFakeUpdaterVersion(scope, 1); + SetupFakeUpdaterVersion(scope, base::Version(kUpdaterVersion), + /*major_version_offset=*/1, + /*should_create_updater_executable=*/false); } void SetExistenceCheckerPath(UpdaterScope scope,
diff --git a/chrome/updater/test/integration_tests_impl.h b/chrome/updater/test/integration_tests_impl.h index 10a88f9..8e6630f 100644 --- a/chrome/updater/test/integration_tests_impl.h +++ b/chrome/updater/test/integration_tests_impl.h
@@ -147,13 +147,6 @@ // Returns the path of the Updater executable. absl::optional<base::FilePath> GetInstalledExecutablePath(UpdaterScope scope); -// Creates Prefs with the fake updater version set as active. -void SetupFakeUpdaterPrefs(UpdaterScope scope, const base::Version& version); - -// Creates an install folder on the system with the fake updater version. -void SetupFakeUpdaterInstallFolder(UpdaterScope scope, - const base::Version& version); - // Sets up a fake updater on the system at a version lower than the test. void SetupFakeUpdaterLowerVersion(UpdaterScope scope);
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc index e7e99b8..64f70513 100644 --- a/chrome/updater/test/integration_tests_win.cc +++ b/chrome/updater/test/integration_tests_win.cc
@@ -1877,10 +1877,12 @@ } // Updater should have written "pv". - EXPECT_EQ(base::MakeRefCounted<PersistedData>( - scope, CreateGlobalPrefs(scope)->GetPrefService()) - ->GetProductVersion(base::WideToASCII(kTestAppID)), - kTestPV); + const base::Version pv = + base::MakeRefCounted<PersistedData>( + scope, CreateGlobalPrefs(scope)->GetPrefService()) + ->GetProductVersion(base::WideToASCII(kTestAppID)); + ASSERT_TRUE(pv.IsValid()); + EXPECT_EQ(pv, kTestPV); // App installer should have created the expected reg value. base::win::RegKey key;
diff --git a/chrome/updater/util/unittest_util.cc b/chrome/updater/util/unittest_util.cc index 845490568..e1e4ea3 100644 --- a/chrome/updater/util/unittest_util.cc +++ b/chrome/updater/util/unittest_util.cc
@@ -4,6 +4,7 @@ #include "chrome/updater/util/unittest_util.h" +#include <cstdint> #include <memory> #include <string> #include <utility> @@ -29,9 +30,11 @@ #include "base/test/test_timeouts.h" #include "base/threading/platform_thread.h" #include "base/time/time.h" +#include "base/version.h" #include "chrome/updater/constants.h" #include "chrome/updater/policy/manager.h" #include "chrome/updater/policy/service.h" +#include "chrome/updater/prefs.h" #include "chrome/updater/test_scope.h" #include "chrome/updater/updater_scope.h" #include "chrome/updater/util/util.h" @@ -121,6 +124,42 @@ std::unique_ptr<testing::TestEventListener> impl_; }; +// Creates Prefs with the fake updater version set as active. +void SetupFakeUpdaterPrefs(UpdaterScope scope, const base::Version& version) { + scoped_refptr<GlobalPrefs> global_prefs = CreateGlobalPrefs(scope); + ASSERT_TRUE(global_prefs) << "No global prefs."; + global_prefs->SetActiveVersion(version.GetString()); + global_prefs->SetSwapping(false); + PrefsCommitPendingWrites(global_prefs->GetPrefService()); + ASSERT_EQ(version.GetString(), global_prefs->GetActiveVersion()); +} + +// Creates an install folder on the system with the fake updater version. +void SetupFakeUpdaterInstallFolder(UpdaterScope scope, + const base::Version& version, + bool should_create_updater_executable) { + absl::optional<base::FilePath> folder_path = + GetVersionedInstallDirectory(scope, version); + ASSERT_TRUE(folder_path); + const base::FilePath updater_executable_path( + folder_path->Append(GetExecutableRelativePath())); + ASSERT_TRUE(base::CreateDirectory(updater_executable_path.DirName())); + + if (should_create_updater_executable) { + // Create a fake `updater.exe` inside the install folder. + ASSERT_TRUE(base::CopyFile(folder_path->DirName().AppendASCII("prefs.json"), + updater_executable_path)); + } +} + +void SetupFakeUpdater(UpdaterScope scope, + const base::Version& version, + bool should_create_updater_executable) { + SetupFakeUpdaterPrefs(scope, version); + SetupFakeUpdaterInstallFolder(scope, version, + should_create_updater_executable); +} + } // namespace const char kChromeAppId[] = "{8A69D345-D564-463C-AFF1-A69D9E530F96}"; @@ -429,4 +468,16 @@ .AppendASCII(file_name); } +void SetupFakeUpdaterVersion(UpdaterScope scope, + const base::Version& base_version, + int major_version_offset, + bool should_create_updater_executable) { + std::vector<uint32_t> components = base_version.components(); + base::CheckedNumeric<uint32_t> new_version = components[0]; + new_version += major_version_offset; + ASSERT_TRUE(new_version.AssignIfValid(&components[0])); + SetupFakeUpdater(scope, base::Version(std::move(components)), + should_create_updater_executable); +} + } // namespace updater::test
diff --git a/chrome/updater/util/unittest_util.h b/chrome/updater/util/unittest_util.h index bc02be4e..f96138d 100644 --- a/chrome/updater/util/unittest_util.h +++ b/chrome/updater/util/unittest_util.h
@@ -17,6 +17,7 @@ namespace base { class TimeDelta; +class Version; } // namespace base namespace updater { @@ -116,6 +117,14 @@ // file in that directory. [[nodiscard]] base::FilePath GetTestFilePath(const char* file_name); +// Sets up the official updater directory with global prefs, the versioned +// install folder (with a version of `base_version + major_version_offset`), and +// optionally, an empty updater executable in the versioned folder. +void SetupFakeUpdaterVersion(UpdaterScope scope, + const base::Version& base_version, + int major_version_offset, + bool should_create_updater_executable); + } // namespace updater::test #endif // CHROME_UPDATER_UTIL_UNITTEST_UTIL_H_
diff --git a/chrome/updater/win/win_constants.cc b/chrome/updater/win/win_constants.cc index 31278c7d..fbeeaed 100644 --- a/chrome/updater/win/win_constants.cc +++ b/chrome/updater/win/win_constants.cc
@@ -48,7 +48,7 @@ const wchar_t kRegKeyCompanyCloudManagement[] = COMPANY_POLICIES_KEY L"CloudManagement\\"; -const wchar_t kRegValueEnrollmentToken[] = L"EnrollmentToken\\"; +const wchar_t kRegValueEnrollmentToken[] = L"EnrollmentToken"; const wchar_t kRegValueEnrollmentMandatory[] = L"EnrollmentMandatory";
diff --git a/chromecast/base/BUILD.gn b/chromecast/base/BUILD.gn index 92ae6311d..1357586 100644 --- a/chromecast/base/BUILD.gn +++ b/chromecast/base/BUILD.gn
@@ -312,6 +312,7 @@ android_library("base_java") { java_src_dir = "//chromecast/base/java/src" + srcjar_deps = [ ":jni_headers" ] sources = [ "$java_src_dir/org/chromium/chromecast/base/Both.java", "$java_src_dir/org/chromium/chromecast/base/Box.java", @@ -340,7 +341,6 @@ "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/androidx:androidx_core_core_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } android_library("cast_base_test_utils_java") {
diff --git a/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc b/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc index f518a71..5b825a4 100644 --- a/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc +++ b/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc
@@ -93,6 +93,8 @@ } std::string LocalDeviceDataProviderImpl::GetDeviceName() const { + // TODO(b/283987579): When NP Settings page is implemented, check for any + // changes to the user set device name. std::u16string device_type = ui::GetChromeOSDeviceName(); const CoreAccountInfo account_info =
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc index fc8f2f5..3303b1e69 100644 --- a/components/autofill/core/browser/data_model/credit_card.cc +++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -590,8 +590,7 @@ return number_; case CREDIT_CARD_VERIFICATION_CODE: - // Chrome doesn't store credit card verification codes. - return std::u16string(); + return cvc_; default: // ComputeDataPresentForArray will hit this repeatedly. @@ -654,7 +653,11 @@ } case CREDIT_CARD_VERIFICATION_CODE: - // Chrome doesn't store the credit card verification code. + // network_ is default as kGenericCard, network_ will be set when setting + // card number. + if (IsValidCreditCardSecurityCode(value, network_)) { + cvc_ = value; + } break; default:
diff --git a/components/autofill/core/browser/data_model/credit_card_unittest.cc b/components/autofill/core/browser/data_model/credit_card_unittest.cc index 5524653..900322a 100644 --- a/components/autofill/core/browser/data_model/credit_card_unittest.cc +++ b/components/autofill/core/browser/data_model/credit_card_unittest.cc
@@ -1535,13 +1535,44 @@ EXPECT_EQ(u"Visa", card.GetRawInfo(CREDIT_CARD_TYPE)); } +// Verify that we preserve exactly what the user typed for CVC. TEST(CreditCardTest, CreditCardVerificationCode) { CreditCard card(base::Uuid::GenerateRandomV4().AsLowercaseString(), "https://www.example.com/"); - // The verification code cannot be set, as Chrome does not store this data. + // CVC for generic network is 3 digit string with number characters. card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"999"); - EXPECT_EQ(std::u16string(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"999", card.cvc()); + + // These should fail, and preserve the previous value. CVC for generic network + // is 3 digit string with number characters. + card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"0"); + EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"999", card.cvc()); + + card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"1"); + EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"999", card.cvc()); + + card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"9999"); + EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"999", card.cvc()); + + card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"12345"); + EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"999", card.cvc()); + + card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"ab15"); + EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"999", card.cvc()); + + // 15-digit Amex card number. + card.SetRawInfo(CREDIT_CARD_NUMBER, u"378282246310005"); + // CVC for Amex network is 4 digit string with number characters. + card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"9999"); + EXPECT_EQ(u"9999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE)); + EXPECT_EQ(u"9999", card.cvc()); } // Tests that the card in only deletable if it is expired before the threshold.
diff --git a/components/commerce/core/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc index a66f0d7..5d30acc 100644 --- a/components/commerce/core/commerce_feature_list.cc +++ b/components/commerce/core/commerce_feature_list.cc
@@ -184,6 +184,10 @@ base::FEATURE_DISABLED_BY_DEFAULT); #endif +BASE_FEATURE(kShoppingListTrackByDefault, + "ShoppingListTrackByDefault", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kShoppingPDPMetrics, "ShoppingPDPMetrics", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/commerce/core/commerce_feature_list.h b/components/commerce/core/commerce_feature_list.h index d0d2e69..642adb9b5 100644 --- a/components/commerce/core/commerce_feature_list.h +++ b/components/commerce/core/commerce_feature_list.h
@@ -93,6 +93,7 @@ BASE_DECLARE_FEATURE(kShoppingList); BASE_DECLARE_FEATURE(kShoppingListRegionLaunched); +BASE_DECLARE_FEATURE(kShoppingListTrackByDefault); BASE_DECLARE_FEATURE(kShoppingPDPMetrics); BASE_DECLARE_FEATURE(kShoppingPDPMetricsRegionLaunched); BASE_DECLARE_FEATURE(kRetailCoupons);
diff --git a/components/commerce/core/flag_descriptions.cc b/components/commerce/core/flag_descriptions.cc index a3d947a..56c0d5b 100644 --- a/components/commerce/core/flag_descriptions.cc +++ b/components/commerce/core/flag_descriptions.cc
@@ -18,6 +18,10 @@ const char kShoppingListName[] = "Shopping List"; const char kShoppingListDescription[] = "Enable shopping list in bookmarks."; +const char kShoppingListTrackByDefaultName[] = "Shopping List Track By Default"; +const char kShoppingListTrackByDefaultDescription[] = + "Bookmarked product pages are tracked by default if they can be."; + const char kChromeCartDomBasedHeuristicsName[] = "ChromeCart DOM-based heuristics"; const char kChromeCartDomBasedHeuristicsDescription[] =
diff --git a/components/commerce/core/flag_descriptions.h b/components/commerce/core/flag_descriptions.h index 6ce3561..c9ac9bf7 100644 --- a/components/commerce/core/flag_descriptions.h +++ b/components/commerce/core/flag_descriptions.h
@@ -19,6 +19,9 @@ extern const char kShoppingListName[]; extern const char kShoppingListDescription[]; +extern const char kShoppingListTrackByDefaultName[]; +extern const char kShoppingListTrackByDefaultDescription[]; + extern const char kChromeCartDomBasedHeuristicsName[]; extern const char kChromeCartDomBasedHeuristicsDescription[];
diff --git a/components/commerce_strings.grdp b/components/commerce_strings.grdp index 125eaeb..bab4bfc 100644 --- a/components/commerce_strings.grdp +++ b/components/commerce_strings.grdp
@@ -206,11 +206,16 @@ Typical Price </message> <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE" desc="The title name of the Price Tracking section in the Shopping Insights side panel."> - Save and Track price + Save and Track Price </message> - <!-- TODO(b/286097739): Update the string for the icon tooltip and remove the translateable attribute once strings are finalized --> - <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar." translateable="false"> - Price Insights For This Page + <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively low price."> + Price is Low + </message> + <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively high price."> + Price is High + </message> + <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar."> + Shopping Insights </message> </if> <!-- use_titlecase --> <if expr="not use_titlecase"> @@ -232,9 +237,14 @@ <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE" desc="The title name of the Price Tracking section in the Shopping Insights side panel."> Save and track price </message> - <!-- TODO(b/286097739): Update the string for the icon tooltip and remove the translateable attribute once strings are finalized --> - <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar." translateable="false"> - Price insights for this page + <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively low price."> + Price is low + </message> + <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively high price."> + Price is high + </message> + <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar."> + Shopping insights </message> </if> <!-- not use_titlecase --> @@ -280,6 +290,12 @@ <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DESCRIPTION" desc="The description of the Price Tracking section in the Shopping Insights side panel."> You'll get email alerts if the price drops on any site. </message> + <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE" desc="The description of the Price Tracking section in the Shopping Insights side panel when a user successfully tracks the product displayed on the current web page. It indicates this product is currently being tracked and which bookmarks folder it is saved."> + You’re tracking this product. This page is saved in <ph name="LAST_BOOKMARKS_FOLDER">$1<ex>Other Bookmarks</ex></ph>. + </message> + <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR" desc="The description of the Price Tracking section in the Shopping Insights side panel when a user failed to track the product displayed on the current web page."> + Something went wrong. Your change wasn't saved. + </message> </if> <!-- Android only -->
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE.png.sha1 new file mode 100644 index 0000000..f9e8ae96 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE.png.sha1
@@ -0,0 +1 @@ +c579bc6334f458ff098d5004656dc3762aac17c9 \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE.png.sha1 new file mode 100644 index 0000000..aeb417c --- /dev/null +++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE.png.sha1
@@ -0,0 +1 @@ +ece641279fd086812ff765a3fc0fd2fe248f8e15 \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1 index 31f72f29..ebded77 100644 --- a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1 +++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1
@@ -1 +1 @@ -4b6fc6e0b47f2158ddd9b393171a0aef34033939 \ No newline at end of file +f5ed254be19f398a2708d559ec4c7a6d10f23e73 \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE.png.sha1 new file mode 100644 index 0000000..27ec014e --- /dev/null +++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE.png.sha1
@@ -0,0 +1 @@ +27793ec7bb9cd9f0d505b431dfb1f6ea56f4a27b \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR.png.sha1 new file mode 100644 index 0000000..230b5d0 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR.png.sha1
@@ -0,0 +1 @@ +37cbbceef2fbeb291225743528fba8774df08f62 \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1 index 7e7df23..230b5d0 100644 --- a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1 +++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1
@@ -1 +1 @@ -490f22dd6df1e9da56ebaad3e3cf208babb4669e \ No newline at end of file +37cbbceef2fbeb291225743528fba8774df08f62 \ No newline at end of file
diff --git a/components/crash/android/BUILD.gn b/components/crash/android/BUILD.gn index 3c1d1ed..c68d1e8e 100644 --- a/components/crash/android/BUILD.gn +++ b/components/crash/android/BUILD.gn
@@ -30,8 +30,11 @@ "//content/public/android:content_main_dex_java", "//third_party/androidx:androidx_annotation_annotation_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - srcjar_deps = [ ":java_enums_srcjar" ] + + srcjar_deps = [ + ":java_enums_srcjar", + ":jni_headers", + ] sources = [ "java/src/org/chromium/components/crash/CustomAssertionHandler.java", "java/src/org/chromium/components/crash/LogcatCrashExtractor.java", @@ -99,7 +102,8 @@ "//base:jni_java", "//build/android:build_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + + srcjar_deps = [ ":java_handler_jni_headers" ] sources = _java_handler_jni_sources } @@ -140,7 +144,10 @@ "//build/android:build_java", "//third_party/androidx:androidx_annotation_annotation_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - srcjar_deps = [ ":anr_skipped_reason_enum" ] + + srcjar_deps = [ + ":anr_collector_jni_headers", + ":anr_skipped_reason_enum", + ] sources = _anr_collector_jni_sources }
diff --git a/components/desks_storage/core/desk_sync_bridge.cc b/components/desks_storage/core/desk_sync_bridge.cc index 35603bfb..866ed1d 100644 --- a/components/desks_storage/core/desk_sync_bridge.cc +++ b/components/desks_storage/core/desk_sync_bridge.cc
@@ -289,6 +289,7 @@ DeskModel::GetAllEntriesResult DeskSyncBridge::GetAllEntries() { if (!IsReady()) { + LOG(WARNING) << "Unable to get all entries: Not Ready"; return GetAllEntriesResult(GetAllEntriesStatus::kFailure, std::vector<const DeskTemplate*>()); } @@ -309,10 +310,12 @@ DeskModel::GetEntryByUuidResult DeskSyncBridge::GetEntryByUUID( const base::Uuid& uuid) { if (!IsReady()) { + LOG(WARNING) << "Unable to get entry by UUID: Not Ready"; return GetEntryByUuidResult(GetEntryByUuidStatus::kFailure, nullptr); } if (!uuid.is_valid()) { + LOG(WARNING) << "Unable to get entry by UUID: Invalid UUID"; return GetEntryByUuidResult(GetEntryByUuidStatus::kInvalidUuid, nullptr); } @@ -325,6 +328,7 @@ return GetEntryByUuidResult(GetEntryByUuidStatus::kOk, std::move(policy_entry)); } else { + LOG(WARNING) << "Unable to get entry by UUID: Entry not found"; return GetEntryByUuidResult(GetEntryByUuidStatus::kNotFound, nullptr); } } else { @@ -338,12 +342,14 @@ if (!IsReady()) { // This sync bridge has not finished initializing. Do not save the new entry // yet. + LOG(WARNING) << "Unable to add or update entry: Not Ready"; std::move(callback).Run(AddOrUpdateEntryStatus::kFailure, std::move(new_entry)); return; } if (!new_entry) { + LOG(WARNING) << "Unable to add or update entry: No new entry"; std::move(callback).Run(AddOrUpdateEntryStatus::kInvalidArgument, std::move(new_entry)); return; @@ -351,6 +357,7 @@ base::Uuid uuid = new_entry->uuid(); if (!uuid.is_valid()) { + LOG(WARNING) << "Unable to add or update entry: Invalid UUID"; std::move(callback).Run(AddOrUpdateEntryStatus::kInvalidArgument, std::move(new_entry)); return; @@ -374,6 +381,7 @@ RecordSavedDeskTemplateSizeHistogram(new_entry->type(), sync_proto.ByteSizeLong()); if (sync_proto.ByteSizeLong() > kMaxTemplateSize) { + LOG(WARNING) << "Unable to add or update entry: Entry is too large"; std::move(callback).Run(AddOrUpdateEntryStatus::kEntryTooLarge, std::move(new_entry)); return; @@ -405,6 +413,7 @@ if (!IsReady()) { // This sync bridge has not finished initializing. // Cannot delete anything. + LOG(WARNING) << "Unable to delete entry: Not Ready"; std::move(callback).Run(DeleteEntryStatus::kFailure); return; } @@ -439,6 +448,7 @@ if (!IsReady()) { // This sync bridge has not finished initializing. // Cannot delete anything. + LOG(WARNING) << "Unable to delete entries: Not Ready"; return DeleteEntryStatus::kFailure; }
diff --git a/components/desks_storage/core/local_desk_data_manager.cc b/components/desks_storage/core/local_desk_data_manager.cc index e8cf2d5..4d3e26b 100644 --- a/components/desks_storage/core/local_desk_data_manager.cc +++ b/components/desks_storage/core/local_desk_data_manager.cc
@@ -241,6 +241,7 @@ DeskModel::GetAllEntriesResult LocalDeskDataManager::GetAllEntries() { std::vector<const ash::DeskTemplate*> entries; if (cache_status_ != CacheStatus::kOk) { + LOG(WARNING) << "Unable to get all entries: Cache failure"; return GetAllEntriesResult(GetAllEntriesStatus::kFailure, std::move(entries)); } @@ -261,11 +262,13 @@ DeskModel::GetEntryByUuidResult LocalDeskDataManager::GetEntryByUUID( const base::Uuid& uuid) { if (cache_status_ != LocalDeskDataManager::CacheStatus::kOk) { + LOG(WARNING) << "Unable to get entry by UUID: Cache failure"; return DeskModel::GetEntryByUuidResult( DeskModel::GetEntryByUuidStatus::kFailure, nullptr); } if (!uuid.is_valid()) { + LOG(WARNING) << "Unable to get entry by UUID: Invalid UUID"; return DeskModel::GetEntryByUuidResult( DeskModel::GetEntryByUuidStatus::kInvalidUuid, nullptr); } @@ -282,6 +285,7 @@ return DeskModel::GetEntryByUuidResult( DeskModel::GetEntryByUuidStatus::kOk, std::move(policy_entry)); } else { + LOG(WARNING) << "Unable to get entry by UUID: Entry not found"; return DeskModel::GetEntryByUuidResult( DeskModel::GetEntryByUuidStatus::kNotFound, nullptr); } @@ -295,6 +299,7 @@ std::unique_ptr<ash::DeskTemplate> new_entry, AddOrUpdateEntryCallback callback) { if (cache_status_ != CacheStatus::kOk) { + LOG(WARNING) << "Unable to add or update entry: Cache failure"; std::move(callback).Run(AddOrUpdateEntryStatus::kFailure, std::move(new_entry)); return; @@ -303,6 +308,7 @@ const ash::DeskTemplateType desk_type = new_entry->type(); const base::Uuid uuid = new_entry->uuid(); if (!uuid.is_valid() || desk_type == ash::DeskTemplateType::kUnknown) { + LOG(WARNING) << "Unable to add or update entry: Invalid UUID or Desk Type"; std::move(callback).Run(AddOrUpdateEntryStatus::kInvalidArgument, std::move(new_entry)); return; @@ -310,6 +316,7 @@ size_t template_type_max_size = GetMaxEntryCountByDeskType(desk_type); if (!g_disable_max_template_limit && saved_desks_list_[desk_type].size() >= template_type_max_size) { + LOG(WARNING) << "Unable to add entry: Maximum Desk Limit Reached"; std::move(callback).Run(AddOrUpdateEntryStatus::kHitMaximumLimit, std::move(new_entry)); return; @@ -352,6 +359,7 @@ void LocalDeskDataManager::DeleteEntry(const base::Uuid& uuid, DeleteEntryCallback callback) { if (cache_status_ != CacheStatus::kOk) { + LOG(WARNING) << "Unable to delete entry: Cache failure"; std::move(callback).Run(DeleteEntryStatus::kFailure); return; } @@ -388,6 +396,7 @@ void LocalDeskDataManager::DeleteAllEntries(DeleteEntryCallback callback) { if (cache_status_ != CacheStatus::kOk) { + LOG(WARNING) << "Unable to delete entry: Cache failure"; std::move(callback).Run(DeleteEntryStatus::kFailure); return; } @@ -571,6 +580,7 @@ RecordSavedDeskTemplateSizeHistogram(desk_type, file_size); return AddOrUpdateEntryStatus::kOk; } + LOG(WARNING) << "Unable to add or update entry: Unable to write template file"; return AddOrUpdateEntryStatus::kFailure; } @@ -605,6 +615,7 @@ if (base::DeleteFile(fully_qualified_path)) { return {DeleteEntryStatus::kOk, std::move(roll_back_entry)}; } + LOG(WARNING) << "Unable to delete entry: File is not a qualified path"; return {DeleteEntryStatus::kFailure, std::move(roll_back_entry)}; } @@ -615,6 +626,7 @@ std::vector<std::unique_ptr<ash::DeskTemplate>> entries) { if (!base::DirReaderPosix(local_saved_desk_path.AsUTF8Unsafe().c_str()) .IsValid()) { + LOG(WARNING) << "Unable to delete all entries: Path is invalid"; return {DeleteEntryStatus::kFailure, std::move(entries)}; } DeleteEntryStatus overall_delete_successes = DeleteEntryStatus::kOk; @@ -631,6 +643,7 @@ *it = std::move(entries.back()); entries.pop_back(); } else { + LOG(WARNING) << "Unable to delete entry: File not successfully deleted."; overall_delete_successes = DeleteEntryStatus::kFailure; ++it; }
diff --git a/components/fuchsia_component_support/dynamic_component_host.cc b/components/fuchsia_component_support/dynamic_component_host.cc index 8268938..94f2b40 100644 --- a/components/fuchsia_component_support/dynamic_component_host.cc +++ b/components/fuchsia_component_support/dynamic_component_host.cc
@@ -7,6 +7,7 @@ #include <fuchsia/io/cpp/fidl.h> #include <lib/sys/cpp/component_context.h> #include <lib/sys/cpp/service_directory.h> +#include <lib/vfs/cpp/pseudo_dir.h> #include <lib/vfs/cpp/remote_dir.h> #include <memory>
diff --git a/components/messages/android/BUILD.gn b/components/messages/android/BUILD.gn index f32baef..a78594e 100644 --- a/components/messages/android/BUILD.gn +++ b/components/messages/android/BUILD.gn
@@ -14,6 +14,7 @@ "java/src/org/chromium/components/messages/MessageDispatcherBridge.java", "java/src/org/chromium/components/messages/MessageDispatcherProvider.java", "java/src/org/chromium/components/messages/MessageFeatureList.java", + "java/src/org/chromium/components/messages/MessageFeatureMap.java", "java/src/org/chromium/components/messages/MessageSecondaryMenuItems.java", "java/src/org/chromium/components/messages/MessageWrapper.java", "java/src/org/chromium/components/messages/MessagesMetrics.java", @@ -70,7 +71,7 @@ generate_jni("jni_headers") { sources = [ "java/src/org/chromium/components/messages/MessageDispatcherBridge.java", - "java/src/org/chromium/components/messages/MessageFeatureList.java", + "java/src/org/chromium/components/messages/MessageFeatureMap.java", "java/src/org/chromium/components/messages/MessageWrapper.java", ] }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java index e351657..10e87ac 100644 --- a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java +++ b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
@@ -4,33 +4,17 @@ package org.chromium.components.messages; -import org.chromium.base.FeatureList; -import org.chromium.base.annotations.JNINamespace; -import org.chromium.base.annotations.NativeMethods; - /** - * Provides an API for querying the status of Message features. + * Lists base::Features that can be accessed through {@link MessageFeatureMap}. + * + * Should be kept in sync with |kFeaturesExposedToJava| in + * //components/messages/android/messages_feature.cc */ -@JNINamespace("messages") -public class MessageFeatureList { +public abstract class MessageFeatureList { public static final String MESSAGES_FOR_ANDROID_STACKING_ANIMATION = "MessagesForAndroidStackingAnimation"; - private MessageFeatureList() {} - - public static boolean isEnabled(String featureName) { - Boolean testValue = FeatureList.getTestValueForFeature(featureName); - if (testValue != null) return testValue; - assert FeatureList.isNativeInitialized(); - return MessageFeatureListJni.get().isEnabled(featureName); - } - public static boolean isStackAnimationEnabled() { - return isEnabled(MESSAGES_FOR_ANDROID_STACKING_ANIMATION); - } - - @NativeMethods - interface Natives { - boolean isEnabled(String featureName); + return MessageFeatureMap.isEnabled(MESSAGES_FOR_ANDROID_STACKING_ANIMATION); } }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java new file mode 100644 index 0000000..483d71b7 --- /dev/null +++ b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java
@@ -0,0 +1,44 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.messages; + +import org.chromium.base.FeatureMap; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; + +/** + * Java accessor for base::Features listed in {@link MessageFeatureList} + */ +@JNINamespace("messages") +public final class MessageFeatureMap extends FeatureMap { + private static final MessageFeatureMap sInstance = new MessageFeatureMap(); + + // Do not instantiate this class. + private MessageFeatureMap() {} + + /** + * @return the singleton MessageFeatureMap. + */ + public static MessageFeatureMap getInstance() { + return sInstance; + } + + /** + * Convenience method to call {@link #isEnabledInNative(String)} statically. + */ + public static boolean isEnabled(String featureName) { + return getInstance().isEnabledInNative(featureName); + } + + @Override + protected long getNativeMap() { + return MessageFeatureMapJni.get().getNativeMap(); + } + + @NativeMethods + public interface Natives { + long getNativeMap(); + } +}
diff --git a/components/messages/android/messages_feature.cc b/components/messages/android/messages_feature.cc index 7a18ff39..f789639 100644 --- a/components/messages/android/messages_feature.cc +++ b/components/messages/android/messages_feature.cc
@@ -4,13 +4,11 @@ #include "components/messages/android/messages_feature.h" -#include "base/android/jni_string.h" +#include "base/android/feature_map.h" #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" -#include "components/messages/android/jni_headers/MessageFeatureList_jni.h" - -using base::android::ConvertJavaStringToUTF8; -using base::android::JavaParamRef; +#include "base/no_destructor.h" +#include "components/messages/android/jni_headers/MessageFeatureMap_jni.h" namespace messages { @@ -20,14 +18,11 @@ &kMessagesForAndroidStackingAnimation, }; -const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) { - for (const base::Feature* feature : kFeaturesExposedToJava) { - if (feature->name == feature_name) - return feature; - } - NOTREACHED() << "Queried feature not found in MessageFeatureList: " - << feature_name; - return nullptr; +// static +base::android::FeatureMap* GetFeatureMap() { + static base::NoDestructor<base::android::FeatureMap> kFeatureMap(std::vector( + std::begin(kFeaturesExposedToJava), std::end(kFeaturesExposedToJava))); + return kFeatureMap.get(); } } // namespace @@ -90,12 +85,8 @@ base::FeatureList::IsEnabled(kMessagesForAndroidStackingAnimation); } -static jboolean JNI_MessageFeatureList_IsEnabled( - JNIEnv* env, - const JavaParamRef<jstring>& jfeature_name) { - const base::Feature* feature = - FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name)); - return base::FeatureList::IsEnabled(*feature); +static jlong JNI_MessageFeatureMap_GetNativeMap(JNIEnv* env) { + return reinterpret_cast<jlong>(GetFeatureMap()); } } // namespace messages
diff --git a/components/omnibox/browser/vector_icons/http_chrome_refresh.icon b/components/omnibox/browser/vector_icons/http_chrome_refresh.icon index 5a01699..5e4f82b 100644 --- a/components/omnibox/browser/vector_icons/http_chrome_refresh.icon +++ b/components/omnibox/browser/vector_icons/http_chrome_refresh.icon
@@ -2,126 +2,49 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -CANVAS_DIMENSIONS, 32, -MOVE_TO, 14.8f, 22.67f, -H_LINE_TO, 17.27f, -V_LINE_TO, 14.67f, -H_LINE_TO, 14.8f, -V_LINE_TO, 22.67f, -CLOSE, -MOVE_TO, 16, 12.07f, -CUBIC_TO, 16.36f, 12.07f, 16.66f, 11.96f, 16.9f, 11.73f, -CUBIC_TO, 17.14f, 11.49f, 17.27f, 11.19f, 17.27f, 10.83f, -CUBIC_TO, 17.27f, 10.48f, 17.14f, 10.18f, 16.9f, 9.93f, -CUBIC_TO, 16.66f, 9.69f, 16.36f, 9.57f, 16, 9.57f, -CUBIC_TO, 15.64f, 9.57f, 15.34f, 9.69f, 15.1f, 9.93f, -CUBIC_TO, 14.86f, 10.18f, 14.73f, 10.48f, 14.73f, 10.83f, -CUBIC_TO, 14.73f, 11.19f, 14.86f, 11.49f, 15.1f, 11.73f, -CUBIC_TO, 15.34f, 11.96f, 15.64f, 12.07f, 16, 12.07f, -CLOSE, -MOVE_TO, 16, 29.33f, -CUBIC_TO, 14.16f, 29.33f, 12.42f, 28.99f, 10.8f, 28.3f, -CUBIC_TO, 9.18f, 27.59f, 7.77f, 26.63f, 6.57f, 25.43f, -CUBIC_TO, 5.37f, 24.23f, 4.41f, 22.82f, 3.7f, 21.2f, -CUBIC_TO, 3.01f, 19.58f, 2.67f, 17.84f, 2.67f, 16, -CUBIC_TO, 2.67f, 14.16f, 3.01f, 12.42f, 3.7f, 10.8f, -CUBIC_TO, 4.41f, 9.18f, 5.37f, 7.77f, 6.57f, 6.57f, -CUBIC_TO, 7.77f, 5.37f, 9.18f, 4.42f, 10.8f, 3.73f, -CUBIC_TO, 12.42f, 3.02f, 14.16f, 2.67f, 16, 2.67f, -CUBIC_TO, 17.84f, 2.67f, 19.58f, 3.02f, 21.2f, 3.73f, -CUBIC_TO, 22.82f, 4.42f, 24.23f, 5.37f, 25.43f, 6.57f, -CUBIC_TO, 26.63f, 7.77f, 27.58f, 9.18f, 28.27f, 10.8f, -CUBIC_TO, 28.98f, 12.42f, 29.33f, 14.16f, 29.33f, 16, -CUBIC_TO, 29.33f, 17.84f, 28.98f, 19.58f, 28.27f, 21.2f, -CUBIC_TO, 27.58f, 22.82f, 26.63f, 24.23f, 25.43f, 25.43f, -CUBIC_TO, 24.23f, 26.63f, 22.82f, 27.59f, 21.2f, 28.3f, -CUBIC_TO, 19.58f, 28.99f, 17.84f, 29.33f, 16, 29.33f, -CLOSE, -MOVE_TO, 16, 26.9f, -CUBIC_TO, 19.04f, 26.9f, 21.62f, 25.84f, 23.73f, 23.73f, -CUBIC_TO, 25.84f, 21.6f, 26.9f, 19.02f, 26.9f, 16, -CUBIC_TO, 26.9f, 12.96f, 25.84f, 10.38f, 23.73f, 8.27f, -CUBIC_TO, 21.62f, 6.16f, 19.04f, 5.1f, 16, 5.1f, -CUBIC_TO, 12.98f, 5.1f, 10.4f, 6.16f, 8.27f, 8.27f, -CUBIC_TO, 6.16f, 10.38f, 5.1f, 12.96f, 5.1f, 16, -CUBIC_TO, 5.1f, 19.02f, 6.16f, 21.6f, 8.27f, 23.73f, -CUBIC_TO, 10.4f, 25.84f, 12.98f, 26.9f, 16, 26.9f, -CLOSE, -NEW_PATH - -CANVAS_DIMENSIONS, 20, -MOVE_TO, 9.25f, 14, -H_LINE_TO, 10.75f, -V_LINE_TO, 9, -H_LINE_TO, 9.25f, -V_LINE_TO, 14, -CLOSE, -MOVE_TO, 10, 7.5f, -CUBIC_TO, 10.21f, 7.5f, 10.38f, 7.43f, 10.52f, 7.29f, -CUBIC_TO, 10.67f, 7.14f, 10.75f, 6.96f, 10.75f, 6.75f, -CUBIC_TO, 10.75f, 6.54f, 10.67f, 6.37f, 10.52f, 6.23f, -CUBIC_TO, 10.38f, 6.08f, 10.21f, 6, 10, 6, -CUBIC_TO, 9.79f, 6, 9.61f, 6.08f, 9.46f, 6.23f, -CUBIC_TO, 9.32f, 6.37f, 9.25f, 6.54f, 9.25f, 6.75f, -CUBIC_TO, 9.25f, 6.96f, 9.32f, 7.14f, 9.46f, 7.29f, -CUBIC_TO, 9.61f, 7.43f, 9.79f, 7.5f, 10, 7.5f, -CLOSE, -MOVE_TO, 10, 18, -CUBIC_TO, 8.9f, 18, 7.87f, 17.79f, 6.9f, 17.38f, -CUBIC_TO, 5.92f, 16.96f, 5.07f, 16.39f, 4.33f, 15.67f, -CUBIC_TO, 3.61f, 14.93f, 3.04f, 14.08f, 2.63f, 13.1f, -CUBIC_TO, 2.21f, 12.13f, 2, 11.1f, 2, 10, -CUBIC_TO, 2, 8.89f, 2.21f, 7.85f, 2.63f, 6.9f, -CUBIC_TO, 3.04f, 5.92f, 3.61f, 5.08f, 4.33f, 4.35f, -CUBIC_TO, 5.07f, 3.62f, 5.92f, 3.04f, 6.9f, 2.63f, -CUBIC_TO, 7.87f, 2.21f, 8.9f, 2, 10, 2, -CUBIC_TO, 11.11f, 2, 12.15f, 2.21f, 13.1f, 2.63f, -CUBIC_TO, 14.08f, 3.04f, 14.92f, 3.62f, 15.65f, 4.35f, -CUBIC_TO, 16.38f, 5.08f, 16.96f, 5.92f, 17.38f, 6.9f, -CUBIC_TO, 17.79f, 7.85f, 18, 8.89f, 18, 10, -CUBIC_TO, 18, 11.1f, 17.79f, 12.13f, 17.38f, 13.1f, -CUBIC_TO, 16.96f, 14.08f, 16.38f, 14.93f, 15.65f, 15.67f, -CUBIC_TO, 14.92f, 16.39f, 14.08f, 16.96f, 13.1f, 17.38f, -CUBIC_TO, 12.15f, 17.79f, 11.11f, 18, 10, 18, -CLOSE, -MOVE_TO, 10, 16.5f, -CUBIC_TO, 11.81f, 16.5f, 13.34f, 15.87f, 14.6f, 14.6f, -CUBIC_TO, 15.87f, 13.34f, 16.5f, 11.81f, 16.5f, 10, -CUBIC_TO, 16.5f, 8.19f, 15.87f, 6.66f, 14.6f, 5.4f, -CUBIC_TO, 13.34f, 4.13f, 11.81f, 3.5f, 10, 3.5f, -CUBIC_TO, 8.19f, 3.5f, 6.66f, 4.13f, 5.4f, 5.4f, -CUBIC_TO, 4.13f, 6.66f, 3.5f, 8.19f, 3.5f, 10, -CUBIC_TO, 3.5f, 11.81f, 4.13f, 13.34f, 5.4f, 14.6f, -CUBIC_TO, 6.66f, 15.87f, 8.19f, 16.5f, 10, 16.5f, -CLOSE, -NEW_PATH - - CANVAS_DIMENSIONS, 16, -MOVE_TO, 8, 1, -CUBIC_TO, 4.13f, 1, 1, 4.13f, 1, 8, -CUBIC_TO, 1, 11.87f, 4.13f, 15, 8, 15, -CUBIC_TO, 11.87f, 15, 15, 11.87f, 15, 8, -CUBIC_TO, 15, 4.13f, 11.87f, 1, 8, 1, +MOVE_TO, 7.26f, 11.34f, +R_H_LINE_TO, 1.48f, +V_LINE_TO, 7.2f, +H_LINE_TO, 7.26f, CLOSE, -MOVE_TO, 8, 13.5f, -CUBIC_TO, 4.97f, 13.5f, 2.5f, 11.03f, 2.5f, 8, -CUBIC_TO, 2.5f, 4.97f, 4.97f, 2.5f, 8, 2.5f, -CUBIC_TO, 11.03f, 2.5f, 13.5f, 4.97f, 13.5f, 8, -CUBIC_TO, 13.5f, 11.03f, 11.03f, 13.5f, 8, 13.5f, +R_MOVE_TO, 0.74f, -5.15f, +R_CUBIC_TO, 0.22f, 0, 0.41f, -0.07f, 0.56f, -0.23f, +R_ARC_TO, 0.75f, 0.75f, 0, 0, 0, 0.23f, -0.56f, +R_ARC_TO, 0.76f, 0.76f, 0, 0, 0, -0.23f, -0.56f, +R_ARC_TO, 0.75f, 0.75f, 0, 0, 0, -0.56f, -0.23f, +R_ARC_TO, 0.78f, 0.78f, 0, 0, 0, -0.79f, 0.78f, +R_ARC_TO, 0.78f, 0.78f, 0, 0, 0, 0.79f, 0.79f, CLOSE, -NEW_PATH, -MOVE_TO, 8.75f, 7.5f, -H_LINE_TO, 7.25f, -V_LINE_TO, 11.5f, -H_LINE_TO, 8.75f, -V_LINE_TO, 7.5f, +R_MOVE_TO, 0.01f, 8.53f, +R_CUBIC_TO, -0.93f, 0, -1.8f, -0.17f, -2.62f, -0.52f, +R_ARC_TO, 6.67f, 6.67f, 0, 0, 1, -2.14f, -1.44f, +R_ARC_TO, 6.7f, 6.7f, 0, 0, 1, -1.44f, -2.14f, +R_ARC_TO, 6.56f, 6.56f, 0, 0, 1, -0.52f, -2.62f, +R_CUBIC_TO, 0, -0.93f, 0.17f, -1.8f, 0.52f, -2.62f, +R_ARC_TO, 6.71f, 6.71f, 0, 0, 1, 1.44f, -2.13f, +R_ARC_TO, 6.7f, 6.7f, 0, 0, 1, 2.14f, -1.44f, +R_ARC_TO, 6.56f, 6.56f, 0, 0, 1, 2.63f, -0.52f, +R_CUBIC_TO, 0.93f, 0, 1.81f, 0.17f, 2.62f, 0.52f, +R_CUBIC_TO, 0.81f, 0.35f, 1.52f, 0.83f, 2.13f, 1.44f, +R_ARC_TO, 6.68f, 6.68f, 0, 0, 1, 1.44f, 2.13f, +R_CUBIC_TO, 0.35f, 0.81f, 0.52f, 1.68f, 0.52f, 2.62f, +R_CUBIC_TO, 0, 0.93f, -0.17f, 1.81f, -0.52f, 2.62f, +R_ARC_TO, 6.67f, 6.67f, 0, 0, 1, -1.44f, 2.14f, +R_ARC_TO, 6.68f, 6.68f, 0, 0, 1, -2.13f, 1.44f, +R_ARC_TO, 6.51f, 6.51f, 0, 0, 1, -2.62f, 0.52f, CLOSE, -NEW_PATH, -MOVE_TO, 8, 6, -CUBIC_TO, 8.41f, 6, 8.75f, 5.66f, 8.75f, 5.25f, -CUBIC_TO, 8.75f, 4.84f, 8.41f, 4.5f, 8, 4.5f, -CUBIC_TO, 7.59f, 4.5f, 7.25f, 4.84f, 7.25f, 5.25f, -CUBIC_TO, 7.25f, 5.66f, 7.59f, 6, 8, 6, +MOVE_TO, 8, 13.09f, +R_CUBIC_TO, 1.42f, 0, 2.62f, -0.49f, 3.61f, -1.48f, +R_CUBIC_TO, 0.98f, -0.99f, 1.48f, -2.19f, 1.48f, -3.61f, +R_CUBIC_TO, 0, -1.42f, -0.49f, -2.62f, -1.48f, -3.61f, +CUBIC_TO, 10.62f, 3.41f, 9.42f, 2.92f, 8, 2.92f, +R_CUBIC_TO, -1.42f, 0, -2.62f, 0.49f, -3.61f, 1.48f, +CUBIC_TO, 3.41f, 5.38f, 2.92f, 6.58f, 2.92f, 8, +R_CUBIC_TO, 0, 1.42f, 0.49f, 2.62f, 1.48f, 3.61f, +R_CUBIC_TO, 0.99f, 0.98f, 2.19f, 1.48f, 3.61f, 1.48f, CLOSE, -NEW_PATH +MOVE_TO, 8, 8, +CLOSE, +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/components/omnibox/browser/vector_icons/product_chrome_refresh.icon b/components/omnibox/browser/vector_icons/product_chrome_refresh.icon index 6f6ada3..4996e24c 100644 --- a/components/omnibox/browser/vector_icons/product_chrome_refresh.icon +++ b/components/omnibox/browser/vector_icons/product_chrome_refresh.icon
@@ -2,100 +2,48 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -CANVAS_DIMENSIONS, 32, -MOVE_TO, 10.67f, 16.1f, -CUBIC_TO, 10.67f, 17.57f, 11.19f, 18.82f, 12.23f, 19.87f, -CUBIC_TO, 13.28f, 20.91f, 14.53f, 21.43f, 16, 21.43f, -CUBIC_TO, 17.47f, 21.43f, 18.72f, 20.91f, 19.77f, 19.87f, -CUBIC_TO, 20.81f, 18.82f, 21.33f, 17.57f, 21.33f, 16.1f, -CUBIC_TO, 21.33f, 14.63f, 20.81f, 13.38f, 19.77f, 12.33f, -CUBIC_TO, 18.72f, 11.29f, 17.47f, 10.77f, 16, 10.77f, -CUBIC_TO, 14.53f, 10.77f, 13.28f, 11.29f, 12.23f, 12.33f, -CUBIC_TO, 11.19f, 13.38f, 10.67f, 14.63f, 10.67f, 16.1f, -CLOSE, -MOVE_TO, 16, 24.1f, -CUBIC_TO, 16.29f, 24.1f, 16.57f, 24.09f, 16.83f, 24.07f, -CUBIC_TO, 17.1f, 24.04f, 17.37f, 24, 17.63f, 23.93f, -LINE_TO, 14.5f, 29.33f, -CUBIC_TO, 11.14f, 28.96f, 8.33f, 27.52f, 6.07f, 25.03f, -CUBIC_TO, 3.8f, 22.52f, 2.67f, 19.54f, 2.67f, 16.1f, -CUBIC_TO, 2.67f, 15.17f, 2.76f, 14.27f, 2.93f, 13.4f, -CUBIC_TO, 3.11f, 12.51f, 3.38f, 11.67f, 3.73f, 10.87f, -LINE_TO, 9.07f, 20.1f, -CUBIC_TO, 9.76f, 21.3f, 10.71f, 22.27f, 11.93f, 23, -CUBIC_TO, 13.16f, 23.73f, 14.51f, 24.1f, 16, 24.1f, -CLOSE, -MOVE_TO, 16, 8.1f, -CUBIC_TO, 14.22f, 8.1f, 12.64f, 8.62f, 11.27f, 9.67f, -CUBIC_TO, 9.89f, 10.69f, 8.93f, 12, 8.4f, 13.6f, -LINE_TO, 5.27f, 8.2f, -CUBIC_TO, 6.49f, 6.56f, 8.02f, 5.24f, 9.87f, 4.27f, -CUBIC_TO, 11.73f, 3.27f, 13.78f, 2.77f, 16, 2.77f, -CUBIC_TO, 18.2f, 2.77f, 20.22f, 3.26f, 22.07f, 4.23f, -CUBIC_TO, 23.91f, 5.19f, 25.44f, 6.48f, 26.67f, 8.1f, -H_LINE_TO, 16, -CLOSE, -MOVE_TO, 28.2f, 10.77f, -CUBIC_TO, 28.58f, 11.59f, 28.86f, 12.44f, 29.03f, 13.33f, -CUBIC_TO, 29.23f, 14.22f, 29.33f, 15.14f, 29.33f, 16.1f, -CUBIC_TO, 29.33f, 19.54f, 28.2f, 22.51f, 25.93f, 25, -CUBIC_TO, 23.69f, 27.49f, 20.91f, 28.93f, 17.6f, 29.33f, -LINE_TO, 22.93f, 20.1f, -CUBIC_TO, 23.27f, 19.52f, 23.52f, 18.9f, 23.7f, 18.23f, -CUBIC_TO, 23.9f, 17.54f, 24, 16.83f, 24, 16.1f, -CUBIC_TO, 24, 15.06f, 23.81f, 14.09f, 23.43f, 13.2f, -CUBIC_TO, 23.08f, 12.29f, 22.58f, 11.48f, 21.93f, 10.77f, -H_LINE_TO, 28.2f, -CLOSE, -NEW_PATH - - - CANVAS_DIMENSIONS, 16, -MOVE_TO, 5.25f, 8, -CUBIC_TO, 5.25f, 8.76f, 5.52f, 9.4f, 6.06f, 9.94f, -CUBIC_TO, 6.6f, 10.48f, 7.25f, 10.75f, 8, 10.75f, -CUBIC_TO, 8.75f, 10.75f, 9.4f, 10.48f, 9.94f, 9.94f, -CUBIC_TO, 10.48f, 9.4f, 10.75f, 8.75f, 10.75f, 8, -CUBIC_TO, 10.75f, 7.25f, 10.48f, 6.6f, 9.94f, 6.06f, -CUBIC_TO, 9.4f, 5.52f, 8.75f, 5.25f, 8, 5.25f, -CUBIC_TO, 7.25f, 5.25f, 6.6f, 5.52f, 6.06f, 6.06f, -CUBIC_TO, 5.52f, 6.6f, 5.25f, 7.25f, 5.25f, 8, +MOVE_TO, 5.38f, 8.02f, +R_CUBIC_TO, 0, 0.74f, 0.25f, 1.36f, 0.76f, 1.87f, +R_CUBIC_TO, 0.51f, 0.51f, 1.13f, 0.76f, 1.86f, 0.76f, +R_CUBIC_TO, 0.73f, 0, 1.36f, -0.25f, 1.86f, -0.76f, +R_CUBIC_TO, 0.5f, -0.51f, 0.76f, -1.13f, 0.76f, -1.87f, +R_CUBIC_TO, 0, -0.73f, -0.25f, -1.36f, -0.76f, -1.86f, +R_CUBIC_TO, -0.51f, -0.51f, -1.13f, -0.76f, -1.86f, -0.76f, +R_CUBIC_TO, -0.73f, 0, -1.35f, 0.25f, -1.86f, 0.76f, +R_CUBIC_TO, -0.51f, 0.51f, -0.76f, 1.13f, -0.76f, 1.86f, CLOSE, -MOVE_TO, 8, 12.25f, -CUBIC_TO, 8.15f, 12.25f, 8.3f, 12.25f, 8.44f, 12.23f, -CUBIC_TO, 8.58f, 12.22f, 8.72f, 12.19f, 8.86f, 12.16f, -LINE_TO, 7.22f, 15, -CUBIC_TO, 5.46f, 14.8f, 3.98f, 14.05f, 2.79f, 12.74f, -CUBIC_TO, 1.6f, 11.42f, 1, 9.86f, 1, 8.05f, -CUBIC_TO, 1, 7.56f, 1.05f, 7.09f, 1.14f, 6.63f, -CUBIC_TO, 1.23f, 6.16f, 1.37f, 5.72f, 1.56f, 5.3f, -LINE_TO, 4.36f, 10.15f, -CUBIC_TO, 4.72f, 10.78f, 5.22f, 11.29f, 5.86f, 11.67f, -CUBIC_TO, 6.5f, 12.05f, 7.21f, 12.25f, 8, 12.25f, +MOVE_TO, 8, 11.97f, +R_CUBIC_TO, 0.13f, 0, 0.26f, 0, 0.4f, -0.01f, +R_CUBIC_TO, 0.14f, -0.01f, 0.28f, -0.03f, 0.41f, -0.06f, +R_LINE_TO, -1.76f, 3.04f, +R_CUBIC_TO, -1.75f, -0.19f, -3.18f, -0.95f, -4.32f, -2.27f, +R_CUBIC_TO, -1.14f, -1.32f, -1.71f, -2.87f, -1.71f, -4.64f, +R_CUBIC_TO, 0, -0.52f, 0.06f, -1.03f, 0.18f, -1.52f, +R_CUBIC_TO, 0.11f, -0.5f, 0.28f, -0.99f, 0.51f, -1.47f, +R_LINE_TO, 2.9f, 4.96f, +R_CUBIC_TO, 0.34f, 0.62f, 0.82f, 1.1f, 1.42f, 1.45f, +ARC_TO, 3.85f, 3.85f, 0, 0, 0, 8, 11.96f, CLOSE, -MOVE_TO, 8, 3.85f, -CUBIC_TO, 7.07f, 3.85f, 6.24f, 4.12f, 5.52f, 4.67f, -CUBIC_TO, 4.8f, 5.21f, 4.29f, 5.9f, 4.01f, 6.74f, -LINE_TO, 2.36f, 3.9f, -CUBIC_TO, 3, 3.04f, 3.81f, 2.35f, 4.78f, 1.83f, -CUBIC_TO, 5.76f, 1.3f, 6.83f, 1.04f, 8, 1.04f, -CUBIC_TO, 9.17f, 1.04f, 10.22f, 1.3f, 11.19f, 1.81f, -CUBIC_TO, 12.16f, 2.31f, 12.96f, 2.99f, 13.61f, 3.84f, -H_LINE_TO, 8.01f, -LINE_TO, 8, 3.85f, +R_MOVE_TO, 0, -7.9f, +R_ARC_TO, 3.74f, 3.74f, 0, 0, 0, -2.32f, 0.77f, +ARC_TO, 3.94f, 3.94f, 0, 0, 0, 4.27f, 6.81f, +LINE_TO, 2.5f, 3.75f, +ARC_TO, 6.55f, 6.55f, 0, 0, 1, 4.91f, 1.75f, +ARC_TO, 6.91f, 6.91f, 0, 0, 1, 8, 1.04f, +R_CUBIC_TO, 1.15f, 0, 2.23f, 0.27f, 3.24f, 0.81f, +R_ARC_TO, 6.95f, 6.95f, 0, 0, 1, 2.49f, 2.22f, CLOSE, -MOVE_TO, 14.41f, 5.25f, -CUBIC_TO, 14.61f, 5.68f, 14.75f, 6.13f, 14.85f, 6.6f, -CUBIC_TO, 14.95f, 7.07f, 15.01f, 7.55f, 15.01f, 8.05f, -CUBIC_TO, 15.01f, 9.86f, 14.42f, 11.42f, 13.22f, 12.72f, -CUBIC_TO, 12.04f, 14.03f, 10.58f, 14.78f, 8.85f, 14.99f, -LINE_TO, 11.65f, 10.14f, -CUBIC_TO, 11.83f, 9.84f, 11.96f, 9.51f, 12.05f, 9.16f, -CUBIC_TO, 12.15f, 8.8f, 12.21f, 8.42f, 12.21f, 8.04f, -CUBIC_TO, 12.21f, 7.49f, 12.11f, 6.98f, 11.91f, 6.52f, -CUBIC_TO, 11.72f, 6.04f, 11.46f, 5.62f, 11.12f, 5.24f, -H_LINE_TO, 14.41f, -V_LINE_TO, 5.25f, +R_MOVE_TO, 6.46f, 1.33f, +R_CUBIC_TO, 0.18f, 0.43f, 0.31f, 0.86f, 0.4f, 1.3f, +R_CUBIC_TO, 0.08f, 0.44f, 0.13f, 0.88f, 0.13f, 1.33f, +R_CUBIC_TO, 0, 1.86f, -0.61f, 3.44f, -1.81f, 4.72f, +R_CUBIC_TO, -1.21f, 1.29f, -2.75f, 2.03f, -4.62f, 2.23f, +R_LINE_TO, 2.84f, -4.98f, +R_CUBIC_TO, 0.17f, -0.31f, 0.3f, -0.63f, 0.41f, -0.95f, +R_CUBIC_TO, 0.1f, -0.32f, 0.15f, -0.66f, 0.15f, -1.01f, +R_CUBIC_TO, 0, -0.49f, -0.09f, -0.96f, -0.27f, -1.41f, +R_CUBIC_TO, -0.18f, -0.45f, -0.43f, -0.85f, -0.75f, -1.22f, CLOSE, -NEW_PATH +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon b/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon index 71dbfaf..ae6674a 100644 --- a/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon +++ b/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon
@@ -3,35 +3,55 @@ // found in the LICENSE file. CANVAS_DIMENSIONS, 16, -MOVE_TO, 14, 5.75f, -R_V_LINE_TO, -1.5f, -H_LINE_TO, 8.5f, -R_V_LINE_TO, 1.5f, -H_LINE_TO, 14, +MOVE_TO, 11.55f, 13.52f, +R_ARC_TO, 2.27f, 2.27f, 0, 0, 1, -1.68f, -0.69f, +R_ARC_TO, 2.29f, 2.29f, 0, 0, 1, -0.69f, -1.68f, +R_CUBIC_TO, 0, -0.66f, 0.23f, -1.22f, 0.7f, -1.68f, +R_ARC_TO, 2.3f, 2.3f, 0, 0, 1, 1.68f, -0.69f, +R_CUBIC_TO, 0.66f, 0, 1.22f, 0.23f, 1.68f, 0.69f, +R_CUBIC_TO, 0.46f, 0.46f, 0.69f, 1.02f, 0.69f, 1.68f, +R_ARC_TO, 2.27f, 2.27f, 0, 0, 1, -0.69f, 1.68f, +R_CUBIC_TO, -0.46f, 0.46f, -1.02f, 0.69f, -1.68f, 0.69f, CLOSE, -R_MOVE_TO, -12, 4.5f, -R_V_LINE_TO, 1.5f, -R_H_LINE_TO, 5.5f, -R_V_LINE_TO, -1.5f, -H_LINE_TO, 2, +R_MOVE_TO, 0, -1.45f, +R_CUBIC_TO, 0.25f, 0, 0.47f, -0.09f, 0.65f, -0.27f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, 0.27f, -0.64f, +R_ARC_TO, 0.89f, 0.89f, 0, 0, 0, -0.27f, -0.65f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, -0.27f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, 0.27f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.26f, 0.64f, +R_CUBIC_TO, 0, 0.25f, 0.09f, 0.47f, 0.27f, 0.65f, +R_CUBIC_TO, 0.18f, 0.18f, 0.4f, 0.27f, 0.65f, 0.27f, CLOSE, -MOVE_TO, 4.5f, 4, -R_CUBIC_TO, 0.55f, 0, 1, 0.45f, 1, 1, -R_CUBIC_TO, 0, 0.55f, -0.45f, 1, -1, 1, -R_CUBIC_TO, -0.55f, 0, -1, -0.45f, -1, -1, -R_CUBIC_TO, 0, -0.55f, 0.45f, -1, 1, -1, +R_MOVE_TO, -9.47f, -0.1f, +R_V_LINE_TO, -1.63f, +H_LINE_TO, 7.98f, +R_V_LINE_TO, 1.63f, CLOSE, -R_MOVE_TO, 0, -1.5f, -R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, 5, -R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, -5, +R_MOVE_TO, 2.37f, -4.75f, +R_ARC_TO, 2.27f, 2.27f, 0, 0, 1, -1.67f, -0.69f, +R_ARC_TO, 2.29f, 2.29f, 0, 0, 1, -0.69f, -1.68f, +R_CUBIC_TO, 0, -0.66f, 0.23f, -1.22f, 0.7f, -1.68f, +R_ARC_TO, 2.3f, 2.3f, 0, 0, 1, 1.68f, -0.69f, +R_CUBIC_TO, 0.66f, 0, 1.22f, 0.23f, 1.68f, 0.69f, +R_CUBIC_TO, 0.46f, 0.46f, 0.69f, 1.02f, 0.69f, 1.68f, +R_CUBIC_TO, 0, 0.66f, -0.23f, 1.22f, -0.69f, 1.68f, +R_CUBIC_TO, -0.46f, 0.46f, -1.02f, 0.69f, -1.68f, 0.69f, CLOSE, -R_MOVE_TO, 7, 7.5f, -R_CUBIC_TO, 0.55f, 0, 1, 0.45f, 1, 1, -R_CUBIC_TO, 0, 0.55f, -0.45f, 1, -1, 1, -R_CUBIC_TO, -0.55f, 0, -1, -0.45f, -1, -1, -R_CUBIC_TO, 0, -0.55f, 0.45f, -1, 1, -1, +R_MOVE_TO, 0, -1.46f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, 0.65f, -0.27f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, 0.27f, -0.64f, +R_ARC_TO, 0.89f, 0.89f, 0, 0, 0, -0.26f, -0.65f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, -0.27f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, 0.27f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.27f, 0.65f, +R_CUBIC_TO, 0, 0.25f, 0.09f, 0.47f, 0.27f, 0.65f, +R_CUBIC_TO, 0.18f, 0.18f, 0.39f, 0.27f, 0.65f, 0.27f, CLOSE, -R_MOVE_TO, 0, -1.5f, -R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, 5, -R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, -5, -CLOSE \ No newline at end of file +R_MOVE_TO, 3.57f, -0.1f, +V_LINE_TO, 4.03f, +R_H_LINE_TO, 5.9f, +R_V_LINE_TO, 1.63f, +CLOSE, +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc index f7308f3f..41cac00 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc
@@ -5,6 +5,7 @@ #include "components/segmentation_platform/internal/data_collection/training_data_collector_impl.h" #include <cstdint> +#include "base/containers/contains.h" #include "base/functional/callback_helpers.h" #include "base/logging.h" #include "base/metrics/metrics_hashes.h" @@ -208,8 +209,12 @@ segment.first); } else if (feature.type() == proto::SignalType::HISTOGRAM_VALUE || feature.type() == proto::SignalType::HISTOGRAM_ENUM) { + std::vector<int> enum_ids; + for (int j = 0; j < feature.enum_ids_size(); j++) { + enum_ids.emplace_back(feature.enum_ids(j)); + } immediate_trigger_histograms_[feature.name_hash()].emplace( - segment.first); + std::make_pair(segment.first, enum_ids)); } } } @@ -233,12 +238,20 @@ param->output_metric_hash = hash; param->output_value = static_cast<float>(sample); for (auto segment : segments) { - // TODO (ritikagup@) : Add handling for default models, if required. - segment_info_database_->GetSegmentInfo( - segment, proto::ModelSource::SERVER_MODEL_SOURCE, - base::BindOnce( - &TrainingDataCollectorImpl::OnUmaUpdatedReportForSegmentInfo, - weak_ptr_factory_.GetWeakPtr(), param)); + auto segment_id = segment.first; + auto accepted_enum_ids = segment.second; + + // Process both enum histograms with their corresponding accepted enum ids + // and value histograms with no enum ids. + if (accepted_enum_ids.empty() || + base::Contains(accepted_enum_ids, sample)) { + // TODO (ritikagup@) : Add handling for default models, if required. + segment_info_database_->GetSegmentInfo( + segment_id, proto::ModelSource::SERVER_MODEL_SOURCE, + base::BindOnce( + &TrainingDataCollectorImpl::OnUmaUpdatedReportForSegmentInfo, + weak_ptr_factory_.GetWeakPtr(), param)); + } } } }
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h index d8854bd4..572dd6a 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h
@@ -169,8 +169,10 @@ base::flat_map<uint64_t, base::flat_set<proto::SegmentId>> immediate_collection_histograms_; - // Hash of histograms for trigger based training data collection. - base::flat_map<uint64_t, base::flat_set<proto::SegmentId>> + // Hash of histograms and their corresponding accepted enum ids for trigger + // based training data collection. + base::flat_map<uint64_t, + base::flat_set<std::pair<proto::SegmentId, std::vector<int>>>> immediate_trigger_histograms_; // Hash of user actions for trigger based training data collection.
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc index eeff40d..e7808d00 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc
@@ -221,7 +221,8 @@ uma_trigger->mutable_uma_trigger()->mutable_uma_feature(); uma_feature->set_name(kHistogramName0); uma_feature->set_name_hash(base::HashMetricName(kHistogramName0)); - uma_feature->set_type(proto::SignalType::HISTOGRAM_VALUE); + uma_feature->set_type(proto::SignalType::HISTOGRAM_ENUM); + uma_feature->add_enum_ids(kSample); } else if (type == kPeriodicDecisionType) { // Add a uma feature output based on |kHistogramName0| if trigger type is // PERIODIC. @@ -316,6 +317,20 @@ SegmentationUkmHelper::FloatToInt64(3.f)}); } + void ExpectResult1UkmWithSample(int sample) { + ExpectUkm({Segmentation_ModelExecution::kOptimizationTargetName, + Segmentation_ModelExecution::kModelVersionName, + Segmentation_ModelExecution::kInput0Name, + Segmentation_ModelExecution::kActualResultName, + Segmentation_ModelExecution::kActualResult2Name, + Segmentation_ModelExecution::kActualResult3Name}, + {kTestOptimizationTarget0, kModelVersion, + SegmentationUkmHelper::FloatToInt64(1.f), + SegmentationUkmHelper::FloatToInt64(2.f), + SegmentationUkmHelper::FloatToInt64(3.f), + SegmentationUkmHelper::FloatToInt64(sample)}); + } + // TODO(xingliu): Share this test code with SegmentationUkmHelperTest, or test // with mock SegmentationUkmHelperTest. void ExpectUkm(std::vector<base::StringPiece> metric_names, @@ -650,7 +665,7 @@ // Tests that if uma histogram trigger is set, collection will happen when the // trigger histogram is observed. -TEST_F(TrainingDataCollectorImplTest, DataCollectionWithUMATrigger) { +TEST_F(TrainingDataCollectorImplTest, DataCollectionWithEnumHistogramTrigger) { constexpr base::TimeDelta kTriggerDuration = base::Seconds(10); base::Time current = clock()->Now(); SetupFeatureProcessorResult(kTestOptimizationTarget0, current, @@ -669,9 +684,14 @@ clock()->Advance(kTriggerDuration); ExpectUkmCount(0u); + // Expect to not trigger output collection if histogram is hit with an + // unlisted enum id. + collector()->OnHistogramSignalUpdated(kHistogramName0, 0); + ExpectUkmCount(0u); + // Trigger output collection and ukm data recording. WaitForHistogramSignalUpdated(kHistogramName0, kSample); - ExpectResult1Ukm(); + ExpectResult1UkmWithSample(kSample); } // Tests that if uma user action trigger is set, collection will happen when the @@ -772,15 +792,7 @@ // Trigger output collection and ukm data recording. run_loop.Run(); ExpectUkmCount(1u); - ExpectUkm({Segmentation_ModelExecution::kOptimizationTargetName, - Segmentation_ModelExecution::kModelVersionName, - Segmentation_ModelExecution::kInput0Name, - Segmentation_ModelExecution::kActualResultName, - Segmentation_ModelExecution::kActualResult2Name}, - {kTestOptimizationTarget0, kModelVersion, - SegmentationUkmHelper::FloatToInt64(1.f), - SegmentationUkmHelper::FloatToInt64(2.f), - SegmentationUkmHelper::FloatToInt64(3.f)}); + ExpectResult1Ukm(); } TEST_F(TrainingDataCollectorImplTest, DataCollectionWithStoreToDisk) { @@ -842,17 +854,7 @@ base::DoNothing()); run_loop.Run(); ExpectUkmCount(1u); - ExpectUkm({Segmentation_ModelExecution::kOptimizationTargetName, - Segmentation_ModelExecution::kModelVersionName, - Segmentation_ModelExecution::kInput0Name, - Segmentation_ModelExecution::kActualResultName, - Segmentation_ModelExecution::kActualResult2Name, - Segmentation_ModelExecution::kActualResult3Name}, - {kTestOptimizationTarget0, kModelVersion, - SegmentationUkmHelper::FloatToInt64(1.f), - SegmentationUkmHelper::FloatToInt64(2.f), - SegmentationUkmHelper::FloatToInt64(3.f), - SegmentationUkmHelper::FloatToInt64(kSample)}); + ExpectResult1UkmWithSample(kSample); } } // namespace
diff --git a/components/services/app_service/public/cpp/instance_registry.cc b/components/services/app_service/public/cpp/instance_registry.cc index ad0605c..4609cea 100644 --- a/components/services/app_service/public/cpp/instance_registry.cc +++ b/components/services/app_service/public/cpp/instance_registry.cc
@@ -19,30 +19,8 @@ InstanceParams::~InstanceParams() = default; -InstanceRegistry::Observer::Observer(InstanceRegistry* instance_registry) { - Observe(instance_registry); -} - -InstanceRegistry::Observer::Observer() = default; InstanceRegistry::Observer::~Observer() { - if (instance_registry_) { - instance_registry_->RemoveObserver(this); - } -} - -void InstanceRegistry::Observer::Observe(InstanceRegistry* instance_registry) { - if (instance_registry == instance_registry_) { - return; - } - - if (instance_registry_) { - instance_registry_->RemoveObserver(this); - } - - instance_registry_ = instance_registry; - if (instance_registry_) { - instance_registry_->AddObserver(this); - } + CHECK(!IsInObserverList()); } InstanceRegistry::InstanceRegistry() = default;
diff --git a/components/services/app_service/public/cpp/instance_registry.h b/components/services/app_service/public/cpp/instance_registry.h index 518cc2f..56315f8 100644 --- a/components/services/app_service/public/cpp/instance_registry.h +++ b/components/services/app_service/public/cpp/instance_registry.h
@@ -58,9 +58,6 @@ public: class Observer : public base::CheckedObserver { public: - Observer(const Observer&) = delete; - Observer& operator=(const Observer&) = delete; - // Called whenever the InstanceRegistry receives an update for any // instance. `update` exposes the latest field values and whether they have // changed in this update (as per the docs on `apps::InstanceUpdate`). The @@ -74,32 +71,7 @@ virtual void OnInstanceRegistryWillBeDestroyed(InstanceRegistry* cache) = 0; protected: - // Use this constructor when the observer |this| is tied to a single - // InstanceRegistry for its entire lifetime, or until the observee (the - // InstanceRegistry) is destroyed, whichever comes first. - // - // DEPRECATED: Prefer using a base::ScopedObservation for idiomatic observer - // behavior. - // TODO(crbug.com/1453127): Remove this method. - explicit Observer(InstanceRegistry* cache); - - // Use this constructor when the observer |this| wants to observe a - // InstanceRegistry for part of its lifetime. It can then call Observe() to - // start and stop observing. - Observer(); - ~Observer() override; - - // Start observing a different InstanceRegistry. |instance_registry| may be - // nullptr, meaning to stop observing. - // - // DEPRECATED: Prefer using a base::ScopedObservation for idiomatic observer - // behavior. - // TODO(crbug.com/1453127): Remove this method. - void Observe(InstanceRegistry* instance_registry); - - private: - raw_ptr<InstanceRegistry, ExperimentalAsh> instance_registry_ = nullptr; }; InstanceRegistry(); @@ -108,6 +80,8 @@ InstanceRegistry(const InstanceRegistry&) = delete; InstanceRegistry& operator=(const InstanceRegistry&) = delete; + // Prefer using a base::ScopedObservation to safely manage the observation, + // instead of calling these methods directly. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer);
diff --git a/components/services/app_service/public/cpp/instance_registry_unittest.cc b/components/services/app_service/public/cpp/instance_registry_unittest.cc index f931f6a..e66d1c8 100644 --- a/components/services/app_service/public/cpp/instance_registry_unittest.cc +++ b/components/services/app_service/public/cpp/instance_registry_unittest.cc
@@ -8,6 +8,7 @@ #include "base/containers/contains.h" #include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" #include "components/services/app_service/public/cpp/instance.h" #include "components/services/app_service/public/cpp/instance_registry.h" #include "components/services/app_service/public/cpp/instance_update.h" @@ -88,8 +89,9 @@ class InstanceRecursiveObserver : public apps::InstanceRegistry::Observer { public: explicit InstanceRecursiveObserver(apps::InstanceRegistry* instance_registry) - : apps::InstanceRegistry::Observer(instance_registry), - instance_registry_(instance_registry) {} + : instance_registry_(instance_registry) { + instance_registry_observation_.Observe(instance_registry); + } ~InstanceRecursiveObserver() override = default; @@ -177,7 +179,7 @@ void OnInstanceRegistryWillBeDestroyed( apps::InstanceRegistry* instance_registry) override { - Observe(nullptr); + instance_registry_observation_.Reset(); } static void ExpectEq(const apps::InstanceUpdate& outer, @@ -206,6 +208,10 @@ std::vector<std::unique_ptr<apps::InstanceParams>> super_recursive_instance_params_; std::vector<std::unique_ptr<apps::Instance>> super_recursive_instances_; + + base::ScopedObservation<apps::InstanceRegistry, + apps::InstanceRegistry::Observer> + instance_registry_observation_{this}; }; TEST_F(InstanceRegistryTest, ForEachInstance) {
diff --git a/components/test/data/viz/mask_as_blending_rotated_circle.png b/components/test/data/viz/mask_as_blending_rotated_circle.png index d5f24db..33928f4 100644 --- a/components/test/data/viz/mask_as_blending_rotated_circle.png +++ b/components/test/data/viz/mask_as_blending_rotated_circle.png Binary files differ
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn index 02d2799..a594d5b 100644 --- a/components/vector_icons/BUILD.gn +++ b/components/vector_icons/BUILD.gn
@@ -144,6 +144,7 @@ "midi_off_chrome_refresh.icon", "not_secure_warning.icon", "not_secure_warning_chrome_refresh.icon", + "not_secure_warning_off_chrome_refresh.icon", "notification_warning.icon", "notifications.icon", "notifications_chrome_refresh.icon", @@ -163,6 +164,8 @@ "privacy_sandbox.icon", "protected_content.icon", "protocol_handler.icon", + "protocol_handler_chrome_refresh.icon", + "protocol_handler_off_chrome_refresh.icon", "reload.icon", "reload_chrome_refresh.icon", "replay.icon",
diff --git a/components/vector_icons/business_chrome_refresh.icon b/components/vector_icons/business_chrome_refresh.icon index 735cb35..0ceda76a 100644 --- a/components/vector_icons/business_chrome_refresh.icon +++ b/components/vector_icons/business_chrome_refresh.icon
@@ -2,258 +2,76 @@ // 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, 2, 21, -V_LINE_TO, 3, -H_LINE_TO, 12, -V_LINE_TO, 7, -H_LINE_TO, 22, -V_LINE_TO, 21, -H_LINE_TO, 2, -CLOSE, -MOVE_TO, 4, 19, -H_LINE_TO, 6, -V_LINE_TO, 17, -H_LINE_TO, 4, -V_LINE_TO, 19, -CLOSE, -MOVE_TO, 4, 15, -H_LINE_TO, 6, -V_LINE_TO, 13, -H_LINE_TO, 4, -V_LINE_TO, 15, -CLOSE, -MOVE_TO, 4, 11, -H_LINE_TO, 6, -V_LINE_TO, 9, -H_LINE_TO, 4, -V_LINE_TO, 11, -CLOSE, -MOVE_TO, 4, 7, -H_LINE_TO, 6, -V_LINE_TO, 5, -H_LINE_TO, 4, -V_LINE_TO, 7, -CLOSE, -MOVE_TO, 8, 19, -H_LINE_TO, 10, -V_LINE_TO, 17, -H_LINE_TO, 8, -V_LINE_TO, 19, -CLOSE, -MOVE_TO, 8, 15, -H_LINE_TO, 10, -V_LINE_TO, 13, -H_LINE_TO, 8, -V_LINE_TO, 15, -CLOSE, -MOVE_TO, 8, 11, -H_LINE_TO, 10, -V_LINE_TO, 9, -H_LINE_TO, 8, -V_LINE_TO, 11, -CLOSE, -MOVE_TO, 8, 7, -H_LINE_TO, 10, -V_LINE_TO, 5, -H_LINE_TO, 8, -V_LINE_TO, 7, -CLOSE, -MOVE_TO, 12, 19, -H_LINE_TO, 20, -V_LINE_TO, 9, -H_LINE_TO, 12, -V_LINE_TO, 11, -H_LINE_TO, 14, -V_LINE_TO, 13, -H_LINE_TO, 12, -V_LINE_TO, 15, -H_LINE_TO, 14, -V_LINE_TO, 17, -H_LINE_TO, 12, -V_LINE_TO, 19, -CLOSE, -MOVE_TO, 16, 13, -V_LINE_TO, 11, -H_LINE_TO, 18, -V_LINE_TO, 13, -H_LINE_TO, 16, -CLOSE, -MOVE_TO, 16, 17, -V_LINE_TO, 15, -H_LINE_TO, 18, -V_LINE_TO, 17, -H_LINE_TO, 16, -CLOSE - -CANVAS_DIMENSIONS, 20, -MOVE_TO, 2, 17, -V_LINE_TO, 3, -H_LINE_TO, 10, -V_LINE_TO, 6, -H_LINE_TO, 18, -V_LINE_TO, 17, -H_LINE_TO, 2, -CLOSE, -MOVE_TO, 3.5f, 15.5f, -H_LINE_TO, 5, -V_LINE_TO, 14, -H_LINE_TO, 3.5f, -V_LINE_TO, 15.5f, -CLOSE, -MOVE_TO, 3.5f, 12.33f, -H_LINE_TO, 5, -V_LINE_TO, 10.83f, -H_LINE_TO, 3.5f, -V_LINE_TO, 12.33f, -CLOSE, -MOVE_TO, 3.5f, 9.17f, -H_LINE_TO, 5, -V_LINE_TO, 7.67f, -H_LINE_TO, 3.5f, -V_LINE_TO, 9.17f, -CLOSE, -MOVE_TO, 3.5f, 6, -H_LINE_TO, 5, -V_LINE_TO, 4.5f, -H_LINE_TO, 3.5f, -V_LINE_TO, 6, -CLOSE, -MOVE_TO, 7, 15.5f, -H_LINE_TO, 8.5f, -V_LINE_TO, 14, -H_LINE_TO, 7, -V_LINE_TO, 15.5f, -CLOSE, -MOVE_TO, 7, 12.33f, -H_LINE_TO, 8.5f, -V_LINE_TO, 10.83f, -H_LINE_TO, 7, -V_LINE_TO, 12.33f, -CLOSE, -MOVE_TO, 7, 9.17f, -H_LINE_TO, 8.5f, -V_LINE_TO, 7.67f, -H_LINE_TO, 7, -V_LINE_TO, 9.17f, -CLOSE, -MOVE_TO, 7, 6, -H_LINE_TO, 8.5f, -V_LINE_TO, 4.5f, -H_LINE_TO, 7, -V_LINE_TO, 6, -CLOSE, -MOVE_TO, 10, 15.5f, -H_LINE_TO, 16.5f, -V_LINE_TO, 7.5f, -H_LINE_TO, 10, -V_LINE_TO, 9.17f, -H_LINE_TO, 11.5f, -V_LINE_TO, 10.67f, -H_LINE_TO, 10, -V_LINE_TO, 12.33f, -H_LINE_TO, 11.5f, -V_LINE_TO, 13.83f, -H_LINE_TO, 10, -V_LINE_TO, 15.5f, -CLOSE, -MOVE_TO, 13.5f, 10.67f, -V_LINE_TO, 9.17f, -H_LINE_TO, 15, -V_LINE_TO, 10.67f, -H_LINE_TO, 13.5f, -CLOSE, -MOVE_TO, 13.5f, 13.83f, -V_LINE_TO, 12.33f, -H_LINE_TO, 15, -V_LINE_TO, 13.83f, -H_LINE_TO, 13.5f, -CLOSE - - CANVAS_DIMENSIONS, 16, -MOVE_TO, 12, 7, -H_LINE_TO, 11, -V_LINE_TO, 8, +MOVE_TO, 1.31f, 14.04f, +V_LINE_TO, 2.26f, +R_H_LINE_TO, 6.98f, +V_LINE_TO, 4.66f, +R_H_LINE_TO, 6.4f, +R_V_LINE_TO, 9.38f, +CLOSE, +MOVE_TO, 2.8f, 12.54f, +H_LINE_TO, 4, +V_LINE_TO, 11.34f, +H_LINE_TO, 2.8f, +CLOSE, +R_MOVE_TO, 0, -2.53f, +H_LINE_TO, 4, +R_V_LINE_TO, -1.2f, +H_LINE_TO, 2.8f, +CLOSE, +R_MOVE_TO, 0, -2.53f, +H_LINE_TO, 4, +V_LINE_TO, 6.27f, +H_LINE_TO, 2.8f, +CLOSE, +R_MOVE_TO, 0, -2.54f, +H_LINE_TO, 4, +V_LINE_TO, 3.74f, +H_LINE_TO, 2.8f, +CLOSE, +R_MOVE_TO, 2.8f, 7.6f, +R_H_LINE_TO, 1.2f, +V_LINE_TO, 11.34f, +H_LINE_TO, 5.6f, +CLOSE, +R_MOVE_TO, 0, -2.53f, +R_H_LINE_TO, 1.2f, +R_V_LINE_TO, -1.2f, +H_LINE_TO, 5.6f, +CLOSE, +R_MOVE_TO, 0, -2.53f, +R_H_LINE_TO, 1.2f, +V_LINE_TO, 6.27f, +H_LINE_TO, 5.6f, +CLOSE, +R_MOVE_TO, 0, -2.54f, +R_H_LINE_TO, 1.2f, +V_LINE_TO, 3.74f, +H_LINE_TO, 5.6f, +CLOSE, +MOVE_TO, 8, 12.54f, +R_H_LINE_TO, 5.2f, +V_LINE_TO, 6.14f, +H_LINE_TO, 8, +R_V_LINE_TO, 1.34f, +R_H_LINE_TO, 1.2f, +R_V_LINE_TO, 1.2f, +H_LINE_TO, 8, +R_V_LINE_TO, 1.33f, +R_H_LINE_TO, 1.2f, +R_V_LINE_TO, 1.2f, +H_LINE_TO, 8, +CLOSE, +R_MOVE_TO, 2.8f, -3.87f, +R_V_LINE_TO, -1.2f, H_LINE_TO, 12, -V_LINE_TO, 7, +R_V_LINE_TO, 1.2f, CLOSE, -NEW_PATH, -MOVE_TO, 12, 10, -H_LINE_TO, 11, -V_LINE_TO, 11, +R_MOVE_TO, 0, 2.53f, +R_V_LINE_TO, -1.2f, H_LINE_TO, 12, -V_LINE_TO, 10, +R_V_LINE_TO, 1.2f, CLOSE, -NEW_PATH, -MOVE_TO, 8, 4, -V_LINE_TO, 2, -H_LINE_TO, 1, -V_LINE_TO, 14, -H_LINE_TO, 15, -V_LINE_TO, 4, -H_LINE_TO, 8, -CLOSE, -MOVE_TO, 4, 12, -H_LINE_TO, 3, -V_LINE_TO, 11, -H_LINE_TO, 4, -V_LINE_TO, 12, -CLOSE, -MOVE_TO, 4, 9.67f, -H_LINE_TO, 3, -V_LINE_TO, 8.67f, -H_LINE_TO, 4, -V_LINE_TO, 9.67f, -CLOSE, -MOVE_TO, 4, 7.34f, -H_LINE_TO, 3, -V_LINE_TO, 6.34f, -H_LINE_TO, 4, -V_LINE_TO, 7.34f, -CLOSE, -MOVE_TO, 4, 5.01f, -H_LINE_TO, 3, -V_LINE_TO, 4.01f, -H_LINE_TO, 4, -V_LINE_TO, 5.01f, -CLOSE, -MOVE_TO, 6, 12.01f, -H_LINE_TO, 5, -V_LINE_TO, 11.01f, -H_LINE_TO, 6, -V_LINE_TO, 12.01f, -CLOSE, -MOVE_TO, 6, 9.68f, -H_LINE_TO, 5, -V_LINE_TO, 8.68f, -H_LINE_TO, 6, -V_LINE_TO, 9.68f, -CLOSE, -MOVE_TO, 6, 7.35f, -H_LINE_TO, 5, -V_LINE_TO, 6.35f, -H_LINE_TO, 6, -V_LINE_TO, 7.35f, -CLOSE, -MOVE_TO, 6, 5.02f, -H_LINE_TO, 5, -V_LINE_TO, 4.02f, -H_LINE_TO, 6, -V_LINE_TO, 5.02f, -CLOSE, -MOVE_TO, 13.5f, 12.52f, -H_LINE_TO, 8, -V_LINE_TO, 11.02f, -H_LINE_TO, 9, -V_LINE_TO, 10.02f, -H_LINE_TO, 8, -V_LINE_TO, 8.02f, -H_LINE_TO, 9, -V_LINE_TO, 7.02f, -H_LINE_TO, 8, -V_LINE_TO, 5.52f, -H_LINE_TO, 13.5f, -V_LINE_TO, 12.52f, +R_MOVE_TO, 0, 0, CLOSE
diff --git a/components/vector_icons/not_secure_warning_chrome_refresh.icon b/components/vector_icons/not_secure_warning_chrome_refresh.icon index 7cfc460..b52efecd 100644 --- a/components/vector_icons/not_secure_warning_chrome_refresh.icon +++ b/components/vector_icons/not_secure_warning_chrome_refresh.icon
@@ -2,81 +2,30 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -CANVAS_DIMENSIONS, 32, -MOVE_TO, 1.33f, 28, -LINE_TO, 16, 2.67f, -LINE_TO, 30.67f, 28, -H_LINE_TO, 1.33f, -CLOSE, -MOVE_TO, 5.57f, 25.57f, -H_LINE_TO, 26.43f, -LINE_TO, 16, 7.57f, -LINE_TO, 5.57f, 25.57f, -CLOSE, -MOVE_TO, 16.03f, 24.03f, -CUBIC_TO, 16.39f, 24.03f, 16.68f, 23.92f, 16.9f, 23.7f, -CUBIC_TO, 17.14f, 23.46f, 17.27f, 23.16f, 17.27f, 22.8f, -CUBIC_TO, 17.27f, 22.47f, 17.14f, 22.19f, 16.9f, 21.97f, -CUBIC_TO, 16.68f, 21.72f, 16.39f, 21.6f, 16.03f, 21.6f, -CUBIC_TO, 15.7f, 21.6f, 15.41f, 21.72f, 15.17f, 21.97f, -CUBIC_TO, 14.94f, 22.19f, 14.83f, 22.47f, 14.83f, 22.8f, -CUBIC_TO, 14.83f, 23.16f, 14.94f, 23.46f, 15.17f, 23.7f, -CUBIC_TO, 15.41f, 23.92f, 15.7f, 24.03f, 16.03f, 24.03f, -CLOSE, -MOVE_TO, 14.83f, 20.13f, -H_LINE_TO, 17.27f, -V_LINE_TO, 13.2f, -H_LINE_TO, 14.83f, -V_LINE_TO, 20.13f, -CLOSE - -CANVAS_DIMENSIONS, 20, -MOVE_TO, 0.86f, 17.09f, -LINE_TO, 10, 1.83f, -R_LINE_TO, 9.15f, 15.25f, -CLOSE, -MOVE_TO, 3.77f, 15.43f, -R_H_LINE_TO, 12.46f, -LINE_TO, 10, 5.06f, -CLOSE, -R_MOVE_TO, 6.23f, -0.95f, -R_ARC_TO, 0.76f, 0.76f, 0, 0, 0, 0.55f, -0.22f, -R_ARC_TO, 0.74f, 0.74f, 0, 0, 0, 0.23f, -0.55f, -R_ARC_TO, 0.75f, 0.75f, 0, 0, 0, -0.22f, -0.55f, -R_ARC_TO, 0.73f, 0.73f, 0, 0, 0, -0.55f, -0.23f, -R_ARC_TO, 0.77f, 0.77f, 0, 0, 0, -0.55f, 0.22f, -R_ARC_TO, 0.73f, 0.73f, 0, 0, 0, -0.23f, 0.55f, -R_ARC_TO, 0.76f, 0.76f, 0, 0, 0, 0.22f, 0.55f, -R_ARC_TO, 0.73f, 0.73f, 0, 0, 0, 0.55f, 0.23f, -CLOSE, -MOVE_TO, 9.25f, 12, -R_H_LINE_TO, 1.5f, -V_LINE_TO, 8.06f, -R_H_LINE_TO, -1.5f, -CLOSE - CANVAS_DIMENSIONS, 16, -MOVE_TO, 8, 2, -LINE_TO, 1, 14, -H_LINE_TO, 15, -LINE_TO, 8, 2, +MOVE_TO, 0.53f, 13.76f, +LINE_TO, 8, 1.28f, +R_LINE_TO, 7.47f, 12.48f, CLOSE, -MOVE_TO, 8, 4.98f, -LINE_TO, 12.39f, 12.5f, -H_LINE_TO, 3.61f, -LINE_TO, 8, 4.98f, +R_MOVE_TO, 2.63f, -1.49f, +R_H_LINE_TO, 9.7f, +LINE_TO, 8, 4.2f, CLOSE, -NEW_PATH, -MOVE_TO, 8.75f, 7, -H_LINE_TO, 7.25f, -V_LINE_TO, 10, -H_LINE_TO, 8.75f, -V_LINE_TO, 7, +R_MOVE_TO, 4.84f, -0.7f, +R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, 0.46f, -0.19f, +R_ARC_TO, 0.63f, 0.63f, 0, 0, 0, 0, -0.91f, +R_ARC_TO, 0.63f, 0.63f, 0, 0, 0, -0.45f, -0.19f, +R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, -0.46f, 0.19f, +R_ARC_TO, 0.6f, 0.6f, 0, 0, 0, -0.19f, 0.45f, +R_CUBIC_TO, 0, 0.18f, 0.07f, 0.33f, 0.19f, 0.46f, +R_ARC_TO, 0.61f, 0.61f, 0, 0, 0, 0.45f, 0.19f, CLOSE, -NEW_PATH, -MOVE_TO, 8, 12, -CUBIC_TO, 8.41f, 12, 8.75f, 11.66f, 8.75f, 11.25f, -CUBIC_TO, 8.75f, 10.84f, 8.41f, 10.5f, 8, 10.5f, -CUBIC_TO, 7.59f, 10.5f, 7.25f, 10.84f, 7.25f, 11.25f, -CUBIC_TO, 7.25f, 11.66f, 7.59f, 12, 8, 12, -CLOSE \ No newline at end of file +R_MOVE_TO, -0.6f, -1.97f, +R_H_LINE_TO, 1.2f, +V_LINE_TO, 6.5f, +H_LINE_TO, 7.4f, +CLOSE, +MOVE_TO, 8, 8.23f, +CLOSE, +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/components/vector_icons/not_secure_warning_off_chrome_refresh.icon b/components/vector_icons/not_secure_warning_off_chrome_refresh.icon new file mode 100644 index 0000000..4ae06e92 --- /dev/null +++ b/components/vector_icons/not_secure_warning_off_chrome_refresh.icon
@@ -0,0 +1,43 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 10, 14.48f, +R_ARC_TO, 0.76f, 0.76f, 0, 0, 1, -0.55f, -0.22f, +R_ARC_TO, 0.74f, 0.74f, 0, 0, 1, -0.23f, -0.55f, +R_CUBIC_TO, 0, -0.21f, 0.07f, -0.4f, 0.22f, -0.55f, +R_ARC_TO, 0.73f, 0.73f, 0, 0, 1, 0.55f, -0.23f, +R_CUBIC_TO, 0.22f, 0, 0.4f, 0.08f, 0.55f, 0.22f, +R_ARC_TO, 0.73f, 0.73f, 0, 0, 1, 0.23f, 0.55f, +R_ARC_TO, 0.76f, 0.76f, 0, 0, 1, -0.22f, 0.55f, +R_ARC_TO, 0.73f, 0.73f, 0, 0, 1, -0.55f, 0.23f, +CLOSE, +MOVE_TO, 9.25f, 12, +V_LINE_TO, 9.25f, +R_LINE_TO, 1.5f, 1.5f, +V_LINE_TO, 12, +CLOSE, +R_MOVE_TO, 9.78f, 4.91f, +R_LINE_TO, -4.8f, -4.8f, +LINE_TO, 10, 5.06f, +LINE_TO, 8.95f, 6.82f, +LINE_TO, 7.73f, 5.6f, +LINE_TO, 10, 1.83f, +CLOSE, +MOVE_TO, 3.77f, 15.43f, +R_H_LINE_TO, 9.43f, +LINE_TO, 7.3f, 9.54f, +CLOSE, +R_MOVE_TO, 13.31f, 3.88f, +R_LINE_TO, -2.22f, -2.22f, +R_H_LINE_TO, -14, +LINE_TO, 6.11f, 8.34f, +LINE_TO, 0.7f, 2.93f, +R_LINE_TO, 1.11f, -1.11f, +R_LINE_TO, 16.38f, 16.38f, +CLOSE, +R_MOVE_TO, -6.82f, -6.82f, +CLOSE, +R_MOVE_TO, 1.34f, -3.03f, +CLOSE \ No newline at end of file
diff --git a/components/vector_icons/protocol_handler_chrome_refresh.icon b/components/vector_icons/protocol_handler_chrome_refresh.icon new file mode 100644 index 0000000..00b3211 --- /dev/null +++ b/components/vector_icons/protocol_handler_chrome_refresh.icon
@@ -0,0 +1,54 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 7.84f, 16.55f, +R_CUBIC_TO, -0.16f, 0, -0.3f, -0.03f, -0.44f, -0.09f, +ARC_TO, 1.37f, 1.37f, 0, 0, 1, 7, 16.18f, +R_LINE_TO, -4.91f, -5.43f, +R_ARC_TO, 1.06f, 1.06f, 0, 0, 1, -0.21f, -0.36f, +ARC_TO, 1.12f, 1.12f, 0, 0, 1, 1.81f, 10, +R_ARC_TO, 1.1f, 1.1f, 0, 0, 1, 0.28f, -0.74f, +LINE_TO, 7, 3.82f, +R_CUBIC_TO, 0.13f, -0.12f, 0.26f, -0.22f, 0.4f, -0.28f, +R_CUBIC_TO, 0.14f, -0.06f, 0.28f, -0.09f, 0.44f, -0.09f, +R_CUBIC_TO, 0.16f, 0, 0.31f, 0.03f, 0.44f, 0.09f, +R_CUBIC_TO, 0.13f, 0.06f, 0.26f, 0.16f, 0.38f, 0.28f, +LINE_TO, 10, 5.31f, +R_LINE_TO, 1.35f, -1.48f, +R_ARC_TO, 1.32f, 1.32f, 0, 0, 1, 0.38f, -0.28f, +R_ARC_TO, 0.99f, 0.99f, 0, 0, 1, 0.43f, -0.09f, +R_CUBIC_TO, 0.16f, 0, 0.31f, 0.03f, 0.44f, 0.09f, +R_CUBIC_TO, 0.14f, 0.06f, 0.27f, 0.16f, 0.4f, 0.28f, +R_LINE_TO, 4.91f, 5.43f, +R_CUBIC_TO, 0.09f, 0.11f, 0.16f, 0.23f, 0.21f, 0.36f, +R_ARC_TO, 1.12f, 1.12f, 0, 0, 1, -0.21f, 1.12f, +R_LINE_TO, -4.91f, 5.44f, +R_ARC_TO, 1.43f, 1.43f, 0, 0, 1, -0.39f, 0.28f, +R_CUBIC_TO, -0.14f, 0.06f, -0.28f, 0.09f, -0.44f, 0.09f, +R_ARC_TO, 0.99f, 0.99f, 0, 0, 1, -0.43f, -0.09f, +R_ARC_TO, 1.38f, 1.38f, 0, 0, 1, -0.38f, -0.28f, +LINE_TO, 10, 14.69f, +R_LINE_TO, -1.35f, 1.49f, +R_ARC_TO, 1.32f, 1.32f, 0, 0, 1, -0.38f, 0.28f, +R_ARC_TO, 0.99f, 0.99f, 0, 0, 1, -0.43f, 0.09f, +CLOSE, +R_MOVE_TO, 0, -2.03f, +R_LINE_TO, 1.01f, -1.1f, +R_LINE_TO, -2.43f, -2.68f, +ARC_TO, 1.11f, 1.11f, 0, 0, 1, 6.13f, 10, +R_CUBIC_TO, 0, -0.28f, 0.1f, -0.52f, 0.28f, -0.74f, +R_LINE_TO, 2.43f, -2.68f, +R_LINE_TO, -1.01f, -1.1f, +LINE_TO, 3.75f, 10, +CLOSE, +R_MOVE_TO, 4.33f, 0, +LINE_TO, 16.25f, 10, +R_LINE_TO, -4.09f, -4.52f, +R_LINE_TO, -1.01f, 1.1f, +R_LINE_TO, 2.43f, 2.68f, +R_CUBIC_TO, 0.19f, 0.22f, 0.28f, 0.47f, 0.28f, 0.74f, +R_CUBIC_TO, 0, 0.28f, -0.1f, 0.52f, -0.28f, 0.74f, +R_LINE_TO, -2.43f, 2.68f, +CLOSE \ No newline at end of file
diff --git a/components/vector_icons/protocol_handler_off_chrome_refresh.icon b/components/vector_icons/protocol_handler_off_chrome_refresh.icon new file mode 100644 index 0000000..41d04e15 --- /dev/null +++ b/components/vector_icons/protocol_handler_off_chrome_refresh.icon
@@ -0,0 +1,63 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +R_MOVE_TO, 16.19f, 18.34f, +R_LINE_TO, -2.71f, -2.71f, +R_LINE_TO, -0.48f, 0.56f, +R_ARC_TO, 1.18f, 1.18f, 0, 0, 1, -0.37f, 0.28f, +R_CUBIC_TO, -0.14f, 0.06f, -0.29f, 0.09f, -0.46f, 0.09f, +R_CUBIC_TO, -0.17f, 0, -0.32f, -0.03f, -0.46f, -0.09f, +R_ARC_TO, 0.94f, 0.94f, 0, 0, 1, -0.35f, -0.28f, +LINE_TO, 10, 14.69f, +R_LINE_TO, -1.35f, 1.49f, +R_CUBIC_TO, -0.11f, 0.13f, -0.23f, 0.22f, -0.37f, 0.28f, +R_CUBIC_TO, -0.14f, 0.06f, -0.29f, 0.09f, -0.45f, 0.09f, +ARC_TO, 1.08f, 1.08f, 0, 0, 1, 7, 16.18f, +R_LINE_TO, -4.91f, -5.43f, +R_ARC_TO, 0.88f, 0.88f, 0, 0, 1, -0.21f, -0.34f, +ARC_TO, 1.15f, 1.15f, 0, 0, 1, 1.81f, 10, +R_ARC_TO, 1.1f, 1.1f, 0, 0, 1, 0.28f, -0.74f, +R_LINE_TO, 2.39f, -2.63f, +R_LINE_TO, -2.81f, -2.81f, +LINE_TO, 2.78f, 2.7f, +R_LINE_TO, 14.52f, 14.52f, +CLOSE, +R_MOVE_TO, -3.93f, -3.93f, +R_LINE_TO, -1.04f, -1.07f, +CLOSE, +R_MOVE_TO, -4.42f, 0.11f, +R_LINE_TO, 1.01f, -1.1f, +R_LINE_TO, -2.43f, -2.68f, +ARC_TO, 1.11f, 1.11f, 0, 0, 1, 6.13f, 10, +R_CUBIC_TO, 0, -0.28f, 0.1f, -0.52f, 0.28f, -0.74f, +R_LINE_TO, 0.33f, -0.37f, +R_LINE_TO, -1.05f, -1.04f, +LINE_TO, 3.75f, 10, +CLOSE, +R_MOVE_TO, 7.77f, -1.22f, +R_LINE_TO, -1.23f, -1.22f, +LINE_TO, 16.25f, 10, +LINE_TO, 12.02f, 5.63f, +R_LINE_TO, -0.86f, 0.96f, +R_LINE_TO, 2.43f, 2.68f, +R_ARC_TO, 1.11f, 1.11f, 0, 0, 1, 0, 1.48f, +R_LINE_TO, -0.26f, 0.29f, +LINE_TO, 8.84f, 6.54f, +LINE_TO, 7.81f, 5.51f, +LINE_TO, 6.59f, 4.29f, +LINE_TO, 7, 3.82f, +R_CUBIC_TO, 0.13f, -0.12f, 0.25f, -0.22f, 0.38f, -0.28f, +R_CUBIC_TO, 0.13f, -0.06f, 0.28f, -0.09f, 0.45f, -0.09f, +R_CUBIC_TO, 0.16f, 0, 0.31f, 0.03f, 0.45f, 0.09f, +R_CUBIC_TO, 0.14f, 0.06f, 0.26f, 0.16f, 0.37f, 0.28f, +LINE_TO, 10, 5.31f, +R_LINE_TO, 1.35f, -1.48f, +R_CUBIC_TO, 0.11f, -0.12f, 0.23f, -0.22f, 0.37f, -0.28f, +R_CUBIC_TO, 0.14f, -0.06f, 0.29f, -0.09f, 0.45f, -0.09f, +R_ARC_TO, 1.08f, 1.08f, 0, 0, 1, 0.84f, 0.38f, +R_LINE_TO, 4.91f, 5.43f, +R_ARC_TO, 1.13f, 1.13f, 0, 0, 1, 0.27f, 0.74f, +R_ARC_TO, 1.1f, 1.1f, 0, 0, 1, -0.28f, 0.74f, +CLOSE \ No newline at end of file
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index f14b9bb5..1ff2c98 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -3565,10 +3565,6 @@ RunHtmlTest(FILE_PATH_LITERAL("shadow-dom-first-child.html")); } -IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, WhitespaceDynamic) { - RunHtmlTest(FILE_PATH_LITERAL("whitespace-dynamic.html")); -} - // // AccName tests where having the full tree is desired. //
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc index 1235e73..15c8417d 100644 --- a/content/browser/interest_group/ad_auction_service_impl.cc +++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -88,7 +88,7 @@ AdAuctionServiceImpl::BiddingAndAuctionDataConstructionState:: BiddingAndAuctionDataConstructionState() - : uuid(base::Uuid::GenerateRandomV4()) {} + : request_id(base::Uuid::GenerateRandomV4()) {} AdAuctionServiceImpl::BiddingAndAuctionDataConstructionState:: BiddingAndAuctionDataConstructionState( BiddingAndAuctionDataConstructionState&& other) = default; @@ -382,7 +382,8 @@ state.callback = std::move(callback); GetInterestGroupManager().GetInterestGroupAdAuctionData( - seller, GetTopWindowOrigin(), + GetTopWindowOrigin(), + /* generation_id=*/base::Uuid::GenerateRandomV4(), base::BindOnce(&AdAuctionServiceImpl::OnGotAuctionData, weak_ptr_factory_.GetWeakPtr(), std::move(state))); } @@ -710,13 +711,13 @@ void AdAuctionServiceImpl::OnGotAuctionData( BiddingAndAuctionDataConstructionState state, - std::vector<uint8_t> plaintext) { - if (plaintext.empty()) { + BiddingAndAuctionData data) { + if (data.request.empty()) { std::move(state.callback).Run({}, ""); return; } - state.plaintext = std::move(plaintext); + state.data = std::move(data); GetInterestGroupManager().GetBiddingAndAuctionServerKey( GetRefCountedTrustedURLLoaderFactory().get(), base::BindOnce(&AdAuctionServiceImpl::OnGotBiddingAndAuctionServerKey, @@ -738,7 +739,7 @@ auto maybe_request = quiche::ObliviousHttpRequest::CreateClientObliviousRequest( - std::string(state.plaintext.begin(), state.plaintext.end()), + std::string(state.data.request.begin(), state.data.request.end()), maybe_key->key, maybe_key_config.value()); if (!maybe_request.ok()) { std::move(state.callback).Run({}, ""); @@ -750,7 +751,7 @@ std::move(state.callback) .Run(mojo_base::BigBuffer( base::make_span(bytes, data.size() * sizeof(char))), - state.uuid.AsLowercaseString()); + state.request_id.AsLowercaseString()); // TODO(behamilton): Save request context for decryption. }
diff --git a/content/browser/interest_group/ad_auction_service_impl.h b/content/browser/interest_group/ad_auction_service_impl.h index 6d6746b..ec32bc8 100644 --- a/content/browser/interest_group/ad_auction_service_impl.h +++ b/content/browser/interest_group/ad_auction_service_impl.h
@@ -18,6 +18,7 @@ #include "content/browser/fenced_frame/fenced_frame_url_mapping.h" #include "content/browser/interest_group/auction_runner.h" #include "content/browser/interest_group/auction_worklet_manager.h" +#include "content/browser/interest_group/bidding_and_auction_serializer.h" #include "content/browser/interest_group/interest_group_auction_reporter.h" #include "content/common/content_export.h" #include "content/public/browser/content_browser_client.h" @@ -109,8 +110,8 @@ BiddingAndAuctionDataConstructionState&& other); ~BiddingAndAuctionDataConstructionState(); - std::vector<uint8_t> plaintext; // unencrypted auction request blob - base::Uuid uuid; // request ID + BiddingAndAuctionData data; + base::Uuid request_id; GetInterestGroupAdAuctionDataCallback callback; }; @@ -156,7 +157,7 @@ private_aggregation_requests); void OnGotAuctionData(BiddingAndAuctionDataConstructionState state, - std::vector<uint8_t> plaintext); + BiddingAndAuctionData data); void OnGotBiddingAndAuctionServerKey( BiddingAndAuctionDataConstructionState state, absl::optional<BiddingAndAuctionServerKey> key);
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc index 597f2be..ba28eb9f 100644 --- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc +++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -31,6 +31,8 @@ #include "base/time/time.h" #include "build/build_config.h" #include "build/buildflag.h" +#include "components/cbor/diagnostic_writer.h" +#include "components/cbor/reader.h" #include "components/services/storage/shared_storage/shared_storage_manager.h" #include "content/browser/aggregation_service/aggregatable_report.h" #include "content/browser/fenced_frame/fenced_frame_url_mapping.h" @@ -7629,9 +7631,14 @@ network_responder_->RegisterUpdateResponse(kBAndAKeyPath, json_output); } + struct AdAuctionDataAndId { + std::string request; + std::string request_id; + }; + // Gets auction data in the frame `rfh`. If `rfh` is nullptr, uses the main // frame. Returns the auction data. - absl::optional<std::string> GetAdAuctionDataAndFlushForFrame( + absl::optional<AdAuctionDataAndId> GetAdAuctionDataAndFlushForFrame( url::Origin seller, RenderFrameHost* rfh = nullptr) { mojo::Remote<blink::mojom::AdAuctionService> interest_service; @@ -7639,15 +7646,15 @@ rfh ? rfh : main_rfh(), interest_service.BindNewPipeAndPassReceiver()); base::RunLoop run_loop; - absl::optional<std::string> output; - std::string output_id; + absl::optional<AdAuctionDataAndId> output; interest_service->GetInterestGroupAdAuctionData( - seller, base::BindLambdaForTesting([&run_loop, &output, &output_id]( - mojo_base::BigBuffer result, + seller, base::BindLambdaForTesting([&](mojo_base::BigBuffer result, const std::string& id) { - output = std::string(reinterpret_cast<char*>(result.data()), - result.size()); - output_id = id; + AdAuctionDataAndId data; + data.request = std::string(reinterpret_cast<char*>(result.data()), + result.size()); + data.request_id = id; + output = data; run_loop.Quit(); })); interest_service.FlushForTesting(); @@ -7697,24 +7704,33 @@ task_environment()->FastForwardBy(base::Seconds(1)); std::vector<uint8_t> msg; + base::flat_map<url::Origin, std::vector<std::string>> group_names; base::RunLoop run_loop; manager_->GetInterestGroupAdAuctionData( - /*seller=*/test_origin, /*top_level_origin=*/test_origin, - base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) { - msg = inner_msg; + /*top_level_origin=*/test_origin, + base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"), + base::BindLambdaForTesting([&](BiddingAndAuctionData data) { + msg = std::move(data.request); + group_names = std::move(data.group_names); run_loop.Quit(); })); run_loop.Run(); std::string expected = - "pABYIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABndmVyc2lvbgBpcHVibGlz" - "aGVybmh0dHBzOi8vYS50ZXN0bmludGVyZXN0R3JvdXBzoW5odHRwczovL2EudGVzdFiXH4sI" - "AAAAAAAAAFWNOw7CMBAF+" - "V0oIfxaUlJS0GJ7V85Cso7WCchCFPFZEOfERDQ0r5nRvOFtFPgIWb4sTLFaA6sGwSjxtYLSN" - "a1j5M4PZrPdsRZ39yhHsqxq/" - "7KCBtmERaUpuT13k6oVvJ2IfYyzc5yPWbo44hFPJYlAbH+FA4Z0fcWQfSeXPsX3f4Z+PD+" - "l5cGLogAAAA=="; + "pQBY7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3ZlcnNpb24AaXB1Ymxpc2hlcm5odHRwczov" + "L2EudGVzdGxnZW5lcmF0aW9uSWR4JDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAw" + "MDAwMG5pbnRlcmVzdEdyb3Vwc6FuaHR0cHM6Ly9hLnRlc3RYlx+" + "LCAAAAAAAAABVjTsOwjAQBfldKCH8WlJSUtBie1fOQrKO1gnIQhTxWRDnxEQ0NK+" + "Z0bzhbRT4CFm+LEyxWgOrBsEo8bWC0jWtY+TOD2az3bEWd/" + "coR7Ksav+yggbZhEWlKbk9d5OqFbydiH2Ms3Ocj1m6OOIRTyWJQGx/" + "hQOGdH3FkH0nlz7F93+Gfjw/peXBi6IAAAA="; EXPECT_EQ(1, absl::popcount(msg.size())); // Should be a power of 2. EXPECT_EQ(expected, base::Base64Encode(msg)); + EXPECT_THAT(group_names, testing::ElementsAre(testing::Pair( + test_origin, testing::ElementsAre("cars")))); } TEST_F(AdAuctionServiceImplTest, SerializesAuctionBlobWithAnomalousPadding) { @@ -7724,7 +7740,6 @@ // request. manager_->JoinInterestGroup( blink::TestInterestGroupBuilder(test_origin, "cars") - .SetUserBiddingSignals(R"("ABCDEFGHIJKLMNOPQRSTUVWXYZ")") .SetAds({{{GURL("https://c.test/ad.html"), /*metadata=*/"", /*size_group=*/absl::nullopt, /*buyer_reporting_id=*/absl::nullopt, @@ -7734,21 +7749,20 @@ std::vector<uint8_t> msg; base::RunLoop run_loop; manager_->GetInterestGroupAdAuctionData( - /*seller=*/test_origin, /*top_level_origin=*/ - url::Origin::Create(GURL("https://the.new.top.level.origin.test")), - base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) { - msg = inner_msg; + /*top_level_origin=*/ + url::Origin::Create(GURL("https://very.long.origin.test")), + base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"), + base::BindLambdaForTesting([&](BiddingAndAuctionData data) { + msg = std::move(data.request); run_loop.Quit(); })); run_loop.Run(); std::string expected = - "pQBWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAZ3ZlcnNpb24AaXB1Ymxpc2hlcnglaHR0cHM6" - "Ly90aGUubmV3LnRvcC5sZXZlbC5vcmlnaW4udGVzdG5pbnRlcmVzdEdyb3Vwc6FuaHR0cHM6" - "Ly9hLnRlc3RYih+" - "LCAAAAAAAAABrXJKcmFLcmGJoZGySkpeYm5qSnFhUnJdUlF9enFoUnJmel5hTvCS9KDU5NS+" - "5kiEjKTPFOb80r4Qho6AotSw8M6+" - "4ITMrPzMPLMhYVArU5JSZkpKZlw7VWyGj5Ojk7OLq5u7h6eXt4+" - "vnHxAYFBwSGhYeERmlBAD8GWK6fwAAAA=="; + "pgBWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAZ3ZlcnNpb24AaXB1Ymxpc2hlcngdaHR0cHM6" + "Ly92ZXJ5Lmxvbmcub3JpZ2luLnRlc3RsZ2VuZXJhdGlvbklkeCQwMDAwMDAwMC0wMDAwLTAw" + "MDAtMDAwMC0wMDAwMDAwMDAwMDBuaW50ZXJlc3RHcm91cHOhbmh0dHBzOi8vYS50ZXN0WF8f" + "iwgAAAAAAAAAa1ycnJhS3JhiaGRskpKXmJuakpxYVJyXVJRfXpxaFJyZnpeYU7wkvSg1OTUv" + "uZIhIykzxTm/NK+EIaOgKLUsPDOvuCEzKz8zDyzICAAUFTd6TgAAAA=="; EXPECT_EQ(1, absl::popcount(msg.size())); // Should be a power of 2. EXPECT_EQ(expected, base::Base64Encode(msg)); } @@ -7756,15 +7770,19 @@ TEST_F(AdAuctionServiceImplTest, SerializesAuctionBlobWithNoGroups) { url::Origin test_origin = url::Origin::Create(GURL(kOriginStringA)); std::vector<uint8_t> msg; + base::flat_map<url::Origin, std::vector<std::string>> group_names; base::RunLoop run_loop; manager_->GetInterestGroupAdAuctionData( - /*seller=*/test_origin, /*top_level_origin=*/test_origin, - base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) { - msg = inner_msg; + /*top_level_origin=*/test_origin, + base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"), + base::BindLambdaForTesting([&](BiddingAndAuctionData data) { + msg = std::move(data.request); + group_names = std::move(data.group_names); run_loop.Quit(); })); run_loop.Run(); EXPECT_EQ("", base::Base64Encode(msg)); + EXPECT_TRUE(group_names.empty()); } TEST_F(AdAuctionServiceImplTest, SerializesAuctionBlobWithEmptyGroup) { @@ -7775,15 +7793,19 @@ task_environment()->FastForwardBy(base::Seconds(1)); std::vector<uint8_t> msg; + base::flat_map<url::Origin, std::vector<std::string>> group_names; base::RunLoop run_loop; manager_->GetInterestGroupAdAuctionData( - /*seller=*/test_origin, /*top_level_origin=*/test_origin, - base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) { - msg = inner_msg; + /*top_level_origin=*/test_origin, + base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"), + base::BindLambdaForTesting([&](BiddingAndAuctionData data) { + msg = std::move(data.request); + group_names = std::move(data.group_names); run_loop.Quit(); })); run_loop.Run(); EXPECT_EQ("", base::Base64Encode(msg)); + EXPECT_TRUE(group_names.empty()); } TEST_F(AdAuctionServiceImplTest, SerializesMultipleOwnersAuctionBlob) { @@ -7864,20 +7886,23 @@ task_environment()->FastForwardBy(base::Seconds(1)); std::vector<uint8_t> msg; + base::flat_map<url::Origin, std::vector<std::string>> group_names; base::RunLoop run_loop; manager_->GetInterestGroupAdAuctionData( - /*seller=*/test_origin_a, /*top_level_origin=*/test_origin_a, - base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) { - msg = inner_msg; + /*top_level_origin=*/test_origin_a, + base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"), + base::BindLambdaForTesting([&](BiddingAndAuctionData data) { + msg = std::move(data.request); + group_names = std::move(data.group_names); run_loop.Quit(); })); run_loop.Run(); std::string expected = - "pABYnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "pQBYagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn" - "dmVyc2lvbgBpcHVibGlzaGVybmh0dHBzOi8vYS50ZXN0bmludGVyZXN0R3JvdXBzom5odHRw" + "AABndmVyc2lvbgBpcHVibGlzaGVybmh0dHBzOi8vYS50ZXN0bGdlbmVyYXRpb25JZHgkMDAw" + "MDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwbmludGVyZXN0R3JvdXBzom5odHRw" "czovL2EudGVzdFiZH4sIAAAAAAAAAHXNOw7CMAwGYCi9UB+" "8VjgCAyuOY7VBrVPZAcQGOUsPShUGJASL9cu2/" "i+" @@ -7888,6 +7913,11 @@ "MaMrPyM/PAgowA36E6yG4AAAA="; EXPECT_EQ(1, absl::popcount(msg.size())); // Should be a power of 2. EXPECT_EQ(expected, base::Base64Encode(msg)); + EXPECT_THAT( + group_names, + testing::ElementsAre( + testing::Pair(test_origin_a, testing::ElementsAre("boats", "cars")), + testing::Pair(test_origin_b, testing::ElementsAre("trains")))); } TEST_F(AdAuctionServiceImplBAndATest, EncryptsPayload) { @@ -7921,7 +7951,7 @@ manager_->RecordInterestGroupWin( {test_origin, "cars"}, R"({"renderUrl": "https://c.test/ad2.html"})"); task_environment()->FastForwardBy(base::Seconds(1)); - absl::optional<std::string> result = + absl::optional<AdAuctionDataAndId> result = GetAdAuctionDataAndFlushForFrame(test_origin); EXPECT_TRUE(result.has_value()); @@ -7935,20 +7965,28 @@ sizeof(kTestPrivateKey)), key_config) .value(); - auto request = ohttp_gateway.DecryptObliviousHttpRequest(result.value()); + auto request = + ohttp_gateway.DecryptObliviousHttpRequest(result.value().request); EXPECT_TRUE(request.ok()) << request.status(); - std::string expected = - "pABYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - "AAAAAAAAAAAAAAAAAABndmVyc2lvbgBpcHVibGlzaGVybmh0dHBzOi8vYS50ZXN0bmludGVy" - "ZXN0R3JvdXBzoW5odHRwczovL2EudGVzdFh5H4sIAAAAAAAAAB3MSw6CUAxGYdEVqfgauwQH" - "Ti1tAzXwX9KihCF3LSxUw/" - "h8OfPCJJFlfziWXJ7OAupUmDxaknvq+gTFEDNfrjdUnsZQf1gNamOpXVnB066p7G8/GDZN7/" - "p9GiLn4pW369beybDm4gdbHLhHbgAAAA=="; - const auto got = request->GetPlaintextData(); - const auto* bytes = reinterpret_cast<const uint8_t*>(got.data()); - EXPECT_EQ(1, absl::popcount(got.size())); // Should be a power of 2. - EXPECT_EQ(expected, base::Base64Encode( - base::make_span(bytes, got.size() * sizeof(char)))); + auto got = request->GetPlaintextData(); + EXPECT_EQ(1, absl::popcount(got.size())); + // The generation ID is random, so match against everything before and + // everything after. + std::string got_str = cbor::DiagnosticWriter::Write( + cbor::Reader::Read(base::as_bytes(base::make_span(got))).value()); + EXPECT_THAT(got_str, testing::StartsWith( + R"({0: h'0000000000000000000000000000', )" + R"("version": 0, "publisher": "https://a.test", )" + R"("generationId": ")")); + EXPECT_THAT( + got_str, + testing::EndsWith( + R"(", )" + R"("interestGroups": {"https://a.test": )" + R"(h'1F8B08000000000000001DCC4B0E82500C4661D115A9F81ABB04074E2D6D033)" + R"(5F05FD2A28421772D2C54C3F87C39F3C22491657F38965C9ECE02EA54983C5A92)" + R"(7BEAFA04C510335FAE37549EC6507F580D6A63A95D59C1D3AEA9EC6F3F18364DE)" + R"(FFA7D1A22E7E295B7EBD6DEC9B0E6E2075B1CB8476E000000'}})")); } TEST_F(AdAuctionServiceImplBAndATest, OriginNotAllowed) { @@ -7974,10 +8012,10 @@ /*buyer_and_seller_reporting_id=*/absl::nullopt, "789"}}}) .Build(), GURL("https://a.test/example.html")); - absl::optional<std::string> result = + absl::optional<AdAuctionDataAndId> result = GetAdAuctionDataAndFlushForFrame(test_origin); EXPECT_TRUE(result.has_value()); - EXPECT_EQ("", result.value()); + EXPECT_EQ("", result.value().request); } } // namespace content
diff --git a/content/browser/interest_group/bidding_and_auction_serializer.cc b/content/browser/interest_group/bidding_and_auction_serializer.cc index d087272..e943f97 100644 --- a/content/browser/interest_group/bidding_and_auction_serializer.cc +++ b/content/browser/interest_group/bidding_and_auction_serializer.cc
@@ -4,6 +4,9 @@ #include "content/browser/interest_group/bidding_and_auction_serializer.h" +#include <algorithm> +#include <vector> + #include "base/containers/cxx20_erase.h" #include "base/json/json_string_value_serializer.h" #include "components/cbor/diagnostic_writer.h" @@ -156,42 +159,57 @@ } // namespace +BiddingAndAuctionData::BiddingAndAuctionData() = default; +BiddingAndAuctionData::BiddingAndAuctionData(BiddingAndAuctionData&& other) = + default; +BiddingAndAuctionData::~BiddingAndAuctionData() = default; + +BiddingAndAuctionData& BiddingAndAuctionData::operator=( + BiddingAndAuctionData&& other) = default; + BiddingAndAuctionSerializer::BiddingAndAuctionSerializer() { start_time_ = base::Time::Now(); } BiddingAndAuctionSerializer::BiddingAndAuctionSerializer( - BiddingAndAuctionSerializer&& state) = default; + BiddingAndAuctionSerializer&& other) = default; BiddingAndAuctionSerializer::~BiddingAndAuctionSerializer() = default; void BiddingAndAuctionSerializer::AddGroups( - std::string owner, + url::Origin owner, std::vector<StorageInterestGroup> groups) { base::EraseIf(groups, [](const StorageInterestGroup& group) { return (!group.interest_group.ads) || (group.interest_group.ads->size() == 0); }); if (groups.size() > 0) { - accumulated_groups_.emplace_back(owner, std::move(groups)); + accumulated_groups_.emplace_back(std::move(owner), std::move(groups)); } } -std::vector<uint8_t> BiddingAndAuctionSerializer::Build() { +BiddingAndAuctionData BiddingAndAuctionSerializer::Build() { if (accumulated_groups_.empty()) { return {}; } + BiddingAndAuctionData data; + cbor::Value::MapValue message_obj; message_obj[cbor::Value("version")] = cbor::Value(0); // "gzip" is the default so we don't need to specify the compression. // message_obj[cbor::Value("compression")] = cbor::Value("gzip"); + DCHECK(generation_id_.is_valid()); + message_obj[cbor::Value("generationId")] = + cbor::Value(generation_id_.AsLowercaseString()); message_obj[cbor::Value("publisher")] = cbor::Value(publisher_); cbor::Value::MapValue groups_map; groups_map.reserve(accumulated_groups_.size()); for (const auto& bidder_groups : accumulated_groups_) { cbor::Value::ArrayValue groups; + std::vector<std::string> names; for (const auto& group : bidder_groups.second) { cbor::Value group_obj = SerializeInterestGroup(start_time_, group); groups.emplace_back(std::move(group_obj)); + names.push_back(group.interest_group.name); } cbor::Value groups_obj(std::move(groups)); absl::optional<std::vector<uint8_t>> maybe_sub_message = @@ -201,8 +219,9 @@ bool success = compression::GzipCompress(maybe_sub_message.value(), &compressed_groups); DCHECK(success); - groups_map[cbor::Value(bidder_groups.first)] = + groups_map[cbor::Value(bidder_groups.first.Serialize())] = cbor::Value(compressed_groups, cbor::Value::Type::BYTE_STRING); + data.group_names.emplace(bidder_groups.first, std::move(names)); } message_obj[cbor::Value("interestGroups")] = @@ -264,7 +283,8 @@ cbor::Value message(std::move(message_obj)); absl::optional<std::vector<uint8_t>> maybe_msg = cbor::Writer::Write(message); DCHECK(maybe_msg); - return *maybe_msg; + data.request = std::move(*maybe_msg); + return data; } } // namespace content
diff --git a/content/browser/interest_group/bidding_and_auction_serializer.h b/content/browser/interest_group/bidding_and_auction_serializer.h index a88bbd26..b6622e6 100644 --- a/content/browser/interest_group/bidding_and_auction_serializer.h +++ b/content/browser/interest_group/bidding_and_auction_serializer.h
@@ -8,27 +8,44 @@ #include <string> #include <vector> +#include "base/containers/flat_map.h" #include "base/time/time.h" +#include "base/uuid.h" #include "content/browser/interest_group/storage_interest_group.h" +#include "content/common/content_export.h" namespace content { +struct CONTENT_EXPORT BiddingAndAuctionData { + BiddingAndAuctionData(); + BiddingAndAuctionData(BiddingAndAuctionData&& other); + ~BiddingAndAuctionData(); + + BiddingAndAuctionData& operator=(BiddingAndAuctionData&& other); + + std::vector<uint8_t> request; + base::flat_map<url::Origin, std::vector<std::string>> group_names; +}; + // Serializes Bidding and Auction requests class BiddingAndAuctionSerializer { public: BiddingAndAuctionSerializer(); - BiddingAndAuctionSerializer(BiddingAndAuctionSerializer&& state); + BiddingAndAuctionSerializer(BiddingAndAuctionSerializer&& other); ~BiddingAndAuctionSerializer(); void SetPublisher(std::string publisher) { publisher_ = publisher; } - // TODO(behamilton): void SetGenerationId(std::string generation_id); - void AddGroups(std::string owner, std::vector<StorageInterestGroup> groups); - std::vector<uint8_t> Build(); + void SetGenerationId(base::Uuid generation_id) { + generation_id_ = generation_id; + } + void AddGroups(url::Origin owner, std::vector<StorageInterestGroup> groups); + BiddingAndAuctionData Build(); private: + base::Uuid generation_id_; base::Time start_time_; std::string publisher_; - std::vector<std::pair<std::string, std::vector<StorageInterestGroup>>> + std::vector<std::pair<url::Origin, std::vector<StorageInterestGroup>>> accumulated_groups_; };
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc index ffe1536..200aac52 100644 --- a/content/browser/interest_group/interest_group_manager_impl.cc +++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -410,11 +410,12 @@ } void InterestGroupManagerImpl::GetInterestGroupAdAuctionData( - url::Origin seller, url::Origin top_level_origin, - base::OnceCallback<void(std::vector<uint8_t>)> callback) { + base::Uuid generation_id, + base::OnceCallback<void(BiddingAndAuctionData)> callback) { AdAuctionDataLoaderState state; state.serializer.SetPublisher(top_level_origin.Serialize()); + state.serializer.SetGenerationId(std::move(generation_id)); state.callback = std::move(callback); GetAllInterestGroupOwners(base::BindOnce( &InterestGroupManagerImpl::LoadNextInterestGroupAdAuctionData, @@ -444,7 +445,7 @@ std::vector<url::Origin> owners, url::Origin owner, std::vector<StorageInterestGroup> groups) { - state.serializer.AddGroups(owner.Serialize(), std::move(groups)); + state.serializer.AddGroups(std::move(owner), std::move(groups)); LoadNextInterestGroupAdAuctionData(std::move(state), std::move(owners)); }
diff --git a/content/browser/interest_group/interest_group_manager_impl.h b/content/browser/interest_group/interest_group_manager_impl.h index 5a4efcf..c089e11 100644 --- a/content/browser/interest_group/interest_group_manager_impl.h +++ b/content/browser/interest_group/interest_group_manager_impl.h
@@ -317,9 +317,9 @@ void UpdateLastKAnonymityReported(const std::string& key); void GetInterestGroupAdAuctionData( - url::Origin seller, url::Origin top_level_origin, - base::OnceCallback<void(std::vector<uint8_t>)> callback); + base::Uuid generation_id, + base::OnceCallback<void(BiddingAndAuctionData)> callback); void GetBiddingAndAuctionServerKey( network::mojom::URLLoaderFactory* loader, @@ -359,7 +359,7 @@ ~AdAuctionDataLoaderState(); AdAuctionDataLoaderState(AdAuctionDataLoaderState&& state); BiddingAndAuctionSerializer serializer; - base::OnceCallback<void(std::vector<uint8_t>)> callback; + base::OnceCallback<void(BiddingAndAuctionData)> callback; }; // Callbacks for CheckPermissionsAndJoinInterestGroup() and
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index b44d9243..b8649b77 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -1151,7 +1151,12 @@ void NavigationURLLoaderImpl::Clone( mojo::PendingReceiver<network::mojom::AcceptCHFrameObserver> listener) { - accept_ch_frame_observers_.Add(this, std::move(listener)); + // Use |kNavigationNetworkResponse| thread runner. Messages received related + // to AcceptCHFrame are not order dependent and can restart the navigation, + // blocking navigation when they do. + accept_ch_frame_observers_.Add( + this, std::move(listener), + GetUIThreadTaskRunner({BrowserTaskType::kNavigationNetworkResponse})); } // Returns true if an interceptor wants to handle the response, i.e. return a @@ -1335,8 +1340,12 @@ mojo::PendingRemote<network::mojom::AcceptCHFrameObserver> accept_ch_frame_observer; + // Use |kNavigationNetworkResponse| thread runner. Messages received related + // to AcceptCHFrame are not order dependent and can restart the navigation, + // blocking navigation when they do. accept_ch_frame_observers_.Add( - this, accept_ch_frame_observer.InitWithNewPipeAndPassReceiver()); + this, accept_ch_frame_observer.InitWithNewPipeAndPassReceiver(), + GetUIThreadTaskRunner({BrowserTaskType::kNavigationNetworkResponse})); FrameTreeNode* frame_tree_node = FrameTreeNode::GloballyFindByID(frame_tree_node_id_);
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index b8fe56a..334c126 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -881,14 +881,15 @@ data->set_intent(FrameDeleteIntentionToProto(intent)); } -// Returns an experimental process shutdown delay if the SubframeShutdownDelay -// experiment is enabled, 0 if not or if under memory pressure. This is used to -// keep subframe processes alive for a few seconds in case they can be reused. +// Returns the amount of time to keep subframe processes alive in case they can +// be reused. Returns zero if under memory pressure, as memory should be freed +// up as soon as possible if it's limited. base::TimeDelta GetSubframeProcessShutdownDelay( BrowserContext* browser_context) { static constexpr base::TimeDelta kZeroDelay; - if (!base::FeatureList::IsEnabled(features::kSubframeShutdownDelay)) + if (!RenderProcessHostImpl::ShouldDelayProcessShutdown()) { return kZeroDelay; + } // Don't delay process shutdown under memory pressure. Does not cancel // existing shutdown delays for processes already in delayed-shutdown state. @@ -13361,15 +13362,20 @@ ->common_params() .navigation_start); } - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce( - [](blink::mojom::LocalFrame::BeforeUnloadCallback callback, - base::TimeTicks start_time, base::TimeTicks end_time) { - std::move(callback).Run(/*proceed=*/true, start_time, end_time); - }, - std::move(before_unload_closure), send_before_unload_start_time_, - base::TimeTicks::Now())); + // Use a high-priority task to continue the navigation. This is safe as it + // happens early in the navigation flow and shouldn't race with any other + // tasks associated with this navigation. + GetUIThreadTaskRunner({BrowserTaskType::kBeforeUnloadBrowserResponse}) + ->PostTask( + FROM_HERE, + base::BindOnce( + [](blink::mojom::LocalFrame::BeforeUnloadCallback callback, + base::TimeTicks start_time, base::TimeTicks end_time) { + std::move(callback).Run(/*proceed=*/true, start_time, + end_time); + }, + std::move(before_unload_closure), + send_before_unload_start_time_, base::TimeTicks::Now())); return; } // Experiment to run beforeunload handlers at a higher priority in the
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc index 382dc2c..90bb4f88 100644 --- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc +++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -6057,16 +6057,8 @@ } } -class RenderFrameHostImplSubframeReuseBrowserTest - : public RenderFrameHostImplBrowserTest { - public: - RenderFrameHostImplSubframeReuseBrowserTest() { - scoped_feature_list_.InitAndEnableFeature(features::kSubframeShutdownDelay); - } - - protected: - base::test::ScopedFeatureList scoped_feature_list_; -}; +using RenderFrameHostImplSubframeReuseBrowserTest = + RenderFrameHostImplBrowserTest; IN_PROC_BROWSER_TEST_F(RenderFrameHostImplSubframeReuseBrowserTest, SubframeShutdownDelay) { @@ -6100,9 +6092,13 @@ // The process hosting the subframe should have its shutdown delayed and be // tracked in the pending-delete tracker. - ASSERT_TRUE(static_cast<RenderProcessHostImpl*>( - content::RenderProcessHost::FromID(subframe_process_id)) - ->IsProcessShutdownDelayedForTesting()); + auto* subframe_process_host = static_cast<RenderProcessHostImpl*>( + content::RenderProcessHost::FromID(subframe_process_id)); + if (RenderProcessHostImpl::ShouldDelayProcessShutdown()) { + ASSERT_TRUE(subframe_process_host->IsProcessShutdownDelayedForTesting()); + } else { + ASSERT_EQ(nullptr, subframe_process_host); + } // Wait for |url_2| to fully load so that its subframe loads. EXPECT_TRUE(WaitForLoadStop(web_contents())); @@ -6111,13 +6107,16 @@ // subframe, because they share the same site. RenderFrameHostImpl* new_rfh_b = root_frame_host()->child_at(0)->current_frame_host(); - ASSERT_EQ(subframe_process_id, new_rfh_b->GetProcess()->GetID()); + ASSERT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(), + subframe_process_id == new_rfh_b->GetProcess()->GetID()); // The process should no longer be in the pending-delete tracker, as it has // been reused. - ASSERT_FALSE(static_cast<RenderProcessHostImpl*>( - content::RenderProcessHost::FromID(subframe_process_id)) - ->IsProcessShutdownDelayedForTesting()); + if (RenderProcessHostImpl::ShouldDelayProcessShutdown()) { + ASSERT_FALSE(static_cast<RenderProcessHostImpl*>( + content::RenderProcessHost::FromID(subframe_process_id)) + ->IsProcessShutdownDelayedForTesting()); + } } // Test that multiple subframe-shutdown delays from the same source can be in @@ -6142,13 +6141,16 @@ const SiteInfo site_info = rfh->GetSiteInstance()->GetSiteInfo(); const base::TimeDelta delay = base::Seconds(5); process->DelayProcessShutdown(delay, base::TimeDelta(), site_info); - EXPECT_TRUE(process->IsProcessShutdownDelayedForTesting()); + EXPECT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(), + process->IsProcessShutdownDelayedForTesting()); process->DelayProcessShutdown(delay, base::TimeDelta(), site_info); - EXPECT_TRUE(process->IsProcessShutdownDelayedForTesting()); + EXPECT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(), + process->IsProcessShutdownDelayedForTesting()); // When one delay is cancelled, the other should remain in effect. process->CancelProcessShutdownDelay(site_info); - EXPECT_TRUE(process->IsProcessShutdownDelayedForTesting()); + EXPECT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(), + process->IsProcessShutdownDelayedForTesting()); process->CancelProcessShutdownDelay(site_info); EXPECT_FALSE(process->IsProcessShutdownDelayedForTesting()); }
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index f073add..15dc38f7 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2372,8 +2372,7 @@ shutdown_delay_ref_count_++; // Add to the delayed-shutdown tracker with the site that triggered the delay. - if (base::FeatureList::IsEnabled(features::kSubframeShutdownDelay) && - ShouldTrackProcessForSite(site_info)) { + if (ShouldDelayProcessShutdown() && ShouldTrackProcessForSite(site_info)) { SiteProcessCountTracker* delayed_shutdown_tracker = SiteProcessCountTracker::GetInstance( GetBrowserContext(), @@ -4635,6 +4634,15 @@ } // static +bool RenderProcessHostImpl::ShouldDelayProcessShutdown() { +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + return true; +#else + return false; +#endif +} + +// static void RenderProcessHost::WarmupSpareRenderProcessHost( content::BrowserContext* browser_context) { SpareRenderProcessHostManager::GetInstance().WarmupSpareRenderProcessHost( @@ -5509,11 +5517,11 @@ } } - // If there are no eligible existing RenderProcessHosts, - // experimentally add RenderProcessHosts whose shutdown is pending that - // previously hosted a frame for |site_url|. + // If there are no eligible existing RenderProcessHosts, add + // RenderProcessHosts whose shutdown is pending that previously hosted a frame + // for `site_url`. if (eligible_foreground_hosts.empty() && eligible_background_hosts.empty() && - base::FeatureList::IsEnabled(features::kSubframeShutdownDelay)) { + ShouldDelayProcessShutdown()) { SiteProcessCountTracker* delayed_shutdown_tracker = static_cast<SiteProcessCountTracker*>(browser_context->GetUserData( kDelayedShutdownSiteProcessCountTrackerKey)); @@ -5588,8 +5596,7 @@ // Remove from the delayed-shutdown tracker. This may have already been done // in StopTrackingProcessForShutdownDelay() if the process was reused before // this task executed. - if (base::FeatureList::IsEnabled(features::kSubframeShutdownDelay) && - ShouldTrackProcessForSite(site_info)) { + if (ShouldDelayProcessShutdown() && ShouldTrackProcessForSite(site_info)) { SiteProcessCountTracker* delayed_shutdown_tracker = SiteProcessCountTracker::GetInstance( GetBrowserContext(), @@ -5607,8 +5614,9 @@ } void RenderProcessHostImpl::StopTrackingProcessForShutdownDelay() { - if (!base::FeatureList::IsEnabled(features::kSubframeShutdownDelay)) + if (!ShouldDelayProcessShutdown()) { return; + } SiteProcessCountTracker* delayed_shutdown_tracker = SiteProcessCountTracker::GetInstance( GetBrowserContext(),
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index 5b2cb82..378b5448 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -412,6 +412,13 @@ static bool MayReuseAndIsSuitable(RenderProcessHost* host, SiteInstanceImpl* site_instance); + // Returns true if RenderProcessHost shutdown should be delayed by a few + // seconds to allow the subframe's process to be potentially reused. This aims + // to reduce process churn in navigations where the source and destination + // share subframes. Only returns true on platforms where process startup is + // expensive. + static bool ShouldDelayProcessShutdown(); + // Returns an existing RenderProcessHost for |site_info| in // |isolation_context|, if one exists. Otherwise a new RenderProcessHost // should be created and registered using RegisterProcessHostForSite(). This
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc index 69f9daf..0e9aa44 100644 --- a/content/browser/scheduler/browser_task_executor.cc +++ b/content/browser/scheduler/browser_task_executor.cc
@@ -18,6 +18,7 @@ #include "build/build_config.h" #include "content/browser/browser_process_io_thread.h" #include "content/browser/browser_thread_impl.h" +#include "content/common/features.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/common/content_features.h" @@ -98,6 +99,12 @@ case BrowserTaskType::kServiceWorkerStorageControlResponse: return QueueType::kServiceWorkerStorageControlResponse; + case BrowserTaskType::kBeforeUnloadBrowserResponse: + if (base::FeatureList::IsEnabled(kBeforeUnloadBrowserResponseQueue)) { + return QueueType::kBeforeUnloadBrowserResponse; + } + break; + case BrowserTaskType::kDefault: // Defer to traits.priority() below. break;
diff --git a/content/browser/scheduler/browser_task_queues.cc b/content/browser/scheduler/browser_task_queues.cc index eb962e2..7669374 100644 --- a/content/browser/scheduler/browser_task_queues.cc +++ b/content/browser/scheduler/browser_task_queues.cc
@@ -79,6 +79,8 @@ return QueueName::UI_NAVIGATION_NETWORK_RESPONSE_TQ; case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse: return QueueName::UI_SERVICE_WORKER_STORAGE_CONTROL_RESPONSE_TQ; + case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse: + return QueueName::UI_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ; } } @@ -100,6 +102,8 @@ return QueueName::IO_NAVIGATION_NETWORK_RESPONSE_TQ; case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse: return QueueName::IO_SERVICE_WORKER_STORAGE_CONTROL_RESPONSE_TQ; + case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse: + return QueueName::IO_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ; } } @@ -185,6 +189,9 @@ GetBrowserTaskQueue(QueueType::kServiceWorkerStorageControlResponse) ->SetQueuePriority(BrowserTaskPriority::kHighestPriority); + GetBrowserTaskQueue(QueueType::kBeforeUnloadBrowserResponse) + ->SetQueuePriority(BrowserTaskPriority::kHighPriority); + // Control queue control_queue_ = sequence_manager->CreateTaskQueue(base::sequence_manager::TaskQueue::Spec(
diff --git a/content/browser/scheduler/browser_task_queues.h b/content/browser/scheduler/browser_task_queues.h index 5a7bb3e..444fc14 100644 --- a/content/browser/scheduler/browser_task_queues.h +++ b/content/browser/scheduler/browser_task_queues.h
@@ -78,7 +78,10 @@ // after startup. kServiceWorkerStorageControlResponse, - kMaxValue = kServiceWorkerStorageControlResponse + // For before unload navigation continuation tasks. + kBeforeUnloadBrowserResponse, + + kMaxValue = kBeforeUnloadBrowserResponse }; static constexpr size_t kNumQueueTypes =
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.cc b/content/browser/scheduler/browser_ui_thread_scheduler.cc index 96cfc97a..3e9b950c 100644 --- a/content/browser/scheduler/browser_ui_thread_scheduler.cc +++ b/content/browser/scheduler/browser_ui_thread_scheduler.cc
@@ -234,6 +234,7 @@ case BrowserTaskQueues::QueueType::kUserInput: case BrowserTaskQueues::QueueType::kNavigationNetworkResponse: case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse: + case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse: return true; } NOTREACHED();
diff --git a/content/common/features.cc b/content/common/features.cc index b00c60f5..82263249 100644 --- a/content/common/features.cc +++ b/content/common/features.cc
@@ -11,6 +11,10 @@ // Please keep features in alphabetical order. +BASE_FEATURE(kBeforeUnloadBrowserResponseQueue, + "BeforeUnloadBrowserResponseQueue", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kNavigationUpdatesChildViewsVisibility, "NavigationUpdatesChildViewsVisibility", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/content/common/features.h b/content/common/features.h index 02133742..91d44b5 100644 --- a/content/common/features.h +++ b/content/common/features.h
@@ -14,6 +14,10 @@ // Please keep features in alphabetical order. +// When enabled, the browser will schedule before unload tasks that continue +// navigation network responses in a kHigh priority queue. +BASE_DECLARE_FEATURE(kBeforeUnloadBrowserResponseQueue); + // When enabled, RenderFrameHostManager::CommitPending will also update the // visibility of all child views, not just that of the main frame. CONTENT_EXPORT BASE_DECLARE_FEATURE(kNavigationUpdatesChildViewsVisibility); @@ -28,7 +32,6 @@ // IPC is sent to create all child frame proxies instead of sending one IPC per // proxy. BASE_DECLARE_FEATURE(kConsolidatedIPCForProxyCreation); - // TODO(https://crbug.com/1442346): Feature flag to guard extra CHECKs put in // place to ensure that the AllowBindings API on RenderFrameHost is not called // for documents outside of WebUI ones.
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java b/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java index 3dc5518..5483ae6 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java
@@ -46,9 +46,9 @@ import org.mockito.Mock; import org.mockito.stubbing.OngoingStubbing; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.HistogramWatcher; import org.chromium.blink.mojom.AndroidFontLookup; import org.chromium.blink.mojom.AndroidFontLookup.FetchAllFontFiles_Response; import org.chromium.blink.mojom.AndroidFontLookup.GetUniqueNameLookupTable_Response; @@ -153,7 +153,10 @@ whenFetchFontsWith(FONT_QUERY_2).thenReturn(result); whenFetchFontsWith(FONT_QUERY_3).thenReturn(result); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM); mAndroidFontLookup.fetchAllFontFiles(mFetchAllFontFilesCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mFetchAllFontFilesCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) @@ -164,10 +167,6 @@ assertNotNull(response.get(FULL_FONT_NAME_1)); assertNotNull(response.get(FULL_FONT_NAME_2)); assertNotNull(response.get(FULL_FONT_NAME_3)); - - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM)); } @SmallTest @@ -182,7 +181,10 @@ .thenReturn(new FontFamilyResult( FontFamilyResult.STATUS_UNEXPECTED_DATA_PROVIDED, null)); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM); mAndroidFontLookup.fetchAllFontFiles(mFetchAllFontFilesCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mFetchAllFontFilesCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) @@ -193,10 +195,6 @@ assertNotNull(response.get(FULL_FONT_NAME_1)); assertNotNull(response.get(FULL_FONT_NAME_2)); - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM)); - // Verify the font was removed from the lookup table. mAndroidFontLookup.getUniqueNameLookupTable(mGetUniqueNameLookupTableCallback); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); @@ -210,7 +208,10 @@ mAndroidFontLookup = new AndroidFontLookupImpl( mMockContext, mMockFontsContractWrapper, ImmutableMap.of()); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM); mAndroidFontLookup.fetchAllFontFiles(mFetchAllFontFilesCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mFetchAllFontFilesCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) @@ -250,16 +251,15 @@ @SmallTest @Test public void testMatchLocalFontByUniqueName_UnsupportedFontName() { + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); mAndroidFontLookup.matchLocalFontByUniqueName("baz", mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) .call(isNull()); - - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM)); } @SmallTest @@ -269,17 +269,16 @@ new FontFamilyResult(FontFamilyResult.STATUS_UNEXPECTED_DATA_PROVIDED, null); whenFetchFontsWith(FONT_QUERY_1).thenReturn(result); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); mAndroidFontLookup.matchLocalFontByUniqueName( FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) .call(isNull()); - - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM)); } @SmallTest @@ -288,17 +287,16 @@ FontFamilyResult result = new FontFamilyResult(FontFamilyResult.STATUS_OK, new FontInfo[0]); whenFetchFontsWith(FONT_QUERY_1).thenReturn(result); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); mAndroidFontLookup.matchLocalFontByUniqueName( FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) .call(isNull()); - - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM)); } @SmallTest @@ -309,17 +307,16 @@ new FontFamilyResult(FontFamilyResult.STATUS_OK, new FontInfo[] {fontInfo}); whenFetchFontsWith(FONT_QUERY_1).thenReturn(result); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); mAndroidFontLookup.matchLocalFontByUniqueName( FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) .call(isNull()); - - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM)); } @SmallTest @@ -327,17 +324,16 @@ public void testMatchLocalFontByUniqueName_Throws() throws NameNotFoundException { whenFetchFontsWith(FONT_QUERY_1).thenThrow(new NameNotFoundException()); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); mAndroidFontLookup.matchLocalFontByUniqueName( FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) .call(isNull()); - - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM)); } @SmallTest @@ -346,26 +342,30 @@ // Request font and fail. whenFetchFontsWith(FONT_QUERY_1).thenThrow(new NameNotFoundException()); - mAndroidFontLookup.matchLocalFontByUniqueName( - FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); - + { + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); + mAndroidFontLookup.matchLocalFontByUniqueName( + FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); + } mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) .call(isNull()); // Second request should early out with FAILED_AVOID_RETRY. - mAndroidFontLookup.matchLocalFontByUniqueName( - FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); - + { + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); + mAndroidFontLookup.matchLocalFontByUniqueName( + FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); + } mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL).times(2)) .call(isNull()); - - assertEquals(2, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM)); } @SmallTest @@ -376,17 +376,16 @@ new FontFamilyResult(FontFamilyResult.STATUS_OK, new FontInfo[] {fontInfo}); whenFetchFontsWith(FONT_QUERY_1).thenReturn(result); + HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher( + AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM); mAndroidFontLookup.matchLocalFontByUniqueName( FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback); + watcher.pollInstrumentationThreadUntilSatisfied(); mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS); verify(mMatchLocalFontByUniqueNameCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)) .call(notNull()); - - assertEquals(1, - RecordHistogram.getHistogramTotalCountForTesting( - AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM)); } private OngoingStubbing<FontFamilyResult> whenFetchFontsWith(String query)
diff --git a/content/public/browser/browser_task_traits.h b/content/public/browser/browser_task_traits.h index aeae520..15f14fc6 100644 --- a/content/public/browser/browser_task_traits.h +++ b/content/public/browser/browser_task_traits.h
@@ -35,6 +35,14 @@ // Tasks processing ServiceWorker's storage control's response. // TODO(chikamune): Make this content-internal. kServiceWorkerStorageControlResponse, + + // Task continuing navigation asynchronously after determining that no before + // unload handlers are registered in the unloading render. + // NOTE: This task type should not be used for other navigation-related tasks + // as they should be ordered w.r.t. IPC channel and the UI thread's default + // task runner. Reach out to navigation-dev@ before adding new usages. + kBeforeUnloadBrowserResponse, + }; class CONTENT_EXPORT BrowserTaskTraits {
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 02183fe..057ee7c6 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -735,7 +735,7 @@ base::FEATURE_ENABLED_BY_DEFAULT); // When NavigationNetworkResponseQueue is enabled, the browser will schedule -// some tasks related to navigation network responses in a kHighest priority +// some tasks related to navigation network responses in a kHigh priority // queue. BASE_FEATURE(kNavigationNetworkResponseQueue, "NavigationNetworkResponseQueue", @@ -1183,20 +1183,6 @@ "SignedHTTPExchange", base::FEATURE_ENABLED_BY_DEFAULT); -// Delays RenderProcessHost shutdown by a few seconds to allow the subframe's -// process to be potentially reused. This aims to reduce process churn in -// navigations where the source and destination share subframes. -// This is enabled only on platforms where the behavior leads to performance -// gains, i.e., those where process startup is expensive. -BASE_FEATURE(kSubframeShutdownDelay, - "SubframeShutdownDelay", -#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) - base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) -); - // If enabled, GetUserMedia API will only work when the concerned tab is in // focus BASE_FEATURE(kUserMediaCaptureOnFocus,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index ddb5fcb8..5353eaa5 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -290,7 +290,6 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kSpareRendererForSitePerProcess); CONTENT_EXPORT BASE_DECLARE_FEATURE(kStopVideoCaptureOnScreenLock); CONTENT_EXPORT BASE_DECLARE_FEATURE(kStrictOriginIsolation); -CONTENT_EXPORT BASE_DECLARE_FEATURE(kSubframeShutdownDelay); CONTENT_EXPORT BASE_DECLARE_FEATURE(kSuppressDifferentOriginSubframeJSDialogs); CONTENT_EXPORT BASE_DECLARE_FEATURE(kSurfaceSyncFullscreenKillswitch); CONTENT_EXPORT BASE_DECLARE_FEATURE(kSyntheticPointerActions);
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist index 7257ad1..46ce19d 100644 --- a/content/test/content_test_bundle_data.filelist +++ b/content/test/content_test_bundle_data.filelist
@@ -4641,8 +4641,6 @@ data/accessibility/html/wbr-expected-uia-win.txt data/accessibility/html/wbr-expected-win.txt data/accessibility/html/wbr.html -data/accessibility/html/whitespace-dynamic-expected-blink.txt -data/accessibility/html/whitespace-dynamic.html data/accessibility/html/window-crops-items-expected-blink.txt data/accessibility/html/window-crops-items.html data/accessibility/language-detection/dynamic-basic-expected-blink.txt
diff --git a/content/test/data/accessibility/html/whitespace-dynamic-expected-blink.txt b/content/test/data/accessibility/html/whitespace-dynamic-expected-blink.txt deleted file mode 100644 index 35bf59f..0000000 --- a/content/test/data/accessibility/html/whitespace-dynamic-expected-blink.txt +++ /dev/null
@@ -1,8 +0,0 @@ -rootWebArea -++genericContainer ignored -++++genericContainer ignored -++++++genericContainer name='Done' -++++++paragraph ignored invisible -++++++++staticText ignored invisible name='Should end up with a trailing whitespace ' -++++++++genericContainer ignored invisible -++++++++++staticText ignored invisible name='link'
diff --git a/content/test/data/accessibility/html/whitespace-dynamic.html b/content/test/data/accessibility/html/whitespace-dynamic.html deleted file mode 100644 index 299478af..0000000 --- a/content/test/data/accessibility/html/whitespace-dynamic.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!-- -@WAIT-FOR:Done ---> - -<!doctype HTML> -<div tabindex="0" id="status" aria-label="Working"></div> -<p id=p style="visibility:hidden"> -Should end up with a trailing whitespace -</p> -<script> -setTimeout(() => { - let a = document.createElement("a"); - a.innerText = "link"; - p.appendChild(a); - setTimeout(() => { - document.getElementById('status').setAttribute('aria-label', 'Done'); - }, 0); -}, 1000); -</script>
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 5f0ea8b..d239bcf 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -451,30 +451,16 @@ ## D3D9 / AMD RX 5500 XT / Passthrough command decoder ## -# Skipping several recent flakes as the UPF incorrectly removed the suppressions. -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-256-character-define.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-conditional-scoping-negative.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-function-scoped-struct.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-non-reserved-words-4-of-8.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-non-reserved-words-5-of-8.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-too-many-uniforms.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/uninitialized-local-global-variables.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/samplers/glsl-function-texture2dprojlod.html [ Skip ] +# Random GPU process hangs on this bot are causing random D3D9 test faiures. Retry +# all tests for the moment so that the test suite can remain enabled on this bot. +crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/* [ RetryOnFailure ] + crbug.com/1159126 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/ogles/GL/* [ RetryOnFailure ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/reading/read-pixels-test.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/rendering/default-texture-draw-bug.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/rendering/gl-scissor-test.html [ Skip ] crbug.com/1159126 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/uniforms/* [ RetryOnFailure ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/misc/texture-active-bind.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/misc/texture-draw-with-2d-and-cube.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/misc/texture-npot-video.html [ Skip ] crbug.com/1361088 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Skip ] crbug.com/1361088 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Skip ] crbug.com/1362937 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/uniforms/uniform-values-per-program.html [ Failure ] crbug.com/1362937 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/uniforms/uniform-default-values.html [ Failure ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] deqp/data/gles2/shaders/constant_expressions.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] deqp/data/gles2/shaders/conversions_scalar_to_scalar.html [ Skip ] -crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] deqp/data/gles2/shaders/swizzles_bvec4.html [ Skip ] ## win10 / angle-d3d11 / Passthrough command decoder failures ##
diff --git a/device/BUILD.gn b/device/BUILD.gn index bfe0aa3..99855ec 100644 --- a/device/BUILD.gn +++ b/device/BUILD.gn
@@ -473,7 +473,7 @@ android_library("bluetooth_test_java") { testonly = true - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + sources = bluetooth_java_sources_needing_jni deps = [ "//base:base_java", @@ -484,7 +484,10 @@ "//third_party/androidx:androidx_annotation_annotation_java", ] - srcjar_deps = [ ":bluetooth_test_javagen" ] + srcjar_deps = [ + ":bluetooth_test_javagen", + ":bluetooth_test_jni_headers", + ] } robolectric_binary("device_junit_tests") {
diff --git a/device/bluetooth/BUILD.gn b/device/bluetooth/BUILD.gn index d075d1f..52940b9 100644 --- a/device/bluetooth/BUILD.gn +++ b/device/bluetooth/BUILD.gn
@@ -682,6 +682,7 @@ } android_library("java") { + srcjar_deps = [ ":jni_headers" ] sources = java_sources_needing_jni deps = [ "//base:base_java", @@ -690,6 +691,5 @@ "//components/location/android:location_java", "//third_party/androidx:androidx_annotation_annotation_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } }
diff --git a/device/bluetooth/floss/bluetooth_socket_floss.cc b/device/bluetooth/floss/bluetooth_socket_floss.cc index d8cd051b..a0437f9 100644 --- a/device/bluetooth/floss/bluetooth_socket_floss.cc +++ b/device/bluetooth/floss/bluetooth_socket_floss.cc
@@ -214,11 +214,20 @@ // We also always want to be accepting and queue up connections here to be // consumed when in the ready state. - if (state == FlossSocketManager::ServerSocketState::kReady) { + if (state == FlossSocketManager::ServerSocketState::kReady && + status == FlossDBusClient::BtifStatus::kSuccess) { FlossDBusManager::Get()->GetSocketManager()->Accept( listening_socket_info_->id, absl::nullopt, base::BindOnce(&BluetoothSocketFloss::CompleteAccept, weak_ptr_factory_.GetWeakPtr())); + return; + } + + if (status != FlossDBusClient::BtifStatus::kSuccess && accept_request_) { + std::move(accept_request_->error_callback) + .Run(net::ErrorToString(net::ERR_CONNECTION_FAILED)); + accept_request_.reset(nullptr); + return; } }
diff --git a/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc b/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc index 516779f..3d133655 100644 --- a/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc +++ b/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc
@@ -276,6 +276,33 @@ client_socket = nullptr; ClearCounters(); + // Accept a connection when there's nothing there and then receives connection + // failed. + { + base::RunLoop run_loop; + server_socket->Accept( + base::BindOnce(&BluetoothSocketFlossTest::AcceptSuccessCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure()), + base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback, + weak_ptr_factory_.GetWeakPtr(), + run_loop.QuitWhenIdleClosure())); + run_loop.RunUntilIdle(); + + // No sockets found to accept. + EXPECT_EQ(0, success_callback_count_); + EXPECT_EQ(0, error_callback_count_); + + GetFakeFlossSocketManager()->SendSocketReady( + id, device::BluetoothUUID(FakeFlossSocketManager::kRfcommUuid), + FlossDBusClient::BtifStatus::kFail); + + EXPECT_EQ(1, error_callback_count_); + EXPECT_EQ(0, success_callback_count_); + EXPECT_TRUE(last_socket_.get() == nullptr); + ClearCounters(); + } + // Accept a connection when there's nothing there and then send connection. { // First runloop will push the accept callbacks into socket.
diff --git a/device/bluetooth/floss/fake_floss_socket_manager.cc b/device/bluetooth/floss/fake_floss_socket_manager.cc index 43f80854..62a81a4 100644 --- a/device/bluetooth/floss/fake_floss_socket_manager.cc +++ b/device/bluetooth/floss/fake_floss_socket_manager.cc
@@ -220,8 +220,7 @@ socket.uuid = uuid; auto& [state_changed, accepted] = listening_sockets_to_callbacks_[id]; - state_changed.Run(ServerSocketState::kReady, std::move(socket), - BtifStatus::kSuccess); + state_changed.Run(ServerSocketState::kReady, std::move(socket), status); } }
diff --git a/device/bluetooth/floss/floss_adapter_client.cc b/device/bluetooth/floss/floss_adapter_client.cc index 51bf9fa..e59af23 100644 --- a/device/bluetooth/floss/floss_adapter_client.cc +++ b/device/bluetooth/floss/floss_adapter_client.cc
@@ -10,6 +10,7 @@ #include "base/functional/callback.h" #include "base/logging.h" #include "base/observer_list.h" +#include "base/strings/string_number_conversions.h" #include "dbus/bus.h" #include "dbus/exported_object.h" #include "dbus/message.h" @@ -34,6 +35,7 @@ "org.chromium.Error.UnknownAdapter"; constexpr char FlossAdapterClient::kExportedCallbacksPath[] = "/org/chromium/bluetooth/adapterclient"; +static uint32_t callback_path_index_ = 0; void FlossAdapterClient::SetName(ResponseCallback<Void> callback, const std::string& name) { @@ -204,6 +206,9 @@ bus_ = bus; adapter_path_ = GenerateAdapterPath(adapter_index); service_name_ = service_name; + exported_callback_path_ = + kExportedCallbacksPath + base::NumberToString(callback_path_index_); + callback_path_index_++; dbus::ObjectProxy* object_proxy = bus_->GetObjectProxy(service_name_, adapter_path_); @@ -213,7 +218,7 @@ } dbus::ExportedObject* callbacks = - bus_->GetExportedObject(dbus::ObjectPath(kExportedCallbacksPath)); + bus_->GetExportedObject(dbus::ObjectPath(exported_callback_path_)); if (!callbacks) { LOG(ERROR) << "FlossAdapterClient couldn't export client callbacks"; return; @@ -300,18 +305,18 @@ property_address_.Init( this, bus_, service_name_, adapter_path_, - dbus::ObjectPath(kExportedCallbacksPath), + dbus::ObjectPath(exported_callback_path_), base::BindRepeating(&FlossAdapterClient::OnAddressChanged, weak_ptr_factory_.GetWeakPtr())); property_name_.Init(this, bus_, service_name_, adapter_path_, - dbus::ObjectPath(kExportedCallbacksPath), + dbus::ObjectPath(exported_callback_path_), base::BindRepeating(&FlossAdapterClient::OnNameChanged, weak_ptr_factory_.GetWeakPtr())); property_discoverable_.Init( this, bus_, service_name_, adapter_path_, - dbus::ObjectPath(kExportedCallbacksPath), + dbus::ObjectPath(exported_callback_path_), base::BindRepeating(&FlossAdapterClient::OnDiscoverableChanged, weak_ptr_factory_.GetWeakPtr())); @@ -322,13 +327,13 @@ CallAdapterMethod<Void>( base::BindOnce(&FlossAdapterClient::OnRegisterCallbacks, weak_ptr_factory_.GetWeakPtr()), - adapter::kRegisterCallback, dbus::ObjectPath(kExportedCallbacksPath)); + adapter::kRegisterCallback, dbus::ObjectPath(exported_callback_path_)); CallAdapterMethod<Void>( base::BindOnce(&FlossAdapterClient::OnRegisterCallbacks, weak_ptr_factory_.GetWeakPtr()), adapter::kRegisterConnectionCallback, - dbus::ObjectPath(kExportedCallbacksPath)); + dbus::ObjectPath(exported_callback_path_)); on_ready_ = std::move(on_ready); } @@ -699,7 +704,7 @@ FlossAdapterClient::FlossAdapterClient() = default; FlossAdapterClient::~FlossAdapterClient() { if (bus_) { - bus_->UnregisterExportedObject(dbus::ObjectPath(kExportedCallbacksPath)); + bus_->UnregisterExportedObject(dbus::ObjectPath(exported_callback_path_)); } }
diff --git a/device/bluetooth/floss/floss_adapter_client.h b/device/bluetooth/floss/floss_adapter_client.h index 3603804c..62d4dd7 100644 --- a/device/bluetooth/floss/floss_adapter_client.h +++ b/device/bluetooth/floss/floss_adapter_client.h
@@ -414,6 +414,9 @@ // Service which implements the adapter interface. std::string service_name_; + // Object path for exported callbacks registered to this client. + std::string exported_callback_path_; + // Cached discoverable timeout value (updates on init and on discoverable // state changes). uint32_t discoverable_timeout_ = 0;
diff --git a/device/fido/features.cc b/device/fido/features.cc index af5669d2..b7a844d 100644 --- a/device/fido/features.cc +++ b/device/fido/features.cc
@@ -98,4 +98,9 @@ "WebAuthenticationPrelinkPlayServices", base::FEATURE_ENABLED_BY_DEFAULT); +// Enabled in M116. Remove in or after M119. +BASE_FEATURE(kWebAuthnSkipSingleAccountMacOS, + "WebAuthenticationSkipSingleAccountMacOS", + base::FEATURE_ENABLED_BY_DEFAULT); + } // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h index 0bbcf56..2f17d50 100644 --- a/device/fido/features.h +++ b/device/fido/features.h
@@ -74,6 +74,10 @@ COMPONENT_EXPORT(DEVICE_FIDO) BASE_DECLARE_FEATURE(kWebAuthnPrelinkPlayServices); +// Don't show the single-account sheet on macOS if Touch ID is available. +COMPONENT_EXPORT(DEVICE_FIDO) +BASE_DECLARE_FEATURE(kWebAuthnSkipSingleAccountMacOS); + } // namespace device #endif // DEVICE_FIDO_FEATURES_H_
diff --git a/device/fido/mac/util.h b/device/fido/mac/util.h index bdd1c53..c2358ae 100644 --- a/device/fido/mac/util.h +++ b/device/fido/mac/util.h
@@ -69,6 +69,7 @@ // to whether the device supports Touch ID, and whether the sensor is ready to // be used (i.e. not soft-locked from consecutive bad attempts; laptop lid not // closed). +COMPONENT_EXPORT(DEVICE_FIDO) bool DeviceHasBiometricsAvailable(); } // namespace device::fido::mac
diff --git a/device/vr/BUILD.gn b/device/vr/BUILD.gn index e698f6fd..7a929a6a 100644 --- a/device/vr/BUILD.gn +++ b/device/vr/BUILD.gn
@@ -384,6 +384,7 @@ } android_library("java") { + srcjar_deps = [ ":jni_headers" ] sources = java_sources_needing_jni deps = [ "//base:base_java", @@ -392,6 +393,5 @@ "//third_party/gvr-android-sdk:gvr_common_java", "//ui/android:ui_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } }
diff --git a/extensions/common/feature_switch.h b/extensions/common/feature_switch.h index e18177e..17b2018 100644 --- a/extensions/common/feature_switch.h +++ b/extensions/common/feature_switch.h
@@ -83,7 +83,8 @@ std::string GetLegacyDisableFlag() const; bool ComputeValue() const; - raw_ptr<const base::CommandLine> command_line_; + // TODO(crbug.com/1449286): detect under BRP. + raw_ptr<const base::CommandLine, DanglingUntriaged> command_line_; const char* switch_name_; bool default_value_; OverrideValue override_value_;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index a43dcc1f..601ca6f 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -313,24 +313,6 @@ GLenum target_; }; -// Temporarily changes a decoder's bound render buffer and restore it when this -// object goes out of scope. -class ScopedRenderBufferBinder { - public: - explicit ScopedRenderBufferBinder(ContextState* state, - ErrorState* error_state, - GLuint id); - - ScopedRenderBufferBinder(const ScopedRenderBufferBinder&) = delete; - ScopedRenderBufferBinder& operator=(const ScopedRenderBufferBinder&) = delete; - - ~ScopedRenderBufferBinder(); - - private: - raw_ptr<ContextState> state_; - raw_ptr<ErrorState> error_state_; -}; - // Temporarily changes a decoder's bound frame buffer and restore it when this // object goes out of scope. class ScopedFramebufferBinder { @@ -437,43 +419,6 @@ scoped_refptr<TextureRef> texture_ref_; }; -// Encapsulates an OpenGL render buffer of any format. -class BackRenderbuffer { - public: - explicit BackRenderbuffer(GLES2DecoderImpl* decoder); - - BackRenderbuffer(const BackRenderbuffer&) = delete; - BackRenderbuffer& operator=(const BackRenderbuffer&) = delete; - - ~BackRenderbuffer(); - - // Create a new render buffer. - void Create(); - - // Set the initial size and format of a render buffer or resize it. - bool AllocateStorage(const gfx::Size& size, GLenum format); - - // Destroy the render buffer. This must be explicitly called before destroying - // this object. - void Destroy(); - - // Invalidate the render buffer. This can be used when a context is lost and - // it is not possible to make it current in order to free the resource. - void Invalidate(); - - GLuint id() const { - return id_; - } - - gl::GLApi* api() const; - - private: - raw_ptr<GLES2DecoderImpl> decoder_; - MemoryTypeTracker memory_tracker_; - size_t bytes_allocated_; - GLuint id_; -}; - // Encapsulates an OpenGL frame buffer. class BackFramebuffer { public: @@ -490,10 +435,6 @@ // Attach a color render buffer to a frame buffer. void AttachRenderTexture(BackTexture* texture); - // Attach a render buffer to a frame buffer. Note that this unbinds any - // currently bound frame buffer. - void AttachRenderBuffer(GLenum target, BackRenderbuffer* render_buffer); - // Destroy the frame buffer. This must be explicitly called before destroying // this object. void Destroy(); @@ -815,7 +756,6 @@ friend class ScopedResolvedFramebufferBinder; friend class ScopedFramebufferCopyBinder; friend class BackFramebuffer; - friend class BackRenderbuffer; friend class BackTexture; enum FramebufferOperation { @@ -2562,14 +2502,9 @@ // The size of fiixed attrib buffer. GLsizei fixed_attrib_buffer_size_; - // The offscreen frame buffer that the client renders to. With EGL, the - // depth and stencil buffers are separate. With regular GL there is a single - // packed depth stencil buffer in offscreen_target_depth_render_buffer_. - // offscreen_target_stencil_render_buffer_ is unused. + // The offscreen frame buffer that the client renders to. std::unique_ptr<BackFramebuffer> offscreen_target_frame_buffer_; std::unique_ptr<BackTexture> offscreen_target_color_texture_; - std::unique_ptr<BackRenderbuffer> offscreen_target_depth_render_buffer_; - std::unique_ptr<BackRenderbuffer> offscreen_target_stencil_render_buffer_; std::unique_ptr<GLES2ExternalFramebuffer> external_default_framebuffer_; @@ -2577,9 +2512,6 @@ // framebuffer. GLenum offscreen_target_color_format_; - GLenum offscreen_target_depth_format_; - GLenum offscreen_target_stencil_format_; - GLint max_offscreen_framebuffer_size_; // Whether the client requested an offscreen buffer with an alpha channel. @@ -2797,21 +2729,6 @@ state_->RestoreActiveTexture(); } -ScopedRenderBufferBinder::ScopedRenderBufferBinder(ContextState* state, - ErrorState* error_state, - GLuint id) - : state_(state), error_state_(error_state) { - ScopedGLErrorSuppressor suppressor("ScopedRenderBufferBinder::ctor", - error_state_); - state->api()->glBindRenderbufferEXTFn(GL_RENDERBUFFER, id); -} - -ScopedRenderBufferBinder::~ScopedRenderBufferBinder() { - ScopedGLErrorSuppressor suppressor("ScopedRenderBufferBinder::dtor", - error_state_); - state_->RestoreRenderbufferBindings(); -} - ScopedFramebufferBinder::ScopedFramebufferBinder(GLES2DecoderImpl* decoder, GLuint id) : decoder_(decoder) { @@ -3006,102 +2923,6 @@ return GL_TEXTURE_2D; } -BackRenderbuffer::BackRenderbuffer(GLES2DecoderImpl* decoder) - : decoder_(decoder), - memory_tracker_(decoder->memory_tracker()), - bytes_allocated_(0), - id_(0) {} - -BackRenderbuffer::~BackRenderbuffer() { - // This does not destroy the render buffer because that would require that - // the associated GL context was current. Just check that it was explicitly - // destroyed. - DCHECK_EQ(id_, 0u); -} - -inline gl::GLApi* BackRenderbuffer::api() const { - return decoder_->api(); -} - -void BackRenderbuffer::Create() { - ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Create", - decoder_->error_state_.get()); - Destroy(); - api()->glGenRenderbuffersEXTFn(1, &id_); -} - -bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, GLenum format) { - ScopedGLErrorSuppressor suppressor("BackRenderbuffer::AllocateStorage", - decoder_->error_state_.get()); - ScopedRenderBufferBinder binder(&decoder_->state_, - decoder_->error_state_.get(), id_); - - uint32_t estimated_size = 0; - if (!decoder_->renderbuffer_manager()->ComputeEstimatedRenderbufferSize( - size.width(), size.height(), /*samples=*/0, format, - &estimated_size)) { - return false; - } - - // TODO(kainino): This path will not perform RegenerateRenderbufferIfNeeded on - // devices where multisample_renderbuffer_resize_emulation or - // depth_stencil_renderbuffer_resize_emulation is needed. Thus any code using - // this path (nacl/ppapi?) could encounter issues on those - // devices. RenderbufferStorageMultisampleWithWorkaround should be used - // instead, but can only be used if BackRenderbuffer tracks its renderbuffers - // in the renderbuffer manager instead of manually. http://crbug.com/731287 - decoder_->RenderbufferStorageMultisampleHelper(GL_RENDERBUFFER, /*samples=*/0, - format, size.width(), - size.height(), kDoNotForce); - - bool alpha_channel_needs_clear = - (format == GL_RGBA || format == GL_RGBA8) && - !decoder_->offscreen_buffer_should_have_alpha_; - if (alpha_channel_needs_clear) { - GLuint fbo; - api()->glGenFramebuffersEXTFn(1, &fbo); - { - ScopedFramebufferBinder frame_binder(decoder_, fbo); - api()->glFramebufferRenderbufferEXTFn( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, id_); - api()->glClearColorFn(0, 0, 0, decoder_->BackBufferAlphaClearColor()); - decoder_->state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - decoder_->state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); - decoder_->ClearDeviceWindowRectangles(); - api()->glClearFn(GL_COLOR_BUFFER_BIT); - decoder_->RestoreClearState(); - } - api()->glDeleteFramebuffersEXTFn(1, &fbo); - } - - bool success = api()->glGetErrorFn() == GL_NO_ERROR; - if (success) { - // Mark the previously allocated bytes as free. - memory_tracker_.TrackMemFree(bytes_allocated_); - bytes_allocated_ = estimated_size; - // Track the newly allocated bytes. - memory_tracker_.TrackMemAlloc(bytes_allocated_); - } - return success; -} - -void BackRenderbuffer::Destroy() { - if (id_ != 0) { - ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Destroy", - decoder_->error_state_.get()); - api()->glDeleteRenderbuffersEXTFn(1, &id_); - id_ = 0; - } - memory_tracker_.TrackMemFree(bytes_allocated_); - bytes_allocated_ = 0; -} - -void BackRenderbuffer::Invalidate() { - id_ = 0; - memory_tracker_.TrackMemFree(bytes_allocated_); - bytes_allocated_ = 0; -} - BackFramebuffer::BackFramebuffer(GLES2DecoderImpl* decoder) : decoder_(decoder), id_(0) { @@ -3135,17 +2956,6 @@ texture->Target(), attach_id, 0); } -void BackFramebuffer::AttachRenderBuffer(GLenum target, - BackRenderbuffer* render_buffer) { - DCHECK_NE(id_, 0u); - ScopedGLErrorSuppressor suppressor("BackFramebuffer::AttachRenderBuffer", - decoder_->error_state_.get()); - ScopedFramebufferBinder binder(decoder_, id_); - GLuint attach_id = render_buffer ? render_buffer->id() : 0; - api()->glFramebufferRenderbufferEXTFn(GL_FRAMEBUFFER, target, GL_RENDERBUFFER, - attach_id); -} - void BackFramebuffer::Destroy() { if (id_ != 0) { ScopedGLErrorSuppressor suppressor("BackFramebuffer::Destroy", @@ -3206,8 +3016,6 @@ fixed_attrib_buffer_id_(0), fixed_attrib_buffer_size_(0), offscreen_target_color_format_(0), - offscreen_target_depth_format_(0), - offscreen_target_stencil_format_(0), max_offscreen_framebuffer_size_(0), offscreen_buffer_should_have_alpha_(false), back_buffer_color_format_(0), @@ -3464,40 +3272,10 @@ #else offscreen_buffer_should_have_alpha_ = false; #endif - if (gl_version_info().is_es) { - offscreen_target_color_format_ = - offscreen_buffer_should_have_alpha_ || - workarounds().disable_gl_rgb_format - ? GL_RGBA - : GL_RGB; - - // ANGLE only supports packed depth/stencil formats, so use it if it is - // available. - const bool depth24_stencil8_supported = - feature_info_->feature_flags().packed_depth24_stencil8; - VLOG(1) << "GL_OES_packed_depth_stencil " - << (depth24_stencil8_supported ? "" : "not ") << "supported."; - - offscreen_target_depth_format_ = 0; - offscreen_target_stencil_format_ = 0; - } else { - offscreen_target_color_format_ = - offscreen_buffer_should_have_alpha_ || - workarounds().disable_gl_rgb_format - ? GL_RGBA - : GL_RGB; - - // If depth is requested at all, use the packed depth stencil format if - // it's available, as some desktop GL drivers don't support any non-packed - // formats for depth attachments. - const bool depth24_stencil8_supported = - feature_info_->feature_flags().packed_depth24_stencil8; - VLOG(1) << "GL_EXT_packed_depth_stencil " - << (depth24_stencil8_supported ? "" : "not ") << "supported."; - - offscreen_target_depth_format_ = 0; - offscreen_target_stencil_format_ = 0; - } + offscreen_target_color_format_ = offscreen_buffer_should_have_alpha_ || + workarounds().disable_gl_rgb_format + ? GL_RGBA + : GL_RGB; max_offscreen_framebuffer_size_ = std::min(renderbuffer_manager()->max_renderbuffer_size(), @@ -3621,12 +3399,6 @@ offscreen_target_frame_buffer_->Create(); offscreen_target_color_texture_ = std::make_unique<BackTexture>(this); offscreen_target_color_texture_->Create(); - offscreen_target_depth_render_buffer_ = - std::make_unique<BackRenderbuffer>(this); - offscreen_target_depth_render_buffer_->Create(); - offscreen_target_stencil_render_buffer_ = - std::make_unique<BackRenderbuffer>(this); - offscreen_target_stencil_render_buffer_->Create(); // Allocate the render buffers at their initial size and check the status // of the frame buffers is okay. @@ -4805,7 +4577,7 @@ return external_default_framebuffer_->GetDepthFormat(); } if (offscreen_target_frame_buffer_.get()) { - return offscreen_target_depth_format_; + return 0; } if (back_buffer_has_depth_) return GL_DEPTH; @@ -4826,7 +4598,7 @@ return external_default_framebuffer_->GetStencilFormat(); } if (offscreen_target_frame_buffer_.get()) { - return offscreen_target_stencil_format_; + return 0; } if (back_buffer_has_stencil_) return GL_STENCIL; @@ -4990,19 +4762,11 @@ offscreen_target_frame_buffer_->Destroy(); if (offscreen_target_color_texture_.get()) offscreen_target_color_texture_->Destroy(); - if (offscreen_target_depth_render_buffer_.get()) - offscreen_target_depth_render_buffer_->Destroy(); - if (offscreen_target_stencil_render_buffer_.get()) - offscreen_target_stencil_render_buffer_->Destroy(); } else { if (offscreen_target_frame_buffer_.get()) offscreen_target_frame_buffer_->Invalidate(); if (offscreen_target_color_texture_.get()) offscreen_target_color_texture_->Invalidate(); - if (offscreen_target_depth_render_buffer_.get()) - offscreen_target_depth_render_buffer_->Invalidate(); - if (offscreen_target_stencil_render_buffer_.get()) - offscreen_target_stencil_render_buffer_->Invalidate(); for (auto& fence : deschedule_until_finished_fences_) { fence->Invalidate(); } @@ -5086,8 +4850,6 @@ offscreen_target_frame_buffer_.reset(); offscreen_target_color_texture_.reset(); - offscreen_target_depth_render_buffer_.reset(); - offscreen_target_stencil_render_buffer_.reset(); // Release all fences now, because some fence types need the context to be // current on destruction. @@ -5231,40 +4993,10 @@ << "to allocate storage for offscreen target color texture."; return false; } - if (offscreen_target_depth_format_ && - !offscreen_target_depth_render_buffer_->AllocateStorage( - offscreen_size_, offscreen_target_depth_format_)) { - LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFramebuffer failed " - << "to allocate storage for offscreen target depth buffer."; - return false; - } - if (offscreen_target_stencil_format_ && - !offscreen_target_stencil_render_buffer_->AllocateStorage( - offscreen_size_, offscreen_target_stencil_format_)) { - LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFramebuffer failed " - << "to allocate storage for offscreen target stencil buffer."; - return false; - } // Attach the offscreen target buffers to the target frame buffer. offscreen_target_frame_buffer_->AttachRenderTexture( offscreen_target_color_texture_.get()); - if (offscreen_target_depth_format_) { - offscreen_target_frame_buffer_->AttachRenderBuffer( - GL_DEPTH_ATTACHMENT, - offscreen_target_depth_render_buffer_.get()); - } - const bool packed_depth_stencil = - offscreen_target_depth_format_ == GL_DEPTH24_STENCIL8; - if (packed_depth_stencil) { - offscreen_target_frame_buffer_->AttachRenderBuffer( - GL_STENCIL_ATTACHMENT, - offscreen_target_depth_render_buffer_.get()); - } else if (offscreen_target_stencil_format_) { - offscreen_target_frame_buffer_->AttachRenderBuffer( - GL_STENCIL_ATTACHMENT, - offscreen_target_stencil_render_buffer_.get()); - } if (offscreen_target_frame_buffer_->CheckStatus() != GL_FRAMEBUFFER_COMPLETE) { @@ -5699,7 +5431,7 @@ return external_default_framebuffer_->HasDepth(); } if (offscreen_target_frame_buffer_.get()) { - return offscreen_target_depth_format_ != 0; + return false; } return back_buffer_has_depth_; } @@ -5714,8 +5446,7 @@ return external_default_framebuffer_->HasStencil(); } if (offscreen_target_frame_buffer_.get()) { - return offscreen_target_stencil_format_ != 0 || - offscreen_target_depth_format_ == GL_DEPTH24_STENCIL8; + return false; } return back_buffer_has_stencil_; }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index a0e344af..cf4ff4f 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -8332,7 +8332,7 @@ dimensions: "cores:8" dimensions: "cpu:x86-64" dimensions: "free_space:high" - dimensions: "os:Ubuntu-18.04" + dimensions: "os:Ubuntu-22.04" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:0" exe {
diff --git a/infra/config/lib/linux-default.json b/infra/config/lib/linux-default.json index 5c24624..cb88e832 100644 --- a/infra/config/lib/linux-default.json +++ b/infra/config/lib/linux-default.json
@@ -68,6 +68,7 @@ "Dawn Win10 x86 Release (NVIDIA)": "Ubuntu-22.04", "Deterministic Android": "Ubuntu-22.04", "Deterministic Android (dbg)": "Ubuntu-22.04", + "Deterministic Fuchsia (dbg)": "Ubuntu-22.04", "Deterministic Linux": "Ubuntu-22.04", "Deterministic Linux (dbg)": "Ubuntu-22.04", "GPU FYI Android arm Builder": "Ubuntu-22.04",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 6bca8a3c..eeed588 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1338,6 +1338,11 @@ {"shopping-list", commerce::flag_descriptions::kShoppingListName, commerce::flag_descriptions::kShoppingListDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(commerce::kShoppingList)}, + {"shopping-list-track-by-default", + commerce::flag_descriptions::kShoppingListTrackByDefaultName, + commerce::flag_descriptions::kShoppingListTrackByDefaultDescription, + flags_ui::kOsIos, + FEATURE_VALUE_TYPE(commerce::kShoppingListTrackByDefault)}, {"local-pdp-detection", commerce::flag_descriptions::kCommerceLocalPDPDetectionName, commerce::flag_descriptions::kCommerceLocalPDPDetectionDescription,
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 index b147729..05213a2 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -4e183621aef1d69bfbbc8e8ee6fcce894abbd21b \ No newline at end of file +aceb6b8bcd834c9f1a4eb5f563950ada7a3c00fa \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 index da5a13e..8c00a8f 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -4dd3f4f38deeee69863d8c8bf925900122d22655 \ No newline at end of file +8a1bdaa0f9009e25cf50c89f151a1f0728b4079f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 21af408..ccde5c6 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -6dbf4ce31ef69cba81d62cd1fe4a0e35a4a7c9f2 \ No newline at end of file +c1aa3882c348f21e34915dcbb43b9f681d28a61b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index 425ba3b..4dabbe0 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -1170bb515efa06464c5fe912b504c240c51e4352 \ No newline at end of file +3cb90689fd698015e72ad7ade7cc080f34edc3ce \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 9fab454..215100fb 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -b176785bbae9c11e0ba069f571a68e956984dd95 \ No newline at end of file +c751ff58179eef4fd0403e881c1ccc3a828ef174 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index e0e9cf2..30f6b4a 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -e8d416c8afea6d257ef1c852067757d18441b2d7 \ No newline at end of file +077194dcc3ee8f9b9d86234c93dac43bc115fec8 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 index 08ce54a5..24ab6591 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -deea15a31dfc629c977aef51f612a5afb0e9604d \ No newline at end of file +09072d7ae60419082c7551852c7e08751f60c37a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 index 6c9c213..6ad939cc 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -1028d583855ca5cf15d2c24d036aab3e04f0442f \ No newline at end of file +75f5afb5c4c5ac984ce9fe5dba28891fec2380b5 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index c55c2fa..183ba53 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -84accfe866937cf0d68ec859a2bb096d4e233427 \ No newline at end of file +9d730aca7a9528da71ee0ed1444f4765a530876a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 0703be0..04dcdc4 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -99cf5c91aabfedea4e2475a8382d10036b694c35 \ No newline at end of file +e4e8106ffee7bbdaf11339ad69e0ee37e9a32cfd \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 2bf6b72..ccc6541 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -4172beb5356cf2a07e977ed624734d0646991269 \ No newline at end of file +42f3e81df48d98726727e8fe87223b9a7d1f78e3 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 058adae1..c99a947 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -e1ea32b8932b82110363c2c3aa61ddbcd1e98e9c \ No newline at end of file +080e71a8a99cd99a3d7f9cc5f3b37f41100b0cd4 \ No newline at end of file
diff --git a/media/cast/encoding/av1_encoder.cc b/media/cast/encoding/av1_encoder.cc index 9b82a3e..a51af55 100644 --- a/media/cast/encoding/av1_encoder.cc +++ b/media/cast/encoding/av1_encoder.cc
@@ -196,11 +196,11 @@ DCHECK_EQ(result, &aom_image); aom_image.planes[AOM_PLANE_Y] = - video_frame->GetWritableVisibleData(VideoFrame::kYPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kYPlane)); aom_image.planes[AOM_PLANE_U] = - video_frame->GetWritableVisibleData(VideoFrame::kUPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kUPlane)); aom_image.planes[AOM_PLANE_V] = - video_frame->GetWritableVisibleData(VideoFrame::kVPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kVPlane)); aom_image.stride[AOM_PLANE_Y] = video_frame->stride(VideoFrame::kYPlane); aom_image.stride[AOM_PLANE_U] = video_frame->stride(VideoFrame::kUPlane); aom_image.stride[AOM_PLANE_V] = video_frame->stride(VideoFrame::kVPlane);
diff --git a/media/cast/encoding/vpx_encoder.cc b/media/cast/encoding/vpx_encoder.cc index 356fb83..281e0a43 100644 --- a/media/cast/encoding/vpx_encoder.cc +++ b/media/cast/encoding/vpx_encoder.cc
@@ -220,22 +220,22 @@ switch (vpx_format) { case VPX_IMG_FMT_I420: vpx_image.planes[VPX_PLANE_Y] = - video_frame->GetWritableVisibleData(VideoFrame::kYPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kYPlane)); vpx_image.planes[VPX_PLANE_U] = - video_frame->GetWritableVisibleData(VideoFrame::kUPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kUPlane)); vpx_image.planes[VPX_PLANE_V] = - video_frame->GetWritableVisibleData(VideoFrame::kVPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kVPlane)); vpx_image.stride[VPX_PLANE_Y] = video_frame->stride(VideoFrame::kYPlane); vpx_image.stride[VPX_PLANE_U] = video_frame->stride(VideoFrame::kUPlane); vpx_image.stride[VPX_PLANE_V] = video_frame->stride(VideoFrame::kVPlane); break; case VPX_IMG_FMT_NV12: vpx_image.planes[VPX_PLANE_Y] = - video_frame->GetWritableVisibleData(VideoFrame::kYPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kYPlane)); // In libvpx, the UV plane of NV12 frames is represented by two planes // with the same stride, shifted by one byte. vpx_image.planes[VPX_PLANE_U] = - video_frame->GetWritableVisibleData(VideoFrame::kUVPlane); + const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kUVPlane)); vpx_image.planes[VPX_PLANE_V] = vpx_image.planes[VPX_PLANE_U] + 1; vpx_image.stride[VPX_PLANE_Y] = video_frame->stride(VideoFrame::kYPlane); vpx_image.stride[VPX_PLANE_U] = video_frame->stride(VideoFrame::kUVPlane);
diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn index d883031..24fa563 100644 --- a/media/gpu/v4l2/BUILD.gn +++ b/media/gpu/v4l2/BUILD.gn
@@ -215,3 +215,18 @@ "//testing/gtest", ] } + +if (is_chromeos && (current_cpu == "arm" || current_cpu == "arm64")) { + test("mt21_unittest") { + testonly = true + sources = [ + "mt21/mt21_util.h", + "mt21/mt21_util_unittest.cc", + ] + deps = [ + "//base:base", + "//base/test:test_support", + "//testing/gtest", + ] + } +}
diff --git a/media/gpu/v4l2/mt21/mt21_util.h b/media/gpu/v4l2/mt21/mt21_util.h new file mode 100644 index 0000000..71c96ca --- /dev/null +++ b/media/gpu/v4l2/mt21/mt21_util.h
@@ -0,0 +1,1109 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_GPU_V4L2_MT21_MT21_UTIL_H_ +#define MEDIA_GPU_V4L2_MT21_MT21_UTIL_H_ + +// High performance implementation of the MT21 decompression algorithm. It is +// recommended reading the unoptimized implementation here before diving into +// this +// https://source.chromium.org/chromiumos/_/chromium/chromiumos/platform/drm-tests/+/94106a2845911104895c50aa5d70c6e5fc8972fc:pixel_formats/mt21_converter.c;drc=091692f34d333dec8fd3a8e375a4ad5a65682cb2;bpv=0;bpt=0 +// +// This algorithm should achieve a throughput of about 156 megapixels per second +// on a single Cortex A72. + +// This file contains a lot of SIMD built-ins. Thankfully we're only ever going +// to need this on certain SoCs, so we just wrap everything in a giant include +// guard. +// +// TODO(b/286891480): Convert these Neon intrinsics into Highway, which is more +// portable. We only used Neon because Highway's OrderedTruncate2To(), which we +// need for implementing NarrowToU8, was not released at the time of writing. + +#include "build/build_config.h" + +#if BUILDFLAG(IS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) && \ + (defined(COMPILER_GCC) || defined(__clang__)) + +#include <arm_neon.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <vector> + +namespace media { + +// This file is a little unusual in that it's a header that actually contains a +// bunch of function definitions. This is pretty ugly, but there's a good reason +// for it. When we're writing tight loops, we want the compiler to aggressively +// inline so we don't pay the performance penalty of managing the callstack. If +// we put the function definitions in a different translation unit, we won't get +// any inlining because the linker isn't smart enough for that. +// +// This anonymous namespace also helps encourage inlining. By putting +// everything in the anonymous namespace, we are telling the compiler we don't +// intend to export these symbols, which gives the compiler more freedom to +// optimize them away. We could also use "static" for this purpose, but that's +// more idiomatic of C99 than C++. +// +// The other alternative would be to just add all of these functions in one .cc +// file. We chose not to do this because then we wouldn't be able to write +// granular unit tests; we would just have to settle for one giant "decompress +// frame" integration test. +// +// TODO(b/286891480): Investigate how much latency we really save with this +// technique, and possibly move the bulk of this code into a .cc file if we find +// the latency benefit not worth the diminished readability. +namespace { + +constexpr size_t kNumOutputLanes = 16; +constexpr size_t kMT21TileWidth = 16; +constexpr size_t kMT21TileHeight = 32; +constexpr size_t kMT21TileSize = kMT21TileWidth * kMT21TileHeight; +constexpr size_t kMT21BlockWidth = kMT21TileWidth; +constexpr size_t kMT21BlockHeight = kMT21TileHeight / 4; +constexpr size_t kMT21BlockSize = kMT21BlockWidth * kMT21BlockHeight; +constexpr size_t kMT21SubblocksInBlock = 2; +constexpr size_t kMT21SubblockWidth = kMT21BlockWidth; +constexpr size_t kMT21SubblockHeight = kMT21BlockHeight / kMT21SubblocksInBlock; +constexpr size_t kMT21SubblockSize = kMT21SubblockWidth * kMT21SubblockHeight; + +// Loops can cause branch mispredictions, so we manually unroll them when +// practical. +// +// Of course, compilers have loop unrolling optimizations built into them, but +// these don't actually seem to trigger often in practice, even with -O2 and +// -funroll-loops. I suspect the compiler is actually shy about loop unrolling +// because it's worried about blowing up the I-cache. We have a good idea of +// where the program is going to spend most of its time, however, so we can +// manually unroll hotspots. +#define LOOPN(inner_block, N) \ + { \ + _Pragma("clang loop unroll(full)") for (size_t i = 0; i < (N); i++) { \ + inner_block \ + } \ + } + +// We take two completely separate approaches to optimizing MT21 decompression: +// a scalar approach, and a vector approach. The vector approach is +// substantially faster than the scalar approach, but the vector approach +// requires us to have at least 16 compressed subblocks to process +// simultaneously. Any remainder subblocks need to go through the scalar +// algorithm. + +////////////////////// +// Scalar Algorithm // +////////////////////// + +// Efficient scalar class for reading MT21 bitstreams. We buffer the bitstream +// into a 64 bit accumulator and load into it 4 bytes at a time. Note that this +// means we cannot read more than 32 bits at a time. +class MT21BitstreamReader { + public: + MT21BitstreamReader(const uint8_t* buf); + // Look ahead N bits, but do not discard. Note that N cannot be 0. + int PeekNBits(int n); + // Discard N bits and possibly load more into the accumulator. + void DiscardNBits(int n); + // Combined peek and discard. + int ReadNBits(int n); + // Returns total number of consumed bits. Useful for filling in Golomb-Rice + // lookup tables. + size_t GetConsumedBits(); + + private: + const uint8_t* buf_; + size_t consumed_bits_; + + uint64_t accumulator_; + size_t byte_idx_; + uint8_t outstanding_reads_; + + // Responsible for keeping the accumulator full. + void MaybeRefillAccumulator(); +}; + +MT21BitstreamReader::MT21BitstreamReader(const uint8_t* buf) { + buf_ = buf; + accumulator_ = *(uint64_t*)(buf + 8); + byte_idx_ = 4; + outstanding_reads_ = 0; + consumed_bits_ = 0; +} + +void MT21BitstreamReader::MaybeRefillAccumulator() { + if (outstanding_reads_ >= 32) { + uint32_t next_dword = *(uint32_t*)(buf_ + byte_idx_); + outstanding_reads_ -= 32; + accumulator_ |= ((uint64_t)next_dword) << outstanding_reads_; + + // Advance to the next row if we've exhausted the current one. + // I experimented with eliminating this branch, but it doesn't seem to make + // much of a difference for efficiency. + if ((byte_idx_ & 0xF) == 0) { + byte_idx_ += 32; + } + // Rows are read right to left. + byte_idx_ -= 4; + } +} + +int MT21BitstreamReader::PeekNBits(int n) { + // N cannot be 0, because shifting right by 64 bits is technically undefined + // behavior. One some platforms, this will return unexpected results. + return (int)(accumulator_ >> (64 - n)); +} + +void MT21BitstreamReader::DiscardNBits(int n) { + accumulator_ <<= n; + outstanding_reads_ += n; + consumed_bits_ += n; + MaybeRefillAccumulator(); +} + +int MT21BitstreamReader::ReadNBits(int n) { + if (!n) { + return 0; + } + + int ret = PeekNBits(n); + DiscardNBits(n); + + return ret; +} + +size_t MT21BitstreamReader::GetConsumedBits() { + return consumed_bits_; +} + +// "Slow" method of reading a Golomb-Rice symbol. Needed for miscellaneous +// functions like populating the lookup table and fallback logic if the symbol +// isn't in the table. +int ReadGolombRiceSymbol(MT21BitstreamReader& reader, int k) { + const int escape_sequence_num = 7 + k; + int num_ones = 0; + int ret = 0; + + // Read the unary component. + while (1) { + const int curr_bit = reader.ReadNBits(1); + if (curr_bit) { + num_ones++; + + if (num_ones == escape_sequence_num) { + break; + } + } else { + break; + } + } + + if (num_ones == escape_sequence_num) { + // We've hit the escape sequence, so we switch to limited length mode. + ret = reader.ReadNBits(8 - (k >= 4)); + + ret += num_ones * (1 << k); + } else if (num_ones) { + ret = (num_ones * (1 << k)) + reader.ReadNBits(k); + } else { + // Special case unary components of 0, because 0 symbols don't have a sign + // bit. + ret = reader.ReadNBits(k - 1); + if (ret) { + ret <<= 1; + ret += reader.ReadNBits(1); + } + } + + // Map unsigned symbol to signed symbol. + if (ret & 1) { + return -1 * (ret >> 1); + } else { + return ret >> 1; + } +} + +// "Fast" method of reading Golomb-Rice symbols that uses a lookahead window and +// a lookup table. This will fall back to the slow method if the symbol exceeds +// kGolombRiceTableLookaheadLen, because we need to keep the size of the lookup +// table small enough to fit in L1. +struct GolombRiceTableEntry { + // Size of the compressed symbol. + int8_t in_size; + // Value of the symbol. + int8_t symbol; +}; +constexpr size_t kMaxKValue = 8; +// Lookahead len chosen experimentally. We want it to be big enough that we +// maximize how often we hit the lookup table, but small enough to fit in the +// A72's L1 cache. Some testing indicated that 10 bits was the magic number. +constexpr size_t kGolombRiceTableLookaheadLen = 10; +constexpr size_t kGolombRiceTableSize = (1 << kGolombRiceTableLookaheadLen); +constexpr size_t kGolombRiceCacheSize = kGolombRiceTableSize * (kMaxKValue - 1); +constexpr size_t kBitsInByte = 8; + +// Initializes the lookup tables for all possible k values +void PopulateGolombRiceCache(GolombRiceTableEntry* cache) { + uint8_t tmp_buf[kMT21SubblockSize]; + for (size_t k = 1; k < kMaxKValue; k++) { + GolombRiceTableEntry* table = cache + (k - 1) * kGolombRiceTableSize; + for (size_t lookahead_val = 0; + lookahead_val < (1 << kGolombRiceTableLookaheadLen); lookahead_val++) { + GolombRiceTableEntry* entry = table + lookahead_val; + + // Compressed symbol size 0 indicates a cache miss. + entry->in_size = 0; + + // Create a fake Subblock that just contains our target value in the first + // 2 bytes. + tmp_buf[kMT21SubblockWidth - 1] = + lookahead_val >> (kGolombRiceTableLookaheadLen - kBitsInByte); + tmp_buf[kMT21SubblockWidth - 2] = + (lookahead_val << (kBitsInByte - + (kGolombRiceTableLookaheadLen - kBitsInByte))) & + 0xFF; + + MT21BitstreamReader reader(tmp_buf); + + // Try to read a symbol. If it was small enough, put it in the lookup + // table. + int symbol = ReadGolombRiceSymbol(reader, k); + if (reader.GetConsumedBits() <= kGolombRiceTableLookaheadLen) { + entry->in_size = reader.GetConsumedBits(); + entry->symbol = symbol; + } + } + } +} + +int FastReadGolombRiceSymbol(MT21BitstreamReader& reader, + int k, + const GolombRiceTableEntry* table) { + const int lookahead_window = reader.PeekNBits(kGolombRiceTableLookaheadLen); + if (table[lookahead_window].in_size) { + reader.DiscardNBits(table[lookahead_window].in_size); + return table[lookahead_window].symbol; + } else { + // Cache miss, fall back to slow method. + return ReadGolombRiceSymbol(reader, k); + } +} + +// Prediction functions for all 4 subblock regions. We split this logic up into +// separate functions rather than using "if" statements because the "if" +// statements were causing high rates of branch misprediction. +uint8_t FirstRowPrediction(uint8_t right) { + return right; +} + +uint8_t LastColPrediction(uint8_t up) { + return up; +} + +// We use a lookup table approach because, again, we want to avoid if statements +// to avoid branch mispredictions. It's cheaper to just compute all 3 possible +// prediction values and select which one we want to use later. +uint8_t FirstColPrediction(uint8_t up, uint8_t up_right, uint8_t right) { + int max_up_right = up > right ? up : right; + int min_up_right = up > right ? right : up; + int horiz_grad_prediction = right + (up - up_right); + uint8_t ret[3]; + int idx = ((up_right > max_up_right) << 1) | (up_right < min_up_right); + ret[0b00] = horiz_grad_prediction; + ret[0b01] = min_up_right; + ret[0b10] = max_up_right; + return ret[idx]; +} + +// Same deal as with first column prediction, but with 4 possible prediction +// values. +uint8_t BodyPrediction(uint8_t up_left, + uint8_t up, + uint8_t up_right, + uint8_t right) { + int max_up_right = up > right ? up : right; + int min_up_right = up > right ? right : up; + int right_grad = right + (up - up_right); + int left_grad = right + (up - up_left); + int use_right_grad = up_right <= max_up_right && up_right >= min_up_right; + int idx = (use_right_grad << 1 | use_right_grad) | + (up_left > max_up_right) << 1 | up_left < min_up_right; + uint8_t ret[4]; + ret[0b00] = left_grad; + ret[0b01] = min_up_right; + ret[0b10] = max_up_right; + ret[0b11] = right_grad; + return ret[idx]; +} + +// Core (scalar) decompression functions. +// +// We're abusing templates rather than taking subblock dims as a parameter +// because we want to try to coax the compiler into evaluating as many +// expressions as possible during compile time and maybe even unrolling the +// loops. +struct MT21Subblock { + const uint8_t* src; + uint8_t* dest; + size_t len; +}; +struct MT21YSubblock : MT21Subblock {}; +struct MT21UVSubblock : MT21Subblock {}; + +template <int width> +void DecompressSubblock(MT21BitstreamReader& reader, + uint8_t* dest, + const GolombRiceTableEntry* symbol_cache) { + int k = reader.ReadNBits(3) + 1; + dest[width - 1] = reader.ReadNBits(8); + + if (k == 8) { + // This is a solid color block, set everything equal to the top right corner + // value. + memset(dest, dest[width - 1], width * kMT21SubblockHeight); + return; + } + + // Find which table in the cache we should be using. Sometimes the compiler + // doesn't bother factoring this calculation out of the loop, so we do it + // manually. + const GolombRiceTableEntry* symbol_table = + symbol_cache + (k - 1) * kGolombRiceTableSize; + + // Pixels get processed right to left, top to bottom. + uint8_t curr; + uint8_t up_left; + uint8_t up = dest[width - 1]; + uint8_t up_right; + uint8_t right = up; + for (int x = width - 2; x >= 0; x--) { + curr = FirstRowPrediction(right) + + FastReadGolombRiceSymbol(reader, k, symbol_table); + right = curr; + dest[x] = curr; + } + for (size_t y = 1; y < kMT21SubblockHeight; y++) { + up = dest[y * width - 1]; + curr = LastColPrediction(up) + + FastReadGolombRiceSymbol(reader, k, symbol_table); + dest[y * width + width - 1] = curr; + right = curr; + up_right = up; + up = dest[y * width - 2]; + for (size_t x = width - 2; x >= 1; x--) { + up_left = dest[y * width - width + x - 1]; + curr = BodyPrediction(up_left, up, up_right, right) + + FastReadGolombRiceSymbol(reader, k, symbol_table); + dest[y * width + x] = curr; + right = curr; + up_right = up; + up = up_left; + } + dest[y * width] = FirstColPrediction(up, up_right, right) + + FastReadGolombRiceSymbol(reader, k, symbol_table); + } +} + +// UV subblocks are half the size of normal subblocks and are written one after +// another with no padding. We use the DecompressSubblockHelper template to help +// us differentiate this behavior. +template <typename T> +void DecompressSubblockHelper(T subblock, + const GolombRiceTableEntry* symbol_cache); +template <> +void DecompressSubblockHelper(MT21YSubblock subblock, + const GolombRiceTableEntry* symbol_cache) { + MT21BitstreamReader reader(subblock.src); + DecompressSubblock<kMT21SubblockWidth>(reader, subblock.dest, symbol_cache); +} +// Interleaves a U and V subblock into a combined UV subblock. +void InterleaveUVSubblock(const uint8_t* src_u, + const uint8_t* src_v, + uint8_t* dest_uv) { + uint8x16_t tmp_u, tmp_v; + uint8x16x2_t store_tmp; + LOOPN( + { + tmp_u = vld1q_u8(src_u); + src_u += 16; + tmp_v = vld1q_u8(src_v); + src_v += 16; + store_tmp.val[0] = tmp_u; + store_tmp.val[1] = tmp_v; + vst2q_u8(dest_uv, store_tmp); + dest_uv += 32; + }, + 2) +} +template <> +void DecompressSubblockHelper(MT21UVSubblock subblock, + const GolombRiceTableEntry* symbol_cache) { + MT21BitstreamReader reader(subblock.src); + uint8_t scratch_u[kMT21SubblockSize / 2] __attribute__((aligned(16))); + uint8_t scratch_v[kMT21SubblockSize / 2] __attribute__((aligned(16))); + DecompressSubblock<kMT21SubblockWidth / 2>(reader, scratch_v, symbol_cache); + DecompressSubblock<kMT21SubblockWidth / 2>(reader, scratch_u, symbol_cache); + InterleaveUVSubblock(scratch_u, scratch_v, subblock.dest); +} + +///////////////////////// +// SIMD Implementation // +///////////////////////// + +// This SIMD implementation operates on 16 subblocks at a time, even though we +// only have 4 lanes to work with since the accumulator needs to be 32-bit. This +// algorithm was originally developed to only operate on 4 subblocks at a time +// to match the number of lanes, but we had a lot of trouble keeping the +// Cortex A72's 2 Neon pipelines full. So, we manually unroll the loop a little +// and interleave operations from each iteration. +// +// Generally the compiler and the CPU itself are good enough at instructions +// scheduling, but in this case, manually scheduling our instructions +// dramatically increases our throughput. There may be more optimizations to do +// yet in this regard; our current throughput is about 1.3 IPC, when it should +// actually be closer to 1.5 IPC. + +static const uint8x16_t byte_literal_1 = vdupq_n_u8(1); +static const uint32x4_t dword_literal_1 = vdupq_n_u32(1); +static const uint32x4_t dword_literal_4 = vdupq_n_u32(4); +static const uint32x4_t dword_literal_7 = vdupq_n_u32(7); +static const uint32x4_t dword_literal_8 = vdupq_n_u32(8); +static const uint32x4_t dword_literal_11 = vdupq_n_u32(11); +static const uint32x4_t dword_literal_31 = vdupq_n_u32(31); +static const uint32x4_t dword_literal_32 = vdupq_n_u32(32); + +// Helpful utility for taking 4 vectors with uint32_t elements and combining +// them into 1 vector with uint8_t elements. Note that this necessarily discards +// the upper 24 bits of each element. Our accumulators need to be 32-bit because +// our longest Golomb-Rice code is 20 bits, but we can narrow for other parts of +// the algorithm. + +uint8x16_t inline NarrowToU8(uint32x4_t& vec1, + uint32x4_t& vec2, + uint32x4_t& vec3, + uint32x4_t& vec4) { + return vcombine_u8(vmovn_u16(vcombine_u16(vmovn_u32(vec1), vmovn_u32(vec2))), + vmovn_u16(vcombine_u16(vmovn_u32(vec3), vmovn_u32(vec4)))); +} + +// 32-bit ARM machines don't actually support unaligned memory access. The +// accumulator management code was originally written for Aarch64, which +// supports unaligned accesses without issue. In order to make that code work +// with Chrome, we need this hacky workaround. If performance is drastically +// different between the Aarch64 prototype and the production version of the +// code, this portion of the code is a good place to start poking. Supposedly +// there was a penalty for unaligned reads on Aarch64 as well, but I can't find +// any documentation for how many cycles that is on a Cortex A72 or A53. +uint32_t inline LoadUnalignedDword(uint32_t* ptr) { + uint32_t ret; + memcpy(&ret, ptr, sizeof(uint32_t)); + return ret; +} + +// Helpful utility for managing the accumulator. This function effectively +// discards |discard_size| bits and loads in more bytes from the bitstream as +// needed. +void inline VectorManageAccumulator(uint32x4_t* accumulator, + uint32x4_t* outstanding_reads, + const uint32x4_t& discard_size, + int i, + uint8_t** compressed_ptr) { + // We always load in a fresh dword. Often it will be from the same offsets. + // This is inefficient, but it's offset by the speedup of vectorization. + outstanding_reads[i] = vaddq_u32(outstanding_reads[i], discard_size); + uint32x4_t offsets = vshrq_n_u32(outstanding_reads[i], 3); + compressed_ptr[i * 4] -= offsets[0]; + compressed_ptr[i * 4 + 1] -= offsets[1]; + compressed_ptr[i * 4 + 2] -= offsets[2]; + compressed_ptr[i * 4 + 3] -= offsets[3]; + outstanding_reads[i] = vandq_u32(outstanding_reads[i], dword_literal_7); + accumulator[i][0] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4]); + accumulator[i][1] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 1]); + accumulator[i][2] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 2]); + accumulator[i][3] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 3]); + accumulator[i] = + vshlq_u32(accumulator[i], vreinterpretq_s32_u32(outstanding_reads[i])); +} + +// Golomb-Rice decompression. The core algorithm looks like this: +// 1. escape_seq = k + 7 +// 2. unary_component = min(count_leading_zero(~accumulator), escape_seq) +// 3. unary_len = unary_component + (unary_component == escape_seq) +// 5. binary_len = (unary_component == escape_seq) ? 8 : k +// 6. binary_component = (accumulator << unary_len) >> (32 - binary_len) +// 7. symbol = (k == 8) ? 0 : (unary_component << k) + binary_component +// 8. symbol = symbol / 2 * (symbol % 2 ? -1 : 1) +uint8x16_t inline VectorReadGolombRiceSymbol(uint32x4_t* accumulator, + uint32x4_t* outstanding_reads, + uint32x4_t* escape_codes, + uint32x4_t* escape_binary_len_diff, + uint32x4_t* k_vals, + uint32x4_t* dword_solid_color_mask, + uint8_t** compressed_ptr) { + // leading_ones = min(count_leading_zero(~accumulator), escape_codes) + // escape_lanes = leading_ones == escape_codes + uint32x4_t leading_ones[4]; + uint32x4_t escape_lanes[4]; + LOOPN( + { + leading_ones[i] = + vminq_u32(vclzq_u32(vmvnq_u32(accumulator[i])), escape_codes[i]); + escape_lanes[i] = vceqq_u32(leading_ones[i], escape_codes[i]); + }, + 4) + + // binary_len = k + (escape_lanes * (8 - k)) + // unary_len = leading_ones + !escape_lanes + uint32x4_t binary_len[4]; + uint32x4_t unary_len[4]; + LOOPN( + { + binary_len[i] = vaddq_u32( + k_vals[i], vandq_u32(escape_lanes[i], escape_binary_len_diff[i])); + unary_len[i] = + vaddq_u32(leading_ones[i], + vandq_u32(dword_literal_1, vmvnq_u32(escape_lanes[i]))); + }, + 4) + + // output = (leading_ones << k) + // output += ((accumulator << unary_len) >> (32 - binary_len) + uint32x4_t dword_output[4]; + LOOPN( + { + dword_output[i] = + vshlq_u32(leading_ones[i], vreinterpretq_s32_u32(k_vals[i])); + dword_output[i] = vaddq_u32( + dword_output[i], + vshlq_u32( + vshlq_u32(accumulator[i], vreinterpretq_s32_u32(unary_len[i])), + vsubq_s32(vreinterpretq_s32_u32(binary_len[i]), + dword_literal_32))); + }, + 4) + + // total_len = unary_len + binary_len - (output <= 1) + // total_len = solid_color_mask ? total_len : 0 + uint32x4_t total_len[4]; + LOOPN( + { + total_len[i] = + vsubq_u32(vaddq_u32(unary_len[i], binary_len[i]), + vandq_u32(dword_literal_1, + vcleq_u32(dword_output[i], dword_literal_1))); + total_len[i] = vandq_u32(total_len[i], dword_solid_color_mask[i]); + }, + 4) + + // Handle accumulator. + LOOPN( + { + VectorManageAccumulator(accumulator, outstanding_reads, total_len[i], i, + compressed_ptr); + }, + 4) + + // output = (output / 2) * (output % 2 ? -1 : 1) + // This is a hack that relies on how two's complement arithmetic works. + uint8x16_t output = NarrowToU8(dword_output[0], dword_output[1], + dword_output[2], dword_output[3]); + uint8x16_t negative_lanes = vandq_u8(output, byte_literal_1); + output = vaddq_u8( + veorq_u8(vshrq_n_u8(output, 1), vtstq_u8(negative_lanes, negative_lanes)), + negative_lanes); + + return output; +} + +// Initializes the accumulator with the first 4 bytes of compressed data. +void VectorInitializeAccumulator(uint32x4_t* accumulator, + uint8_t** compressed_ptr) { + LOOPN( + { + accumulator[i][0] = + LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4]); + accumulator[i][1] = + LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 1]); + accumulator[i][2] = + LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 2]); + accumulator[i][3] = + LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 3]); + }, + 4); +} + +// Reads the 11 bit header on the compressed data and initializes some important +// vectors. +uint8x16_t VectorReadCompressedHeader(uint32x4_t* accumulator, + uint32x4_t* outstanding_reads, + uint32x4_t* escape_codes, + uint32x4_t* escape_binary_len_diff, + uint32x4_t* k_vals, + uint32x4_t* dword_solid_color_mask, + uint8x16_t& solid_color_mask, + uint8_t** compressed_ptr) { + // Parse out our K value. + // k = (accumulator >> 29) + 1 + // 29 comes from 32 - 3, since 32 is the size of the accumulator and 3 is the + // size of k. + LOOPN( + { + k_vals[i] = + vaddq_u32(vshrq_n_u32(accumulator[i], 32 - 3), dword_literal_1); + }, + 4) + + // Calculate what our escape code should be for each lane based on the K + // values. + // escape_codes = k + 7 + LOOPN({ escape_codes[i] = vaddq_u32(k_vals[i], dword_literal_7); }, 4) + + // Compute the length of the binary components of "escaped" symbols. + // Note that we abuse the fact that 0xFFFFFFFF == -1 + // escaped_binary_len_diff = 8 - k - (k >= 4) + LOOPN( + { + escape_binary_len_diff[i] = + vaddq_u32(vsubq_u32(dword_literal_8, k_vals[i]), + vcgeq_u32(k_vals[i], dword_literal_4)); + }, + 4) + + // Figure out which lanes are actually operating in solid color mode. Yes, we + // do a lot of wasted computation and then throw away the results for solid + // color blocks. Unfortunately this is also the price we pay for + // vectorization. + // solid_color_mask = 0xFF * (k < 8) + LOOPN({ dword_solid_color_mask[i] = vcltq_u32(k_vals[i], dword_literal_8); }, + 4) + solid_color_mask = + NarrowToU8(dword_solid_color_mask[0], dword_solid_color_mask[1], + dword_solid_color_mask[2], dword_solid_color_mask[3]); + + // Parse the top right pixel value + // accumulator <<= 3 + // top_right = accumulator >> 24 + // accumulator <<= 8 + uint32x4_t top_right[4]; + LOOPN( + { + accumulator[i] = vshlq_n_u32(accumulator[i], 3); + top_right[i] = vshrq_n_u32(accumulator[i], 24); + accumulator[i] = vshlq_n_u32(accumulator[i], 8); + }, + 4) + + // Manage the accumulator (shift in new bits if possible). For Y subblocks, + // this isn't strictly necessary because the longest prefix code is 20 bits, + // and we've only consumed 11 bits, so we should technically have enough to + // read the first Golomb-Rice symbol. But U subblocks are appended directly to + // the end of V subblocks with no padding, so it's possible that the subblock + // we are currently decompressing does not start at a byte boundary, so we can + // no longer make this assumption. + LOOPN( + { + VectorManageAccumulator(accumulator, outstanding_reads, + dword_literal_11, i, compressed_ptr); + }, + 4) + + return NarrowToU8(top_right[0], top_right[1], top_right[2], top_right[3]); +} + +// Straightforward vector implementations of the prediction methods. The only +// hangup is that we don't use a lookup table exactly. Neon actually has a +// lookup table instruction, and the first iteration of the code used that, but +// it turns out that using a series of ternary instructions (vbslq_u8) is +// slightly faster. + +uint8x16_t inline VectorFirstRowPrediction(const uint8x16_t& right) { + return right; +} + +uint8x16_t inline VectorLastColPrediction(const uint8x16_t& up) { + return up; +} + +uint8x16_t inline VectorFirstColPrediction(const uint8x16_t& up, + const uint8x16_t& up_right, + const uint8x16_t& right) { + const uint8x16_t min_pred = vminq_u8(up, right); + const uint8x16_t max_pred = vmaxq_u8(up, right); + const uint8x16_t right_grad = vreinterpretq_u8_s8(vaddq_s8( + right, vsubq_s8(vreinterpretq_s8_u8(up), vreinterpretq_s8_u8(up_right)))); + const uint8x16_t up_right_above_max = vcgtq_u8(up_right, max_pred); + const uint8x16_t up_right_below_min = vcltq_u8(up_right, min_pred); + uint8x16_t pred = vbslq_u8(up_right_above_max, max_pred, min_pred); + pred = vbslq_u8(vorrq_u8(up_right_above_max, up_right_below_min), pred, + right_grad); + return pred; +} + +uint8x16_t inline VectorBodyPrediction(const uint8x16_t& up_left, + const uint8x16_t& up, + const uint8x16_t& up_right, + const uint8x16_t& right) { + uint8x16_t min_pred = vminq_u8(up, right); + uint8x16_t max_pred = vmaxq_u8(up, right); + uint8x16_t right_grad = vreinterpretq_u8_s8(vaddq_s8( + vreinterpretq_s8_u8(right), + vsubq_s8(vreinterpretq_s8_u8(up), vreinterpretq_s8_u8(up_right)))); + uint8x16_t left_grad = vreinterpretq_u8_s8(vaddq_s8( + vreinterpretq_s8_u8(right), + vsubq_s8(vreinterpretq_s8_u8(up), vreinterpretq_s8_u8(up_left)))); + uint8x16_t up_left_above_max = vcgtq_u8(up_left, max_pred); + uint8x16_t up_left_below_min = vcltq_u8(up_left, min_pred); + uint8x16_t use_right_grad = + vandq_u8(vcleq_u8(up_right, max_pred), vcgeq_u8(up_right, min_pred)); + uint8x16_t pred = vbslq_u8(up_left_above_max, max_pred, min_pred); + pred = + vbslq_u8(vorrq_u8(up_left_above_max, up_left_below_min), pred, left_grad); + pred = vbslq_u8(use_right_grad, right_grad, pred); + return pred; +} + +// In order for our vectorized accumulator management to work, we have to +// flip our subblocks vertically. Our decompression routine always decrements +// the compressed data pointer to avoid having to deal with moving to the next +// row. This is a routine for taking all 16 target subblocks, flipping them, and +// copying them into scratch memory. +constexpr size_t kMT21ScratchMemorySize = 4096; +constexpr size_t kMT21RedZoneSize = 1024; + +template <class T> +void SubblockGather(const std::vector<T>& subblock_list, + int start_idx, + uint8_t* aligned_scratch_memory, + uint8_t** compressed_ptr) { + // Our scratch memory is 4096 bytes. We use the first and last 1KB as a "red + // zone" to catch any overread from malformed bitstreams. This is much more + // performant than bounds checking. Our longest Golomb-Rice code is 20-bits, + // so really our red zone only needs to be + // 20/8*kMT21SubblockHeight*kMT21SubblockWidth = 160 bytes. We can consider + // relaxing the red zone size if memory becomes more of an issue. + aligned_scratch_memory += kMT21RedZoneSize; + + for (size_t i = 0; i < kNumOutputLanes; i++) { + compressed_ptr[i] = aligned_scratch_memory; + aligned_scratch_memory += kMT21SubblockSize; + for (size_t j = 0; j < subblock_list[i + start_idx].len; + j += kMT21SubblockWidth) { + memcpy(compressed_ptr[i] + 3 * kMT21SubblockWidth - j, + subblock_list[i + start_idx].src + j, kMT21SubblockWidth); + } + compressed_ptr[i] += kMT21SubblockSize - sizeof(uint32_t); + } +} + +// We compute 1 output per lane with the SIMD decompression algorithm. We could +// store lane individually, but instead we batch the output of all 16 +// subblocks, and then do 4 16x16 transposes and write out the results of our +// decompression row by row. This is substantially faster because it's fewer +// instructions and it takes advantage of the write combiner. +// +// The transpose algorithm we use is to break the data into 4x4 blocks, where +// each block is stored in its own register. We then perform 4x4 transposes on +// all 16 of the 4x4 blocks. Then, we rearrange the blocks to complete the +// transpose. +// +// We actually have to transpose the 4x4 blocks in 2 64-bit registers because +// 32-bit ARM lacks a vqtbl1q_u8 instruction. I actually don't know if this is +// terrible for performance since the A72 has the Neon throughput capped at 3 +// 64-bit vector registers per cycle anyway. But if we see a drop in performance +// compared to our Aarch64 benchmarks, this may be worth looking into. +static const uint8x8_t kTableTranspose4x4UpperIndices = { + 0, 4, 8, 12, 1, 5, 9, 13, +}; +static const uint8x8_t kTableTranspose4x4LowerIndices = { + 2, 6, 10, 14, 3, 7, 11, 15, +}; +void SubblockTransposeScatter(uint8_t*& src, uint8_t** decompressed_ptr) { + uint32x4x4_t load_regs[4]; + uint32x4x4_t store_regs[4]; + + // Load 4x4 blocks + LOOPN( + { + load_regs[i] = vld4q_u32((uint32_t*)src); + src += 64; + }, + 4) + + // Move the source pointer to the next row. + src -= 2 * kMT21SubblockWidth * kNumOutputLanes; + + // 4x4 transposes using lookup table + LOOPN( + { + uint8x8x2_t table; + table.val[0] = + vget_low_u8(vreinterpretq_u8_u32(load_regs[i / 4].val[i % 4])); + table.val[1] = + vget_high_u8(vreinterpretq_u8_u32(load_regs[i / 4].val[i % 4])); + load_regs[i / 4].val[i % 4] = + vcombine_u32(vreinterpret_u32_u8( + vtbl2_u8(table, kTableTranspose4x4UpperIndices)), + vreinterpret_u32_u8( + vtbl2_u8(table, kTableTranspose4x4LowerIndices))); + }, + 16) + + // Rearrange 4x4 blocks. This probably won't generate any instructions since + // we're basically just renaming some registers? + LOOPN({ store_regs[i / 4].val[i % 4] = load_regs[i % 4].val[i / 4]; }, 16) + + // Store the rows. + // Apparently vst4q_lane_u32 requires a constant integer for the third + // argument and clang isn't smart enough to realize that unrolling the loop + // would make the third argument const. So, ctrl-c, ctrl-v. + vst4q_lane_u32((uint32_t*)decompressed_ptr[0], store_regs[0], 0); + vst4q_lane_u32((uint32_t*)decompressed_ptr[1], store_regs[0], 1); + vst4q_lane_u32((uint32_t*)decompressed_ptr[2], store_regs[0], 2); + vst4q_lane_u32((uint32_t*)decompressed_ptr[3], store_regs[0], 3); + vst4q_lane_u32((uint32_t*)decompressed_ptr[4], store_regs[1], 0); + vst4q_lane_u32((uint32_t*)decompressed_ptr[5], store_regs[1], 1); + vst4q_lane_u32((uint32_t*)decompressed_ptr[6], store_regs[1], 2); + vst4q_lane_u32((uint32_t*)decompressed_ptr[7], store_regs[1], 3); + vst4q_lane_u32((uint32_t*)decompressed_ptr[8], store_regs[2], 0); + vst4q_lane_u32((uint32_t*)decompressed_ptr[9], store_regs[2], 1); + vst4q_lane_u32((uint32_t*)decompressed_ptr[10], store_regs[2], 2); + vst4q_lane_u32((uint32_t*)decompressed_ptr[11], store_regs[2], 3); + vst4q_lane_u32((uint32_t*)decompressed_ptr[12], store_regs[3], 0); + vst4q_lane_u32((uint32_t*)decompressed_ptr[13], store_regs[3], 1); + vst4q_lane_u32((uint32_t*)decompressed_ptr[14], store_regs[3], 2); + vst4q_lane_u32((uint32_t*)decompressed_ptr[15], store_regs[3], 3); +} + +// Decompresses a sublock. We take width and stride parameters to let us recycle +// code between Y subblock and UV subblock decompression routines. UV subblocks +// just halve the width, but skip every other pixel. +template <class T, int width, int stride> +void VectorDecompressSubblock(const std::vector<T>& subblock_list, + int start_idx, + uint8_t** compressed_ptr, + uint8_t* output_buf, + uint32x4_t* outstanding_reads, + uint32x4_t* accumulator) { + static const int pixel_distance = stride / width; + + uint32x4_t escape_codes[4]; + uint32x4_t escape_binary_len_diff[4]; + uint32x4_t k_vals[4]; + uint32x4_t dword_solid_color_mask[4]; + uint8x16_t solid_color_mask; + uint8x16_t output, up_left, up, up_right, right; + + output = VectorReadCompressedHeader( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, solid_color_mask, compressed_ptr); + right = output; + vst1q_u8(output_buf, output); + output_buf -= pixel_distance * kNumOutputLanes; + + for (int i = 0; i < width - 1; i++) { + // Handle first row + output = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + + output = vandq_u8(output, solid_color_mask); + output = vaddq_u8(output, VectorFirstRowPrediction(right)); + + right = output; + + vst1q_u8(output_buf, output); + output_buf -= pixel_distance * kNumOutputLanes; + } + for (size_t y = 1; y < kMT21SubblockHeight; y++) { + // Handle last col + up = vld1q_u8(output_buf + stride * kNumOutputLanes); + + output = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + + output = vandq_u8(output, solid_color_mask); + output = vaddq_u8(output, VectorLastColPrediction(up)); + + up_right = up; + right = output; + + vst1q_u8(output_buf, output); + output_buf -= pixel_distance * kNumOutputLanes; + + up = vld1q_u8(output_buf + stride * kNumOutputLanes); + + for (int x = width - 2; x >= 1; x--) { + // Handle body + up_left = + vld1q_u8(output_buf + (stride - pixel_distance) * kNumOutputLanes); + + output = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + + output = vandq_u8(output, solid_color_mask); + output = + vaddq_u8(output, VectorBodyPrediction(up_left, up, up_right, right)); + + right = output; + up_right = up; + up = up_left; + + vst1q_u8(output_buf, output); + output_buf -= pixel_distance * kNumOutputLanes; + } + // Handle first col + output = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + + output = vandq_u8(output, solid_color_mask); + output = vaddq_u8(output, VectorFirstColPrediction(up, up_right, right)); + vst1q_u8(output_buf, output); + output_buf -= pixel_distance * kNumOutputLanes; + } +} + +// Main entrypoint for vector decompression. +template <class T> +void VectorDecompressSubblockHelper(const std::vector<T>& subblock_list, + int start_idx, + uint8_t* aligned_scratch) {} +template <> +void VectorDecompressSubblockHelper( + const std::vector<MT21YSubblock>& subblock_list, + int start_idx, + uint8_t* aligned_scratch) { + uint8_t* compressed_ptr[kNumOutputLanes]; + uint8_t* decompressed_ptr[kNumOutputLanes]; + uint8_t* output_buf = aligned_scratch + 2 * kMT21RedZoneSize + + kNumOutputLanes * kMT21SubblockSize - kNumOutputLanes; + uint32x4_t outstanding_reads[4] = {{0}}; + uint32x4_t accumulator[4]; + + SubblockGather<MT21YSubblock>(subblock_list, start_idx, aligned_scratch, + compressed_ptr); + for (size_t i = 0; i < kNumOutputLanes; i++) { + decompressed_ptr[i] = subblock_list[start_idx + i].dest; + } + + VectorInitializeAccumulator(accumulator, compressed_ptr); + + VectorDecompressSubblock<MT21YSubblock, kMT21SubblockWidth, + kMT21SubblockWidth>(subblock_list, start_idx, + compressed_ptr, output_buf, + outstanding_reads, accumulator); + + output_buf -= kNumOutputLanes * kMT21SubblockWidth - kNumOutputLanes; + for (int i = 0; i < 4; i++) { + SubblockTransposeScatter(output_buf, decompressed_ptr); + for (int j = 0; j < 16; j++) { + decompressed_ptr[j] += kMT21SubblockWidth; + } + } +} +template <> +void VectorDecompressSubblockHelper( + const std::vector<MT21UVSubblock>& subblock_list, + int start_idx, + uint8_t* aligned_scratch) { + uint8_t* compressed_ptr[16]; + uint8_t* decompressed_ptr[16]; + uint8_t* output_buf = aligned_scratch + 2 * kMT21RedZoneSize + + kNumOutputLanes * kMT21SubblockSize - kNumOutputLanes; + uint32x4_t outstanding_reads[4] = {{0}}; + uint32x4_t accumulator[4]; + + SubblockGather<MT21UVSubblock>(subblock_list, start_idx, aligned_scratch, + compressed_ptr); + for (int i = 0; i < 16; i++) { + decompressed_ptr[i] = subblock_list[start_idx + i].dest; + } + + VectorInitializeAccumulator(accumulator, compressed_ptr); + + VectorDecompressSubblock<MT21UVSubblock, kMT21SubblockWidth / 2, + kMT21SubblockWidth>(subblock_list, start_idx, + compressed_ptr, output_buf, + outstanding_reads, accumulator); + VectorDecompressSubblock<MT21UVSubblock, kMT21SubblockWidth / 2, + kMT21SubblockWidth>(subblock_list, start_idx, + compressed_ptr, output_buf - 16, + outstanding_reads, accumulator); + + output_buf -= 16 * 16 - 16; + for (int i = 0; i < 4; i++) { + SubblockTransposeScatter(output_buf, decompressed_ptr); + for (int j = 0; j < 16; j++) { + decompressed_ptr[j] += kMT21SubblockWidth; + } + } +} + +//////////////////// +// Footer Parsing // +//////////////////// + +constexpr uint64_t kMT21YFooterAlignment = 4096; +constexpr uint64_t kMT21UVFooterAlignment = 2048; + +// MT21 always puts the footer for the Y plane at the beginning of the last page +// in the buffer. For some reason, it puts the UV plane at the beginning of the +// last half-page, meaning the UV footer buffer is 2048 bytes aligned. +size_t ComputeFooterOffset(size_t plane_size, + size_t buf_size, + size_t alignment) { + size_t footer_size = plane_size / kMT21BlockSize / 2; + return ((buf_size - footer_size) & (~(alignment - 1))); +} + +// The footer consists of packed 2-bit fields indicating the size of every +// subblock in 16 byte rows. +void ParseBlockMetadata(const uint8_t* footer, + size_t block_offset, + size_t& subblock1_len, + size_t& subblock2_len) { + // Footer metadata is packed in 2-bit pairs from LSB to MSB. This means we can + // pack 4 subblocks, or 2 blocks into every byte of footer. + const size_t block_idx = block_offset / kMT21BlockSize; + subblock1_len = + kMT21BlockWidth * + (((footer[block_idx / 2] >> ((block_idx % 2) * 4)) & 0x3) + 1); + subblock2_len = + kMT21BlockWidth * + (((footer[block_idx / 2] >> ((block_idx % 2) * 4 + 2)) & 0x3) + 1); +} + +// Subblocks with a compressed size of 64 bytes are actually passthrough +// subblocks. This is a handy function for sorting subblocks into passthrough +// and non-passthrough bins. We can just use a memcpy for passthrough, which is +// cheaper than somehow incorporating passthrough logic into our decompression +// routines. +template <class T> +void BinSubblocks(const uint8_t* src, + const uint8_t* footer, + uint8_t* dest, + size_t block_offset, + std::vector<T>* subblock_bins) { + size_t subblock1_len, subblock2_len; + ParseBlockMetadata(footer, block_offset, subblock1_len, subblock2_len); + T subblock1 = {src + block_offset, dest + block_offset, subblock1_len}; + T subblock2 = {src + block_offset + subblock1_len, + dest + block_offset + kMT21SubblockSize, subblock2_len}; + int subblock1_type = subblock1_len == kMT21SubblockSize; + int subblock2_type = subblock2_len == kMT21SubblockSize; + + subblock_bins[subblock1_type].push_back(subblock1); + subblock_bins[subblock2_type].push_back(subblock2); +} + +} // namespace + +} // namespace media + +#endif + +#endif // MEDIA_GPU_V4L2_MT21_MT21_UTIL_H_
diff --git a/media/gpu/v4l2/mt21/mt21_util_unittest.cc b/media/gpu/v4l2/mt21/mt21_util_unittest.cc new file mode 100644 index 0000000..b8e20d4 --- /dev/null +++ b/media/gpu/v4l2/mt21/mt21_util_unittest.cc
@@ -0,0 +1,418 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "build/build_config.h" + +#if BUILDFLAG(IS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) && \ + (defined(COMPILER_GCC) || defined(__clang__)) + +#include "testing/gtest/include/gtest/gtest.h" + +#include "media/gpu/v4l2/mt21/mt21_util.h" + +#include "base/command_line.h" +#include "base/test/launcher/unit_test_launcher.h" +#include "base/test/test_suite.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" + +namespace media { +namespace { + +TEST(MT21UtilTest, TestBitstreamReader) { + uint8_t buf[64] = { + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + MT21BitstreamReader reader(buf); + + ASSERT_TRUE(reader.ReadNBits(0) == 0x00); + ASSERT_TRUE(reader.PeekNBits(8) == 0x55); + reader.DiscardNBits(1); + ASSERT_TRUE(reader.ReadNBits(7) == 0x55); + reader.DiscardNBits(24); + reader.DiscardNBits(32); + reader.DiscardNBits(32); + reader.DiscardNBits(32); + ASSERT_TRUE(reader.ReadNBits(8) == 0xFF); +} + +TEST(MT21UtilTest, TestReadGolombRiceSymbol) { + constexpr int k = 2; + uint8_t buf[64] = {0}; + // 00=0 010=1 011=-1 1000=2 11111111100000001=-18 + buf[15] = 0b00010011; + buf[14] = 0b10001111; + buf[13] = 0b11111000; + buf[12] = 0b00001000; + MT21BitstreamReader reader(buf); + + ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == 0); + ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == 1); + ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == -1); + ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == 2); + ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == -18); +} + +TEST(MT21UtilTest, TestFastReadGolombRiceSymbol) { + GolombRiceTableEntry cache[kGolombRiceCacheSize]; + PopulateGolombRiceCache(cache); + constexpr int k = 2; + uint8_t buf[64] = {0}; + // 00=0 010=1 011=-1 1000 = 2 11111111100000001=-18 + buf[15] = 0b00010011; + buf[14] = 0b10001111; + buf[13] = 0b11111000; + buf[12] = 0b00001000; + MT21BitstreamReader reader(buf); + + ASSERT_TRUE(cache[0].in_size); + ASSERT_TRUE(FastReadGolombRiceSymbol( + reader, k, cache + (k - 1) * kGolombRiceTableSize) == 0); + ASSERT_TRUE(FastReadGolombRiceSymbol( + reader, k, cache + (k - 1) * kGolombRiceTableSize) == 1); + ASSERT_TRUE(FastReadGolombRiceSymbol( + reader, k, cache + (k - 1) * kGolombRiceTableSize) == -1); + ASSERT_TRUE(FastReadGolombRiceSymbol( + reader, k, cache + (k - 1) * kGolombRiceTableSize) == 2); + ASSERT_TRUE(FastReadGolombRiceSymbol( + reader, k, cache + (k - 1) * kGolombRiceTableSize) == -18); +} + +TEST(MT21UtilTest, TestPredictionMethods) { + ASSERT_TRUE(FirstRowPrediction(0x80) == 0x80); + + ASSERT_TRUE(LastColPrediction(0x80) == 0x80); + + ASSERT_TRUE(FirstColPrediction(0x80, 0x7E, 0x70) == 0x72); + ASSERT_TRUE(FirstColPrediction(0x80, 0x83, 0x70) == 0x80); + ASSERT_TRUE(FirstColPrediction(0x80, 0x6F, 0x70) == 0x70); + + ASSERT_TRUE(BodyPrediction(0x81, 0x80, 0x7E, 0x70) == 0x72); + ASSERT_TRUE(BodyPrediction(0x7F, 0x80, 0x83, 0x70) == 0x71); + ASSERT_TRUE(BodyPrediction(0x82, 0x80, 0x83, 0x70) == 0x80); + ASSERT_TRUE(BodyPrediction(0x6F, 0x80, 0x83, 0x70) == 0x70); +} + +TEST(MT21UtilTest, TestSolidColorBlocks) { + GolombRiceTableEntry cache[kGolombRiceCacheSize]; + PopulateGolombRiceCache(cache); + uint8_t buf[64] = {0}; + uint8_t dest_buf[64] = {0}; + + buf[15] = 0xF0; + buf[14] = 0x1D; + buf[13] = 0xFC; + MT21YSubblock y_subblock = {buf, dest_buf}; + DecompressSubblockHelper(y_subblock, cache); + for (size_t i = 0; i < 64; i++) { + ASSERT_TRUE(dest_buf[i] == 0x80); + } + + MT21UVSubblock uv_subblock = {buf, dest_buf}; + DecompressSubblockHelper(uv_subblock, cache); + for (size_t i = 0; i < 64; i++) { + if (i % 2) { + ASSERT_TRUE(dest_buf[i] == 0x80); + } else { + ASSERT_TRUE(dest_buf[i] == 0x7F); + } + } +} + +TEST(MT21UtilTest, TestCompressedBlocks) { + GolombRiceTableEntry cache[kGolombRiceCacheSize]; + PopulateGolombRiceCache(cache); + uint8_t buf[64] = { + 0x00, 0x00, 0x40, 0x49, 0x01, 0x22, 0x29, 0x02, 0x08, 0x43, 0x41, + 0x20, 0x02, 0x08, 0x48, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, + 0x20, 0x10, 0x80, 0x10, 0x00, 0x84, 0x45, 0x01, 0x08, 0x1B, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + uint8_t dest_buf[64] = {0}; + uint8_t expected_buf[64] = { + 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD3, + 0xD3, 0xD3, 0xD3, 0xD2, 0xD2, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD5, + 0xD5, 0xD5, 0xD5, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD5, + 0xD5, 0xD5, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, + 0xD6, 0xD5, 0xD5, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, + 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD7, 0xD6, + }; + + MT21YSubblock y_subblock = {buf, dest_buf}; + DecompressSubblockHelper(y_subblock, cache); + for (size_t i = 0; i < 64; i++) { + ASSERT_TRUE(dest_buf[i] == expected_buf[i]); + } +} + +TEST(MT21UtilTest, TestVectorReadGolombRiceSymbol) { + uint32x4_t accumulator[4]; + uint32x4_t outstanding_reads[4] = {{0}}; + uint32x4_t escape_codes[4]; + uint32x4_t escape_binary_len_diff[4]; + uint32x4_t k_vals[4]; + uint32x4_t dword_solid_color_mask[4]; + uint8x16_t solid_color_mask; + uint8_t buf[64] = {0}; + // 001=(k=2) 10000000=(top_right=0x80) + buf[63] = 0b00110000; + // 00=0 010=1 + buf[62] = 0b00000010; + // 011=-1 1000=2 11111111100000001=-18 + buf[61] = 0b01110001; + buf[60] = 0b11111111; + buf[59] = 0b00000001; + uint8_t* compressed_ptr[16] = { + buf + 60, buf + 60, buf + 60, buf + 60, buf + 60, buf + 60, + buf + 60, buf + 60, buf + 60, buf + 60, buf + 60, buf + 60, + buf + 60, buf + 60, buf + 60, buf + 60, + }; + + VectorInitializeAccumulator(accumulator, compressed_ptr); + + uint8x16_t top_right = VectorReadCompressedHeader( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, solid_color_mask, compressed_ptr); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(top_right[i] == 0x80); + ASSERT_TRUE(k_vals[i / 4][i % 4] == 2); + } + + uint8x16_t symbol; + symbol = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == 0); + } + symbol = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == 1); + } + symbol = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == -1); + } + symbol = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == 2); + } + symbol = VectorReadGolombRiceSymbol( + accumulator, outstanding_reads, escape_codes, escape_binary_len_diff, + k_vals, dword_solid_color_mask, compressed_ptr); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == -18); + } +} + +TEST(MT21UtilTest, TestVectorPredictionMethods) { + uint8x16_t pred; + + pred = VectorFirstRowPrediction(vdupq_n_u8(0x80)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x80); + } + + pred = VectorLastColPrediction(vdupq_n_u8(0x80)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x80); + } + + pred = VectorFirstColPrediction(vdupq_n_u8(0x80), vdupq_n_u8(0x7E), + vdupq_n_u8(0x70)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x72); + } + pred = VectorFirstColPrediction(vdupq_n_u8(0x80), vdupq_n_u8(0x83), + vdupq_n_u8(0x70)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x80); + } + pred = VectorFirstColPrediction(vdupq_n_u8(0x80), vdupq_n_u8(0x6F), + vdupq_n_u8(0x70)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x70); + } + + pred = VectorBodyPrediction(vdupq_n_u8(0x81), vdupq_n_u8(0x80), + vdupq_n_u8(0x7E), vdupq_n_u8(0x70)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x72); + } + pred = VectorBodyPrediction(vdupq_n_u8(0x7F), vdupq_n_u8(0x80), + vdupq_n_u8(0x83), vdupq_n_u8(0x70)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x71); + } + pred = VectorBodyPrediction(vdupq_n_u8(0x82), vdupq_n_u8(0x80), + vdupq_n_u8(0x83), vdupq_n_u8(0x70)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x80); + } + pred = VectorBodyPrediction(vdupq_n_u8(0x6F), vdupq_n_u8(0x80), + vdupq_n_u8(0x83), vdupq_n_u8(0x70)); + for (int i = 0; i < 16; i++) { + ASSERT_TRUE(pred[i] == 0x70); + } +} + +TEST(MT21UtilTest, TestSubblockGather) { + uint8_t buf[64] = { + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + }; + uint8_t scratch[kMT21ScratchMemorySize] __attribute__((aligned(16))); + std::vector<MT21Subblock> subblock_list; + uint8_t* compressed_ptr[16]; + + for (int i = 0; i < 16; i++) { + subblock_list.push_back({buf, nullptr, 64}); + } + + SubblockGather(subblock_list, 0, scratch, compressed_ptr); + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 64; j++) { + ASSERT_TRUE(scratch[1024 + 64 * i + j] == j); + } + } +} + +TEST(MT21UtilTest, TestSubblockTransposeScatter) { + uint8_t buf[256] __attribute__((aligned(16))); + uint8_t* src = buf; + uint8_t dest_buf[256]; + uint8_t* decompressed_ptr[16]; + + for (int i = 0; i < 16; i++) { + decompressed_ptr[i] = dest_buf + 16 * i; + } + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + buf[j * 16 + i] = i * 16 + j; + } + } + + SubblockTransposeScatter(src, decompressed_ptr); + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + ASSERT_TRUE(dest_buf[i * 16 + j] == i * 16 + j); + } + } +} + +TEST(MT21UtilTest, TestVectorSolidColorBlocks) { + uint8_t buf[64] = {0}; + uint8_t dest_buf[64 * 16] = {0}; + std::vector<MT21YSubblock> y_subblocks; + std::vector<MT21UVSubblock> uv_subblocks; + uint8_t scratch[kMT21ScratchMemorySize] __attribute__((aligned(16))); + + buf[15] = 0xF0; + buf[14] = 0x1D; + buf[13] = 0xFC; + for (int i = 0; i < 16; i++) { + y_subblocks.push_back({buf, dest_buf + 64 * i, 16}); + uv_subblocks.push_back({buf, dest_buf + 64 * i, 16}); + } + + VectorDecompressSubblockHelper<MT21YSubblock>(y_subblocks, 0, scratch); + for (int i = 0; i < 64 * 16; i++) { + ASSERT_TRUE(dest_buf[i] == 0x80); + } + + memset(dest_buf, 0, 64 * 16); + VectorDecompressSubblockHelper<MT21UVSubblock>(uv_subblocks, 0, scratch); + for (int i = 0; i < 64 * 16; i++) { + if (i % 2) { + ASSERT_TRUE(dest_buf[i] == 0x80); + } else { + ASSERT_TRUE(dest_buf[i] == 0x7F); + } + } +} + +TEST(MT21UtilTest, TestVectorCompressedBlocks) { + uint8_t buf[64] = { + 0x00, 0x00, 0x40, 0x49, 0x01, 0x22, 0x29, 0x02, 0x08, 0x43, 0x41, + 0x20, 0x02, 0x08, 0x48, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, + 0x20, 0x10, 0x80, 0x10, 0x00, 0x84, 0x45, 0x01, 0x08, 0x1B, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + uint8_t dest_buf[64 * 16] = {0}; + uint8_t expected_buf[64] = { + 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD3, + 0xD3, 0xD3, 0xD3, 0xD2, 0xD2, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD5, + 0xD5, 0xD5, 0xD5, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD5, + 0xD5, 0xD5, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, + 0xD6, 0xD5, 0xD5, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8, + 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD7, 0xD6, + }; + std::vector<MT21YSubblock> y_subblocks; + uint8_t scratch[kMT21ScratchMemorySize] __attribute__((aligned(16))); + + for (int i = 0; i < 16; i++) { + y_subblocks.push_back({buf, dest_buf + 64 * i, 16}); + } + + VectorDecompressSubblockHelper<MT21YSubblock>(y_subblocks, 0, scratch); + for (int i = 0; i < 64 * 16; i++) { + ASSERT_TRUE(dest_buf[i] == expected_buf[i % 64]); + } +} + +TEST(MT21UtilTest, TestSubblockBinning) { + uint8_t footer[kMT21ScratchMemorySize] + __attribute__((aligned(kMT21YFooterAlignment))); + footer[0] = 0b00000111; + std::vector<MT21YSubblock> bins[2]; + + ASSERT_TRUE(ComputeFooterOffset(512, sizeof(footer), kMT21YFooterAlignment) == + 0); + + BinSubblocks((const uint8_t*)0xDEADBEEF, footer, (uint8_t*)0xC0FFEE, 0, bins); + + ASSERT_TRUE(bins[0].size() == 1); + ASSERT_TRUE(bins[1].size() == 1); + + ASSERT_TRUE((uint64_t)bins[0][0].src == 0xDEADBEEF + 64); + ASSERT_TRUE((uint64_t)bins[0][0].dest == 0xC0FFEE + 64); + ASSERT_TRUE(bins[0][0].len == 32); + + ASSERT_TRUE((uint64_t)bins[1][0].src == 0xDEADBEEF); + ASSERT_TRUE((uint64_t)bins[1][0].dest == 0xC0FFEE); + ASSERT_TRUE(bins[1][0].len == 64); +} + +} // namespace +} // namespace media + +int main(int argc, char** argv) { + base::CommandLine::Init(argc, argv); + + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} + +#endif
diff --git a/media/video/av1_video_encoder.cc b/media/video/av1_video_encoder.cc index f3a1b56f..8b61570 100644 --- a/media/video/av1_video_encoder.cc +++ b/media/video/av1_video_encoder.cc
@@ -76,7 +76,8 @@ if (opts.bitrate.has_value()) { auto& bitrate = opts.bitrate.value(); - config.rc_target_bitrate = bitrate.target_bps() / 1000; + config.rc_target_bitrate = + base::saturated_cast<int32_t>(bitrate.target_bps()) / 1000; switch (bitrate.mode()) { case Bitrate::Mode::kVariable: config.rc_end_usage = AOM_VBR; @@ -359,20 +360,20 @@ switch (frame->format()) { case PIXEL_FORMAT_I420: image->planes[AOM_PLANE_Y] = - frame->GetWritableVisibleData(VideoFrame::kYPlane); + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kYPlane)); image->planes[AOM_PLANE_U] = - frame->GetWritableVisibleData(VideoFrame::kUPlane); + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kUPlane)); image->planes[AOM_PLANE_V] = - frame->GetWritableVisibleData(VideoFrame::kVPlane); + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kVPlane)); image->stride[AOM_PLANE_Y] = frame->stride(VideoFrame::kYPlane); image->stride[AOM_PLANE_U] = frame->stride(VideoFrame::kUPlane); image->stride[AOM_PLANE_V] = frame->stride(VideoFrame::kVPlane); break; case PIXEL_FORMAT_NV12: image->planes[AOM_PLANE_Y] = - frame->GetWritableVisibleData(VideoFrame::kYPlane); + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kYPlane)); image->planes[AOM_PLANE_U] = - frame->GetWritableVisibleData(VideoFrame::kUVPlane); + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kUVPlane)); image->planes[AOM_PLANE_V] = nullptr; image->stride[AOM_PLANE_Y] = frame->stride(VideoFrame::kYPlane); image->stride[AOM_PLANE_U] = frame->stride(VideoFrame::kUVPlane);
diff --git a/media/video/openh264_video_encoder.cc b/media/video/openh264_video_encoder.cc index 9730e66..831de2f0 100644 --- a/media/video/openh264_video_encoder.cc +++ b/media/video/openh264_video_encoder.cc
@@ -386,9 +386,12 @@ picture.iPicHeight = frame->visible_rect().height(); picture.iColorFormat = EVideoFormatType::videoFormatI420; picture.uiTimeStamp = frame->timestamp().InMilliseconds(); - picture.pData[0] = frame->GetWritableVisibleData(VideoFrame::kYPlane); - picture.pData[1] = frame->GetWritableVisibleData(VideoFrame::kUPlane); - picture.pData[2] = frame->GetWritableVisibleData(VideoFrame::kVPlane); + picture.pData[0] = + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kYPlane)); + picture.pData[1] = + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kUPlane)); + picture.pData[2] = + const_cast<uint8_t*>(frame->visible_data(VideoFrame::kVPlane)); picture.iStride[0] = frame->stride(VideoFrame::kYPlane); picture.iStride[1] = frame->stride(VideoFrame::kUPlane); picture.iStride[2] = frame->stride(VideoFrame::kVPlane);
diff --git a/mojo/core/ipcz_driver/driver.cc b/mojo/core/ipcz_driver/driver.cc index 1bcb379b..a46754e 100644 --- a/mojo/core/ipcz_driver/driver.cc +++ b/mojo/core/ipcz_driver/driver.cc
@@ -170,7 +170,7 @@ IpczResult IPCZ_API ActivateTransport(IpczDriverHandle transport_handle, - IpczHandle ipcz_transport, + IpczHandle listener, IpczTransportActivityHandler activity_handler, uint32_t flags, const void* options) { @@ -179,7 +179,7 @@ return IPCZ_RESULT_INVALID_ARGUMENT; } - transport->Activate(ipcz_transport, activity_handler); + transport->Activate(listener, activity_handler); return IPCZ_RESULT_OK; }
diff --git a/net/der/parse_values.cc b/net/der/parse_values.cc index 1385819..6fa96d8 100644 --- a/net/der/parse_values.cc +++ b/net/der/parse_values.cc
@@ -115,8 +115,7 @@ } break; default: - NOTREACHED(); - return false; + NOTREACHED_NORETURN(); } return true; }
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc index d084942..bc714328 100644 --- a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc +++ b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -26,6 +26,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/task/thread_pool.h" #include "base/test/bind.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "base/time/time.h" @@ -46,6 +47,7 @@ #include "sql/meta_table.h" #include "sql/statement.h" #include "sql/transaction.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -213,6 +215,10 @@ void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); } void TearDown() override { + if (!expect_init_errors_) { + EXPECT_THAT(histograms_.GetAllSamples("Cookie.ErrorInitializeDB"), + ::testing::IsEmpty()); + } DestroyStore(); } @@ -227,6 +233,8 @@ base::ScopedTempDir temp_dir_; scoped_refptr<SQLitePersistentCookieStore> store_; std::unique_ptr<CookieCryptor> cookie_crypto_delegate_; + base::HistogramTester histograms_; + bool expect_init_errors_ = false; }; TEST_F(SQLitePersistentCookieStoreTest, TestInvalidMetaTableRecovery) { @@ -1484,6 +1492,7 @@ EXPECT_TRUE(set_cookie_callback.result().status.IsInclude()); // Things should commit once going out of scope. + expect_init_errors_ = true; } TEST_F(SQLitePersistentCookieStoreTest, Coalescing) { @@ -1631,6 +1640,32 @@ db_thread_event_.Signal(); } +TEST_P(SQLitePersistentCookieStoreExclusiveAccessTest, LockedStoreAlreadyOpen) { + base::HistogramTester histograms; + base::File file( + temp_dir_.GetPath().Append(kCookieFilename), + base::File::Flags::FLAG_CREATE | base::File::Flags::FLAG_READ); + ASSERT_TRUE(file.IsValid()); + + Create(false, false, true /* want current thread to invoke the store. */, + /* exclusive access */ ShouldBeExclusive()); + + base::RunLoop run_loop; + store_->Load(base::BindLambdaForTesting( + [&](CanonicalCookieVector cookies) { run_loop.Quit(); }), + NetLogWithSource()); + run_loop.Run(); + + // Note: The non-exclusive path is verified in the TearDown for the fixture. + if (ShouldBeExclusive()) { + expect_init_errors_ = true; + histograms.ExpectUniqueSample("Cookie.ErrorInitializeDB", + sql::SqliteLoggedResultCode::kCantOpen, 1); + histograms.ExpectUniqueSample("Cookie.WinGetLastErrorInitializeDB", + ERROR_SHARING_VIOLATION, 1); + } +} + INSTANTIATE_TEST_SUITE_P(All, SQLitePersistentCookieStoreExclusiveAccessTest, ::testing::Bool(), @@ -1640,6 +1675,25 @@ #endif // BUILDFLAG(IS_WIN) +TEST_F(SQLitePersistentCookieStoreTest, CorruptStore) { + base::HistogramTester histograms; + base::WriteFile(temp_dir_.GetPath().Append(kCookieFilename), + "SQLite format 3 foobarfoobarfoobar"); + + Create(false, false, true /* want current thread to invoke the store. */, + false); + + base::RunLoop run_loop; + store_->Load(base::BindLambdaForTesting( + [&](CanonicalCookieVector cookies) { run_loop.Quit(); }), + NetLogWithSource()); + run_loop.Run(); + + expect_init_errors_ = true; + histograms.ExpectUniqueSample("Cookie.ErrorInitializeDB", + sql::SqliteLoggedResultCode::kNotADatabase, 1); +} + bool CreateV10Schema(sql::Database* db) { sql::MetaTable meta_table; if (!meta_table.Init(db, /* version = */ 10,
diff --git a/net/extras/sqlite/sqlite_persistent_store_backend_base.cc b/net/extras/sqlite/sqlite_persistent_store_backend_base.cc index 11c98da..726ec48 100644 --- a/net/extras/sqlite/sqlite_persistent_store_backend_base.cc +++ b/net/extras/sqlite/sqlite_persistent_store_backend_base.cc
@@ -18,6 +18,10 @@ #include "sql/database.h" #include "sql/error_delegate_util.h" +#if BUILDFLAG(IS_WIN) +#include <windows.h> +#endif // BUILDFLAG(IS_WIN) + namespace net { SQLitePersistentStoreBackendBase::SQLitePersistentStoreBackendBase( @@ -262,6 +266,15 @@ corruption_detected_ = true; + if (!initialized_) { + sql::UmaHistogramSqliteResult(histogram_tag_ + ".ErrorInitializeDB", error); + +#if BUILDFLAG(IS_WIN) + base::UmaHistogramSparse(histogram_tag_ + ".WinGetLastErrorInitializeDB", + ::GetLastError()); +#endif // BUILDFLAG(IS_WIN) + } + // Don't just do the close/delete here, as we are being called by |db| and // that seems dangerous. // TODO(shess): Consider just calling RazeAndPoison() immediately.
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn index 095fa54b..8e00a660 100644 --- a/net/third_party/quiche/BUILD.gn +++ b/net/third_party/quiche/BUILD.gn
@@ -1853,6 +1853,8 @@ visibility = [ ":quiche_tests" ] testonly = true sources = [ + "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc", + "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h", "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc", "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h", "src/quiche/blind_sign_auth/test_tools/mock_blind_sign_auth_interface.h",
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png index 6b06d62..bc129eb 100644 --- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png +++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png index 0bc5fd5..648ac9f 100644 --- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png +++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png index 62ce13d..c18ad0e 100644 --- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png +++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png index 6a15f769..b4bd3c70 100644 --- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png +++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png index 44e83ef..20f8ac70 100644 --- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png +++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png index 3f2f782..f763009 100644 --- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png +++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png index 44f213d..5252f88 100644 --- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png +++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png index 7a44a52..6308281 100644 --- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png +++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png index 62ce13d..c18ad0e 100644 --- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png +++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png index 6a15f769..b4bd3c70 100644 --- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png +++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png Binary files differ
diff --git a/services/data_decoder/public/cpp/android/BUILD.gn b/services/data_decoder/public/cpp/android/BUILD.gn index c09d7e62..00793ef 100644 --- a/services/data_decoder/public/cpp/android/BUILD.gn +++ b/services/data_decoder/public/cpp/android/BUILD.gn
@@ -18,7 +18,8 @@ "//base:jni_java", "//build/android:build_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + + srcjar_deps = [ ":safe_json_jni_headers" ] sources = [] + _jni_sources } }
diff --git a/services/device/generic_sensor/BUILD.gn b/services/device/generic_sensor/BUILD.gn index dacdaa57..845dfd1 100644 --- a/services/device/generic_sensor/BUILD.gn +++ b/services/device/generic_sensor/BUILD.gn
@@ -158,7 +158,7 @@ ] generate_jni("jni_headers") { - visibility = [ ":generic_sensor" ] + visibility = [ ":*" ] sources = device_sensors_jni_sources } @@ -169,6 +169,7 @@ "//services/device:*", ] + srcjar_deps = [ ":jni_headers" ] sources = device_sensors_jni_sources deps = [ "//base:base_java", @@ -177,6 +178,5 @@ "//services/device/public/mojom:generic_sensor_java", "//third_party/androidx:androidx_annotation_annotation_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } }
diff --git a/services/device/usb/BUILD.gn b/services/device/usb/BUILD.gn index 2def015..92073bb 100644 --- a/services/device/usb/BUILD.gn +++ b/services/device/usb/BUILD.gn
@@ -240,6 +240,7 @@ } android_library("java") { + srcjar_deps = [ ":jni_headers" ] sources = java_sources_needing_jni deps = [ "//base:base_java", @@ -247,6 +248,5 @@ "//build/android:build_java", "//third_party/androidx:androidx_annotation_annotation_java", ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } }
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 04a55a8..a2dc017 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -233,8 +233,6 @@ #define SK_ENABLE_SKSL_IN_RASTER_PIPELINE -#define SK_USE_INACCURATE_DIV255_IN_BLEND - #define SK_USE_LEGACY_DROPSHADOW_IMAGEFILTER #define SK_USE_LEGACY_DISPLACEMENT_MAP_IMAGEFILTER
diff --git a/sql/sqlite_result_code.cc b/sql/sqlite_result_code.cc index 66dbd21..57fce23f 100644 --- a/sql/sqlite_result_code.cc +++ b/sql/sqlite_result_code.cc
@@ -6,6 +6,7 @@ #include <ostream> // Needed to compile NOTREACHED() with operator <<. #include <set> +#include <string> #include <utility> #include "base/check_op.h" @@ -397,7 +398,7 @@ return logged_code; } -void UmaHistogramSqliteResult(const char* histogram_name, +void UmaHistogramSqliteResult(const std::string& histogram_name, int sqlite_result_code) { auto logged_code = ToSqliteLoggedResultCode(sqlite_result_code); base::UmaHistogramEnumeration(histogram_name, logged_code);
diff --git a/sql/sqlite_result_code.h b/sql/sqlite_result_code.h index ec9d868..35b2b35 100644 --- a/sql/sqlite_result_code.h +++ b/sql/sqlite_result_code.h
@@ -6,6 +6,7 @@ #define SQL_SQLITE_RESULT_CODE_H_ #include <iosfwd> +#include <string> #include "base/component_export.h" #include "base/dcheck_is_on.h" @@ -83,7 +84,7 @@ // Works for all result codes, including success codes and extended error codes. // DCHECKs if provided result code should not occur in Chrome's usage of SQLite. COMPONENT_EXPORT(SQL) -void UmaHistogramSqliteResult(const char* histogram_name, +void UmaHistogramSqliteResult(const std::string& histogram_name, int sqlite_result_code); // Converts a SQLite result code into a UMA logging-friendly form.
diff --git a/testing/buildbot/chromium.fuchsia.fyi.json b/testing/buildbot/chromium.fuchsia.fyi.json index b870b04f..9abeaf3d 100644 --- a/testing/buildbot/chromium.fuchsia.fyi.json +++ b/testing/buildbot/chromium.fuchsia.fyi.json
@@ -1065,7 +1065,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1082,7 +1082,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1099,7 +1099,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1119,7 +1119,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1136,7 +1136,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1153,7 +1153,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1170,7 +1170,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1187,7 +1187,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1204,7 +1204,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1221,7 +1221,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1238,7 +1238,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1255,7 +1255,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1272,7 +1272,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1289,7 +1289,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1306,7 +1306,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1323,7 +1323,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1341,7 +1341,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1363,7 +1363,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1380,7 +1380,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1398,7 +1398,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1418,7 +1418,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1435,7 +1435,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1452,7 +1452,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1469,7 +1469,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1486,7 +1486,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1506,7 +1506,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1523,7 +1523,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1540,7 +1540,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1557,7 +1557,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1577,7 +1577,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1594,7 +1594,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1611,7 +1611,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1628,7 +1628,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1645,7 +1645,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1662,7 +1662,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1679,7 +1679,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1696,7 +1696,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1713,7 +1713,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1730,7 +1730,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1747,7 +1747,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1764,7 +1764,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1781,7 +1781,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1801,7 +1801,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1822,7 +1822,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1839,7 +1839,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1859,7 +1859,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1876,7 +1876,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1896,7 +1896,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1913,7 +1913,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1930,7 +1930,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1947,7 +1947,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1964,7 +1964,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1981,7 +1981,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2001,7 +2001,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2018,7 +2018,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2035,7 +2035,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2055,7 +2055,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2075,7 +2075,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2095,7 +2095,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2112,7 +2112,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2132,7 +2132,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2149,7 +2149,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2166,7 +2166,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2183,7 +2183,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2200,7 +2200,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2226,7 +2226,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2249,7 +2249,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2266,7 +2266,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2283,7 +2283,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2300,7 +2300,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2317,7 +2317,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2334,7 +2334,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2351,7 +2351,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2368,7 +2368,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2385,7 +2385,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2402,7 +2402,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2419,7 +2419,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2436,7 +2436,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2453,7 +2453,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2470,7 +2470,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2487,7 +2487,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2504,7 +2504,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -2522,7 +2522,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2544,7 +2544,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2561,7 +2561,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -2579,7 +2579,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2596,7 +2596,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2613,7 +2613,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2630,7 +2630,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2647,7 +2647,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2664,7 +2664,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2681,7 +2681,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2698,7 +2698,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2715,7 +2715,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2732,7 +2732,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2749,7 +2749,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2766,7 +2766,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2783,7 +2783,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2800,7 +2800,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2817,7 +2817,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2834,7 +2834,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2851,7 +2851,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2868,7 +2868,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2885,7 +2885,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2902,7 +2902,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2919,7 +2919,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2936,7 +2936,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2953,7 +2953,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2973,7 +2973,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -2994,7 +2994,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3011,7 +3011,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3028,7 +3028,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3045,7 +3045,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3065,7 +3065,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3082,7 +3082,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3099,7 +3099,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3116,7 +3116,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3133,7 +3133,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3150,7 +3150,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3170,7 +3170,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3187,7 +3187,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3204,7 +3204,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3224,7 +3224,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3244,7 +3244,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3264,7 +3264,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3281,7 +3281,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3301,7 +3301,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3318,7 +3318,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3335,7 +3335,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3352,7 +3352,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3369,7 +3369,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3394,7 +3394,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.fuchsia.json b/testing/buildbot/chromium.fuchsia.json index e92421a..df7c637 100644 --- a/testing/buildbot/chromium.fuchsia.json +++ b/testing/buildbot/chromium.fuchsia.json
@@ -3679,7 +3679,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3696,7 +3696,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3713,7 +3713,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3730,7 +3730,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3747,7 +3747,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3764,7 +3764,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3781,7 +3781,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3798,7 +3798,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3815,7 +3815,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3832,7 +3832,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3849,7 +3849,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3866,7 +3866,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3883,7 +3883,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3900,7 +3900,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3917,7 +3917,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3934,7 +3934,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -3952,7 +3952,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3974,7 +3974,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3991,7 +3991,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -4009,7 +4009,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4033,7 +4033,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -4051,7 +4051,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4068,7 +4068,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4085,7 +4085,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4102,7 +4102,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4119,7 +4119,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4136,7 +4136,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4153,7 +4153,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4170,7 +4170,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4187,7 +4187,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4204,7 +4204,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4221,7 +4221,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4238,7 +4238,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4255,7 +4255,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4272,7 +4272,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4289,7 +4289,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4306,7 +4306,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4323,7 +4323,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4340,7 +4340,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4357,7 +4357,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4374,7 +4374,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4391,7 +4391,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4408,7 +4408,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4428,7 +4428,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -4449,7 +4449,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4466,7 +4466,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4483,7 +4483,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4500,7 +4500,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4520,7 +4520,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4537,7 +4537,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4554,7 +4554,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4571,7 +4571,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4588,7 +4588,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4605,7 +4605,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4625,7 +4625,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4642,7 +4642,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4659,7 +4659,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4679,7 +4679,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4699,7 +4699,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4719,7 +4719,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4736,7 +4736,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4756,7 +4756,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4773,7 +4773,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4790,7 +4790,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4807,7 +4807,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4824,7 +4824,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4849,7 +4849,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4881,7 +4881,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4913,7 +4913,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -4945,7 +4945,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false, @@ -4978,7 +4978,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false, @@ -5011,7 +5011,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false, @@ -5053,7 +5053,7 @@ "dimension_sets": [ { "kvm": "1", - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false,
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index a7f6ec0..e84b31ec 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -988,7 +988,8 @@ } ], "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 }, "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/" },
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json index e4dae96d..a6aefada 100644 --- a/testing/buildbot/chromium.gpu.json +++ b/testing/buildbot/chromium.gpu.json
@@ -311,7 +311,8 @@ } ], "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 }, "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/" },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 36cd0e8..57f4ace 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -4083,6 +4083,24 @@ 'linux-code-coverage', ], }, + 'trace_test': { + 'modifications': { + # The browser is restarted after every test in this suite, which includes + # re-applying permissions. Nexus 5Xs are very slow to apply permissions + # compared to other devices, so increase sharding to offset the increased + # runtime. + 'Android FYI Release (Nexus 5X)': { + 'swarming': { + 'shards': 2, + }, + }, + 'Android Release (Nexus 5X)': { + 'swarming': { + 'shards': 2, + }, + }, + }, + }, 'unit_tests': { 'remove_from': [ 'android-pie-arm64-rel', # https://crbug.com/1010211
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 1a3b3ad..fac99e9 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2844,7 +2844,7 @@ 'browser_config': 'web-engine-shell', 'os_type': 'fuchsia', 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'swarming': { 'dimension_sets': [ @@ -2881,7 +2881,7 @@ }, 'fuchsia-fyi-x64-asan': { 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'swarming': { 'dimension_sets': [ @@ -2900,7 +2900,7 @@ 'all', ], 'mixins': [ - 'linux-bionic', + 'linux-jammy', ], 'swarming': { 'dimension_sets': [
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 6a1ac98..60af4977 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -6785,6 +6785,13 @@ "enable_features": [ "HttpsUpgrades" ] + }, + { + "name": "EnabledWithHttpsFirstModeForEngagedSites", + "enable_features": [ + "HttpsFirstModeV2ForEngagedSites", + "HttpsUpgrades" + ] } ] }
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index 882ee3c..86fc0592 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -684,18 +684,12 @@ ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z - ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z - ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z - ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z - ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z + ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z + ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ @@ -795,6 +789,7 @@ ??$__distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z ??$__distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z + ??$__distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z @@ -957,7 +952,7 @@ ??$__validate_iter_reference@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z - ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_J@Z + ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K_KX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z @@ -1019,7 +1014,6 @@ ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z ??$copy@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEBV234@0PEAV234@@Z ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V201@@Z - ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@_JV201@@Z ??$countl_zero@_K@absl@@YAH_K@Z ??$countr_zero@I@absl@@YAHI@Z ??$countr_zero@_K@absl@@YAH_K@Z @@ -1055,6 +1049,7 @@ ??$distance@PEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JPEBUTransition@cctz@time_internal@absl@@0@Z ??$distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z ??$distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z ??$distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z ??$distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z @@ -1189,7 +1184,6 @@ ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z ??$next@AEAPEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEBUTransition@cctz@time_internal@absl@@AEAPEBU3456@_J@Z ??$next@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@_J@Z - ??$next@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@_J@Z ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z ??$rotr@I@absl@@YAIIH@Z ??$rotr@_K@absl@@YA_K_KH@Z
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def index 249c9c1..fdef613 100644 --- a/third_party/abseil-cpp/symbols_arm64_rel.def +++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -151,19 +151,18 @@ ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z - ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z - ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z - ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@@Z ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z + ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index 97e28070..e416166 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -683,18 +683,12 @@ ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z - ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z - ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z - ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z - ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z + ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z + ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ @@ -794,6 +788,7 @@ ??$__distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z ??$__distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z + ??$__distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z @@ -956,7 +951,7 @@ ??$__validate_iter_reference@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z - ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_J@Z + ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K_KX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z @@ -1018,7 +1013,6 @@ ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z ??$copy@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEBV234@0PEAV234@@Z ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V201@@Z - ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@_JV201@@Z ??$countl_zero@I@absl@@YAHI@Z ??$countl_zero@_K@absl@@YAH_K@Z ??$countr_zero@I@absl@@YAHI@Z @@ -1055,6 +1049,7 @@ ??$distance@PEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JPEBUTransition@cctz@time_internal@absl@@0@Z ??$distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z ??$distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z ??$distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z ??$distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z @@ -1189,7 +1184,6 @@ ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z ??$next@AEAPEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEBUTransition@cctz@time_internal@absl@@AEAPEBU3456@_J@Z ??$next@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@_J@Z - ??$next@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@_J@Z ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z ??$rotr@I@absl@@YAIIH@Z ??$rotr@_K@absl@@YA_K_KH@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def index ccf52cf..e6f0436 100644 --- a/third_party/abseil-cpp/symbols_x64_rel.def +++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -138,13 +138,11 @@ ??$StrFormat@DHHHHH_JIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HPEBDV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@0@AEBDAEBH2222AEB_JAEBIAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@2AEBQEBD5@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z - ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z - ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z - ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z ??$__construct_one_at_end@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@@Z @@ -159,6 +157,7 @@ ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__unwrap_and_dispatch@U?$__overload@U?$__copy_loop@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@U__copy_trivial@23@@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z + ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def index 276c597d..9856f9a3 100644 --- a/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -137,14 +137,12 @@ ??$StrFormat@DHHHHH_JIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HPEBDV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@0@AEBDAEBH2222AEB_JAEBIAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@2AEBQEBD5@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z - ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z - ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z - ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z - ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z - ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z + ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z + ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z ??$__construct_one_at_end@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z ??$__construct_one_at_end@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z ??$__construct_one_at_end@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBQEAVLogSink@absl@@@Z @@ -164,6 +162,7 @@ ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z ??$__unwrap_and_dispatch@U?$__overload@U?$__copy_loop@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@U__copy_trivial@23@@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z + ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index fb921ae2..918099c 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -679,18 +679,12 @@ ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAVFormatArgImpl@str_format_internal@absl@@@01@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@I@Z - ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@I@Z - ??$__assign_with_size@PBVFormatArgImpl@str_format_internal@absl@@PBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0H@Z - ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@H@Z - ??$__construct_at_end@PBVFormatArgImpl@str_format_internal@absl@@PBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0I@Z + ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z + ??$__construct_at_end@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0I@Z ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@I@Z ??$__construct_node_hash@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ @@ -790,6 +784,7 @@ ??$__distance@PBUPayload@status_internal@absl@@@__Cr@std@@YAHPBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z ??$__distance@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z ??$__distance@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z + ??$__distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@YAHV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z ??$__distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z @@ -952,7 +947,7 @@ ??$__validate_iter_reference@AAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ ??$advance@PBUTransition@cctz@time_internal@absl@@H@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPBUTransition@cctz@time_internal@absl@@H@Z ??$advance@PBUTransition@cctz@time_internal@absl@@HHX@__Cr@std@@YAXAAPBUTransition@cctz@time_internal@absl@@H@Z - ??$advance@PBVFormatArgImpl@str_format_internal@absl@@HHX@__Cr@std@@YAXAAPBVFormatArgImpl@str_format_internal@absl@@H@Z + ??$advance@PBVFormatArgImpl@str_format_internal@absl@@IIX@__Cr@std@@YAXAAPBVFormatArgImpl@str_format_internal@absl@@I@Z ??$assign@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z @@ -1014,7 +1009,6 @@ ??$construct_at@UViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@AAIPAU123@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV501@AAI@Z ??$copy@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@__Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PBV234@0PAV234@@Z ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0V201@@Z - ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@HV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@HV201@@Z ??$countl_zero@I@absl@@YAHI@Z ??$countl_zero@_K@absl@@YAH_K@Z ??$countr_zero@I@absl@@YAHI@Z @@ -1051,6 +1045,7 @@ ??$distance@PBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAHPBUTransition@cctz@time_internal@absl@@0@Z ??$distance@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0@Z ??$distance@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0@Z + ??$distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@YAHV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0@Z ??$distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z ??$distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z ??$distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0@Z @@ -1183,7 +1178,6 @@ ??$move_backward@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z ??$next@AAPBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPBUTransition@cctz@time_internal@absl@@AAPBU3456@H@Z ??$next@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@H@Z - ??$next@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@H@Z ??$reset@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z ??$rotr@I@absl@@YAIIH@Z ??$rotr@_K@absl@@YA_K_KH@Z
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def index 4b85bf2..2f1f5b3 100644 --- a/third_party/abseil-cpp/symbols_x86_rel.def +++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -148,19 +148,18 @@ ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAVFormatArgImpl@str_format_internal@absl@@@01@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@I@Z - ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@I@Z - ??$__assign_with_size@PBVFormatArgImpl@str_format_internal@absl@@PBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0H@Z - ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@H@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@I@Z - ??$__construct_at_end_with_size@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@I@Z + ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z + ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z + ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPAUPayload@status_internal@absl@@@Z ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PBU5678@PBU5678@U5678@U__identity@23@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@$$QAUByCivilTime@2345@$$QAU__identity@01@@Z + ??$assign@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z
diff --git a/third_party/blink/renderer/core/accessibility/ax_object_cache.h b/third_party/blink/renderer/core/accessibility/ax_object_cache.h index f993586..194382b 100644 --- a/third_party/blink/renderer/core/accessibility/ax_object_cache.h +++ b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
@@ -54,7 +54,6 @@ class HTMLTableElement; class HTMLFrameOwnerElement; class HTMLSelectElement; -class LayoutBlockFlow; class LayoutRect; class LocalFrameView; class NGAbstractInlineTextBox; @@ -116,8 +115,6 @@ // Called by a node when text or a text equivalent (e.g. alt) attribute is // changed. virtual void TextChanged(const LayoutObject*) = 0; - // Called when the NGOffsetMapping is invalidated for the given object. - virtual void TextOffsetsChanged(const LayoutBlockFlow*) = 0; virtual void DocumentTitleChanged() = 0; // Called when a layout tree for a node has just been attached, so we can make // sure we have the right subclass of AXObject.
diff --git a/third_party/blink/renderer/core/editing/editing_behavior.h b/third_party/blink/renderer/core/editing/editing_behavior.h index 2b59714..cea818e 100644 --- a/third_party/blink/renderer/core/editing/editing_behavior.h +++ b/third_party/blink/renderer/core/editing/editing_behavior.h
@@ -40,11 +40,13 @@ // can control it here. // When extending a selection beyond the top or bottom boundary of an editable - // area, maintain the horizontal position on Windows and Android but extend it - // to the boundary of the editable content on Mac and Linux. + // area, maintain the horizontal position on Windows, Android and ChromeOS but + // extend it to the boundary of the editable content on Mac and Linux. bool ShouldMoveCaretToHorizontalBoundaryWhenPastTopOrBottom() const { return type_ != mojom::blink::EditingBehavior::kEditingWindowsBehavior && - type_ != mojom::blink::EditingBehavior::kEditingAndroidBehavior; + type_ != mojom::blink::EditingBehavior::kEditingAndroidBehavior && + !(type_ == mojom::blink::EditingBehavior::kEditingChromeOSBehavior && + RuntimeEnabledFeatures::TouchTextEditingRedesignEnabled()); } bool ShouldSelectReplacement() const {
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc index 588a5bf..f87687b 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc
@@ -122,6 +122,7 @@ GridItemData::GridItemData( NGBlockNode node, const ComputedStyle& root_grid_style, + FontBaseline parent_grid_font_baseline, bool parent_must_consider_grid_items_for_column_sizing, bool parent_must_consider_grid_items_for_row_sizing) : node(node), @@ -132,7 +133,8 @@ is_sizing_dependent_on_block_size(false), is_subgridded_to_parent_grid(false), must_consider_grid_items_for_column_sizing(false), - must_consider_grid_items_for_row_sizing(false) { + must_consider_grid_items_for_row_sizing(false), + parent_grid_font_baseline(parent_grid_font_baseline) { const auto& style = node.Style(); const bool is_replaced = node.IsReplaced(); @@ -198,7 +200,7 @@ // The `false, true, false, true` parameters get the converter to calculate // whether the subgrids and its root grid are opposite direction in all cases. const LogicalToLogical<bool> direction_converter( - style.GetWritingDirection(), root_grid_style.GetWritingDirection(), + style.GetWritingDirection(), root_grid_writing_direction, /* inline_start */ false, /* inline_end */ true, /* block_start */ false, /* block_end */ true);
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h index 6d45f68..fc8eb01 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
@@ -34,6 +34,7 @@ GridItemData(NGBlockNode node, const ComputedStyle& root_grid_style, + FontBaseline parent_grid_font_baseline, bool parent_must_consider_grid_items_for_column_sizing = false, bool parent_must_consider_grid_items_for_row_sizing = false); @@ -233,6 +234,8 @@ bool must_consider_grid_items_for_column_sizing : 1; bool must_consider_grid_items_for_row_sizing : 1; + FontBaseline parent_grid_font_baseline; + AxisEdge inline_axis_alignment; AxisEdge block_axis_alignment;
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc index 333fc6a..599fbfe 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -1021,29 +1021,33 @@ : margins.block_start); } -} // namespace +LayoutUnit GetLogicalBaseline(const GridItemData& grid_item, + const NGBoxFragment& baseline_fragment, + GridTrackSizingDirection track_direction) { + const auto font_baseline = grid_item.parent_grid_font_baseline; -LayoutUnit NGGridLayoutAlgorithm::GetLogicalBaseline( - const NGBoxFragment& baseline_fragment, - const bool is_last_baseline) const { - const auto font_baseline = Style().GetFontBaseline(); - return is_last_baseline + return grid_item.IsLastBaselineSpecified(track_direction) ? baseline_fragment.BlockSize() - baseline_fragment.LastBaselineOrSynthesize(font_baseline) : baseline_fragment.FirstBaselineOrSynthesize(font_baseline); } -LayoutUnit NGGridLayoutAlgorithm::GetSynthesizedLogicalBaseline( - const LayoutUnit block_size, - const bool is_flipped_lines, - const bool is_last_baseline) const { - const auto font_baseline = Style().GetFontBaseline(); +LayoutUnit GetSynthesizedLogicalBaseline( + const GridItemData& grid_item, + LayoutUnit block_size, + GridTrackSizingDirection track_direction) { const auto synthesized_baseline = NGBoxFragment::SynthesizedBaseline( - font_baseline, is_flipped_lines, block_size); - return is_last_baseline ? block_size - synthesized_baseline - : synthesized_baseline; + grid_item.parent_grid_font_baseline, + grid_item.BaselineWritingDirection(track_direction).IsFlippedLines(), + block_size); + + return grid_item.IsLastBaselineSpecified(track_direction) + ? block_size - synthesized_baseline + : synthesized_baseline; } +} // namespace + LayoutUnit NGGridLayoutAlgorithm::ContributionSizeForGridItem( const NGGridSizingSubtree& sizing_subtree, GridItemContributionType contribution_type, @@ -1139,9 +1143,7 @@ if (grid_item->IsBaselineAligned(track_direction)) { CalculateBaselineShim(GetSynthesizedLogicalBaseline( - content_size, - grid_item->BaselineWritingDirection(track_direction).IsFlippedLines(), - grid_item->IsLastBaselineSpecified(track_direction))); + *grid_item, content_size, track_direction)); } return content_size + baseline_shim; }; @@ -1191,9 +1193,8 @@ To<NGPhysicalBoxFragment>(result->PhysicalFragment())); if (grid_item->IsBaselineAligned(track_direction)) { - CalculateBaselineShim(GetLogicalBaseline( - baseline_fragment, - grid_item->IsLastBaselineSpecified(track_direction))); + CalculateBaselineShim( + GetLogicalBaseline(*grid_item, baseline_fragment, track_direction)); } return baseline_fragment.BlockSize() + baseline_shim; }; @@ -1587,10 +1588,9 @@ ComputeMarginsFor(space, item_style, baseline_writing_direction), subgridded_item, track_direction, writing_mode); - const bool is_last_baseline = - grid_item.IsLastBaselineSpecified(track_direction); const LayoutUnit baseline = - extra_margin + GetLogicalBaseline(baseline_fragment, is_last_baseline); + extra_margin + + GetLogicalBaseline(grid_item, baseline_fragment, track_direction); // "If a box spans multiple shared alignment contexts, then it participates // in first/last baseline alignment within its start-most/end-most shared @@ -3505,9 +3505,7 @@ // and its track baseline. const LayoutUnit baseline_delta = Baseline(layout_data, grid_item, track_direction) - - GetLogicalBaseline( - baseline_fragment, - grid_item.IsLastBaselineSpecified(track_direction)); + GetLogicalBaseline(grid_item, baseline_fragment, track_direction); if (grid_item.BaselineGroup(track_direction) == BaselineGroup::kMajor) return baseline_delta; @@ -4050,7 +4048,8 @@ DCHECK(child.IsOutOfFlowPositioned()); absl::optional<LogicalRect> containing_block_rect; - GridItemData out_of_flow_item(child, container_style); + GridItemData out_of_flow_item(child, container_style, + container_style.GetFontBaseline()); // TODO(layout-dev): If the below ends up being removed (as a result of // [1]), we could likely implement some of the same optimizations as OOFs in
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h index 73cdf2c..4b1531c 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
@@ -18,8 +18,6 @@ namespace blink { -class NGBoxFragment; - // This enum corresponds to each step used to accommodate grid items across // intrinsic tracks according to their min and max track sizing functions, as // defined in https://drafts.csswg.org/css-grid-2/#algo-spanning-items. @@ -88,12 +86,6 @@ LayoutUnit ComputeIntrinsicBlockSizeIgnoringChildren() const; - LayoutUnit GetLogicalBaseline(const NGBoxFragment&, - const bool is_last_baseline) const; - LayoutUnit GetSynthesizedLogicalBaseline(const LayoutUnit block_size, - const bool is_flipped_lines, - const bool is_last_baseline) const; - // Returns the size that a grid item will distribute across the tracks with an // intrinsic sizing function it spans in the relevant track direction. LayoutUnit ContributionSizeForGridItem(
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc index 93a77d0f1..6567feb 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc
@@ -17,7 +17,8 @@ const NGGridPlacementData& placement_data, HeapVector<Member<LayoutBox>>* oof_children, bool* has_nested_subgrid) const { - return ConstructGridItems(placement_data, Style(), + return ConstructGridItems(placement_data, /* root_grid_style */ Style(), + /* parent_grid_style */ Style(), placement_data.HasStandaloneAxis(kForColumns), placement_data.HasStandaloneAxis(kForRows), oof_children, has_nested_subgrid); @@ -26,6 +27,7 @@ GridItems NGGridNode::ConstructGridItems( const NGGridPlacementData& placement_data, const ComputedStyle& root_grid_style, + const ComputedStyle& parent_grid_style, bool must_consider_grid_items_for_column_sizing, bool must_consider_grid_items_for_row_sizing, HeapVector<Member<LayoutBox>>* oof_children, @@ -65,6 +67,7 @@ auto grid_item = std::make_unique<GridItemData>( To<NGBlockNode>(child), root_grid_style, + parent_grid_style.GetFontBaseline(), must_consider_grid_items_for_column_sizing, must_consider_grid_items_for_row_sizing); @@ -121,7 +124,7 @@ const auto subgrid = To<NGGridNode>(current_item.node); auto subgridded_items = subgrid.ConstructGridItems( - subgrid.CachedPlacementData(), root_grid_style, + subgrid.CachedPlacementData(), root_grid_style, subgrid.Style(), current_item.must_consider_grid_items_for_column_sizing, current_item.must_consider_grid_items_for_row_sizing);
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h index 6755132c..f2a2f1ce 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h
@@ -32,6 +32,7 @@ GridItems ConstructGridItems( const NGGridPlacementData& placement_data, const ComputedStyle& root_grid_style, + const ComputedStyle& parent_grid_style, bool must_consider_grid_items_for_column_sizing, bool must_consider_grid_items_for_row_sizing, HeapVector<Member<LayoutBox>>* oof_children = nullptr,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc index c5fe4e4..d2b2dd7 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -81,9 +81,8 @@ const NGColumnSpannerPath* column_spanner_path) { if (!column_spanner_path) { const TextWrap text_wrap = block_style.GetTextWrap(); - if (UNLIKELY(text_wrap == TextWrap::kPretty || - text_wrap == TextWrap::kBalance)) { - initiate_balancing_ = text_wrap == TextWrap::kBalance && !break_token; + initiate_balancing_ = text_wrap == TextWrap::kBalance && !break_token; + if (UNLIKELY(initiate_balancing_ || text_wrap == TextWrap::kPretty)) { score_line_break_context_ = context->ScoreLineBreakContext(); use_score_line_break_ = score_line_break_context_ && score_line_break_context_->IsActive();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc index 359e954..3b2d6c65 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker.h" +#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_break_point.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_info_list.h" @@ -127,6 +128,37 @@ EXPECT_EQ(count, target_num_lines - NGLineInfoList::kCapacity); } +TEST_F(NGScoreLineBreakerTest, BalanceMaxLinesExceeded) { + ScopedCSSTextWrapBalanceByScoreForTest balance_by_score(true); + LoadAhem(); + SetBodyInnerHTML(R"HTML( + <!DOCTYPE html> + <style> + #target { + font-family: Ahem; + font-size: 10px; + width: 10ch; + text-wrap: balance; + } + </style> + <div id="target"> + 123 56 89 123 56 89 + 123 56 89 123 56 89 + 123 56 89 123 56 89 + 123 56 89 123 56 89 + 123 56 89 123 56 89 + X + </div> + )HTML"); + const LayoutBlockFlow* target = GetLayoutBlockFlowByElementId("target"); + NGInlineCursor cursor(*target); + cursor.MoveToLastLine(); + cursor.MoveToNext(); + // Neitehr `balance` nor `pretty` should be applied. + EXPECT_EQ(cursor.Current()->Type(), NGFragmentItem::kText); + EXPECT_EQ(cursor.Current()->TextLength(), 1u); +} + class BlockInInlineTest : public NGScoreLineBreakerTest, public testing::WithParamInterface<int> {}; INSTANTIATE_TEST_SUITE_P(NGScoreLineBreakerTest,
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc index fdf315ef..64a83e2 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
@@ -7,7 +7,6 @@ #include <memory> #include <utility> -#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/editing_utilities.h" #include "third_party/blink/renderer/core/editing/position_with_affinity.h" @@ -73,14 +72,6 @@ void LayoutNGBlockFlowMixin<Base>::ResetNGInlineNodeData() { Base::CheckIsNotDestroyed(); ng_inline_node_data_ = MakeGarbageCollected<NGInlineNodeData>(); - - // The offset_mapping determines the PlainText() output of text nodes, - // and depends non-locally on children inside the block flow. For example - // whitespace collapsing may happen or not based on the presence of a sibling - // inline object. - if (AXObjectCache* cache = Base::GetDocument().ExistingAXObjectCache()) { - cache->TextOffsetsChanged(this); - } } template <typename Base>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 729e8bb..129f22b 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -481,7 +481,8 @@ const LogicalSize& size) -> NGOutOfFlowLayoutPart::ContainingBlockInfo { const auto& grid_style = containing_grid.StyleRef(); - GridItemData grid_item(candidate.Node(), grid_style); + GridItemData grid_item(candidate.Node(), grid_style, + grid_style.GetFontBaseline()); return {grid_style.GetWritingDirection(), NGGridLayoutAlgorithm::ComputeOutOfFlowItemContainingRect(
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 87fe946..e24dc151 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1552,18 +1552,6 @@ return; if (notify_parent && !has_been_disposed_) { - // Eagerly mark the cached parent's dirty bits (in addition to scheduling a - // children-changed notification to happen later, which is what calling - // ChildrenChangedOnAncestorOf() does). That way, if a different clean - // layout callback happens after Detach() is called but before, - // ChildrenChangedOnAncestorOf(), it won't accidentally walk into a detached - // subtree. - if (AXObject* parent = obj->CachedParentObject()) { - if (!parent->IsDetached()) { - parent->SetNeedsToUpdateChildren(); - } - } - ChildrenChangedOnAncestorOf(obj); } @@ -2050,31 +2038,6 @@ MarkAXObjectDirty(ax_object); } -void AXObjectCacheImpl::TextOffsetsChanged(const LayoutBlockFlow* block_flow) { - if (AXObject* obj = Get(block_flow)) { - DeferTreeUpdate(&AXObjectCacheImpl::TextOffsetsChangedWithCleanLayout, obj); - } -} - -void AXObjectCacheImpl::TextOffsetsChangedWithCleanLayout(Node*, - AXObject* obj) { - DCHECK(obj); - if (obj->IsDetached()) { - return; - } -#if DCHECK_IS_ON() - Document* document = obj->GetDocument(); - DCHECK(document->Lifecycle().GetState() >= DocumentLifecycle::kLayoutClean) - << "Unclean document at lifecycle " << document->Lifecycle().ToString(); -#endif // DCHECK_IS_ON() - - // Text changing for a block flow invalidates all of the - // text strings for children, such as via LayoutObject::GetName(). - if (obj->AccessibilityIsIncludedInTree()) { - MarkAXSubtreeDirtyWithCleanLayout(obj); - } -} - void AXObjectCacheImpl::TextChanged(Node* node) { if (!node) return;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 96587f2..92a0af0 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -192,10 +192,6 @@ // changed. void TextChanged(const LayoutObject*) override; void TextChangedWithCleanLayout(Node* optional_node, AXObject*); - - void TextOffsetsChanged(const LayoutBlockFlow*) override; - void TextOffsetsChangedWithCleanLayout(Node*, AXObject*); - void FocusableChangedWithCleanLayout(Element* element); void DocumentTitleChanged() override; // Called when a layout tree for a node has just been attached, so we can make
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc index 0c747d2..2b11c71a 100644 --- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc +++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -1236,9 +1236,8 @@ AXObject* descendant = reachable.back(); reachable.pop_back(); DCHECK(descendant->AccessibilityIsIncludedInTree()); - if (!MarkAXObjectDirty(descendant)) { + if (!MarkAXObjectDirty(descendant)) continue; - } const AXObject::AXObjectVector& children = descendant->ChildrenIncludingIgnored(); reachable.AppendRange(children.rbegin(), children.rend());
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index f5af64b..9570940 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -92,6 +92,7 @@ crbug.com/613672 [ Mac ] compositing/gestures/gesture-tapHighlight-lines-and-float-in-multicol.html [ Skip ] crbug.com/613672 [ Mac ] external/wpt/pointerevents/coalesced_events_attributes_under_load.html?touch [ Skip ] crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?touch [ Skip ] +crbug.com/613672 [ Mac ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Skip ] crbug.com/613672 [ Mac ] fast/events/pointerevents/multi-pointer-event-in-slop-region.html [ Skip ] crbug.com/613672 [ Mac ] fast/events/pointerevents/pointer-event-in-slop-region.html [ Skip ] crbug.com/613672 [ Mac ] fast/events/touch/gesture/* [ Skip ] @@ -1968,4 +1969,4 @@ crbug.com/1446931 [ Android ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ] crbug.com/1446931 [ Fuchsia ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ] crbug.com/1446931 [ Mac ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ] -crbug.com/1446931 [ Win ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ] \ No newline at end of file +crbug.com/1446931 [ Win ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index c5b6421..5cc7cfd4 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2867,15 +2867,10 @@ crbug.com/626703 external/wpt/css/css-fonts/parsing/font-variant-invalid.html [ Crash ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 [ Mac13-arm64 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Pass Timeout ] crbug.com/626703 [ Mac13 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/api/response/response-clone.any.serviceworker.html [ Timeout ] crbug.com/626703 external/wpt/css/css-fonts/separators.html [ Failure ] crbug.com/626703 external/wpt/css/css-nesting/nesting-type-selector.html [ Failure ] crbug.com/626703 [ Mac12 ] external/wpt/fetch/api/cors/cors-keepalive.any.html [ Timeout ] -crbug.com/626703 [ Mac10.15 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ] -crbug.com/626703 [ Mac11 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ] -crbug.com/626703 [ Mac12 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ] -crbug.com/626703 [ Mac13 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ] crbug.com/626703 [ Mac11 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/api/cors/cors-keepalive.any.html [ Timeout ] crbug.com/626703 [ Mac13 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/scroll-timeline-range-animation.html [ Timeout ] crbug.com/626703 external/wpt/css/css-color/oklab-009.html [ Failure ] @@ -3525,7 +3520,6 @@ # [css-subgrid] crbug.com/618969 external/wpt/css/css-grid/subgrid/line-names-007.html [ Failure ] -crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html [ Failure ] # [css-animations] @@ -5557,7 +5551,7 @@ crbug.com/1296449 [ Linux Release ] external/wpt/workers/SharedWorker-MessageEvent-source.any.sharedworker.html [ Crash Failure Pass Timeout ] # Sheriff 2022-04-20 -crbug.com/1253971 external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html [ Timeout Crash ] +crbug.com/1253971 [ Mac ] external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html [ Timeout ] # Sheriff 2022-04-21 crbug.com/1318318 external/wpt/fetch/local-network-access/service-worker-background-fetch.https.window.html [ Failure Pass Timeout ] @@ -6692,15 +6686,10 @@ crbug.com/1453965 [ Mac12-arm64 ] external/wpt/webgl/uniformMatrixNfv.html [ Failure Pass ] crbug.com/1453965 [ Mac13-arm64 ] external/wpt/webgl/uniformMatrixNfv.html [ Failure Pass ] crbug.com/1453977 [ Linux ] fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Failure Pass ] -crbug.com/1453982 [ Mac ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html [ Failure Pass ] crbug.com/1454064 [ Linux ] fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure Pass ] crbug.com/1454070 [ Linux ] fast/css/inline-outline-with-border-radius-outset.html [ Failure Pass ] -crbug.com/1453272 http/tests/devtools/indexeddb/database-refresh-view.js [ Failure Pass Timeout ] - # Gardener 2023-06-13 -crbug.com/1453982 [ Mac11-arm64 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Pass Timeout ] -crbug.com/1453982 [ Mac12-arm64 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Pass Timeout ] crbug.com/1450287 [ Mac13-arm64 ] virtual/scalefactor200/external/wpt/largest-contentful-paint/multiple-redirects-TAO.html [ Failure Pass ] crbug.com/1454498 fast/forms/accent-color/radio-accent-color-hover-dark-appearance.html [ Failure Pass ] crbug.com/1422685 [ Mac11-arm64 ] fast/canvas-api/offscreencanvas.transferrable-webgl-exception.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png index d83fa9c..b97f0cf 100644 --- a/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png +++ b/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png index e0c31a1..5803b1ed 100644 --- a/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png +++ b/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/README.md b/third_party/blink/web_tests/external/wpt/window-placement/README.md index d9e324c..e96a8a0 100644 --- a/third_party/blink/web_tests/external/wpt/window-placement/README.md +++ b/third_party/blink/web_tests/external/wpt/window-placement/README.md
@@ -1,5 +1,7 @@ # Window Management Testing -[Window Management Specification](https://w3c.github.io/window-placement/) +[Window Management Specification](https://w3c.github.io/window-management/) -The tests in this directory require at least 2 displays on the host machine to yield meaningful results. A well-supported configuration is 2 displays at 1920x1080 resolution arranged horizonally (primary on the left, secondary on the right). +The tests in this directory require at least 2 displays on the host machine to +yield meaningful results. An example configuration is 2 displays with 1920x1080 +resolution arranged horizontally (primary on the left, secondary on the right).
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html index 10f30a19..a4b09f3d 100644 --- a/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html
@@ -1,76 +1,54 @@ <!DOCTYPE html> -<meta charset="utf-8"> <meta name="timeout" content="long"> <!-- user agents are not required to support open features other than `noopener` and on some platforms position and size features don't make sense --> <meta name="flags" content="may"> -<title>Multi-Screen Window Management test: Fullscreen Companion Window</title> -<link rel="help" href="https://w3c.github.io/window-placement/"> -This test uses multi-screen details to request fullscreen and open a pop-up<br> -(companion window) in the same user activation.<br> -It runs manually with `wpt serve` and a compatible browser.<br><br> -<button id="setUpButton">Request screen details</button> -<ul id="popupButtons"></ul> -<button id="cleanUpButton">Close any open popups</button><br> -<input id="autoCleanUp" type="checkbox" checked=true>Auto-close popups</input> -<ul id="logger"></ul> +<title>Window Management test: Fullscreen Companion Window</title> +<link rel="help" href="https://w3c.github.io/window-management/"> +Tests use of multi-screen details to enter fullscreen and open a 'companion' +popup window in the same user activation.<br> +The host device must have 2+ screens to yield meaningful results.<br><br> +<button id="closeButton" onclick="closePopups">Close popups</button><br> +<input id="autoClose" type="checkbox" checked=true>Auto-close popups</input> +<ul id="list"></ul> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> <script src="resources/helpers.js"></script> - <script> 'use strict'; + let popups = []; - -cleanUpButton.addEventListener('click', async () => { +function closePopups() { popups.forEach(p => p.close()); -}); - -// expectPopup should be true if the test should expect the pop-up to be -// created, or false if the popup is not expected to be created (blocked). -async function testPopupOnScreen(popupTest, screen, expectPopup) { - // Show a popup child window on the associated screen. - const left = screen.availLeft + Math.floor(screen.availWidth / 2) - 150; - const top = screen.availTop + Math.floor(screen.availHeight / 2) - 50; - log(`Opening a popup on '${screen.label}' at (${left}, ${top})`); - let popup = window.open( - '/resources/blank.html', '', - `left=${left},top=${top},width=300,height=100`); - assert_equals(!!popup, expectPopup, 'Popup reference'); - if (popup === null) - return; - assert_equals(!popup.closed, expectPopup, 'Popup open'); - popups.push(popup); - if (autoCleanUp.checked) { - // TODO(crbug.com/1338645): Remove this workaround (delay) after browser code is - // fixed. - popupTest.add_cleanup(()=>{ - setTimeout(popup.close, 1000); - }); - } + popups = []; } promise_test(async setUpTest => { - await setUpWindowManagement(setUpTest, setUpButton); - const screenDetails = await getScreenDetails(); - assert_true(!!screenDetails, 'Error getting screen details'); - for (const [i, fullscreenScreen] of screenDetails.screens.entries()) { - const popupScreen = - screenDetails.screens[(i + 1) % screenDetails.screens.length]; - let testName = - `Fullscreen on '${fullscreenScreen.label}' and open popup on '${popupScreen.label}'`; - promise_test(async popupTest => { - await addTestTriggerButtonAndAwaitClick(popupButtons, - testName, - popupTest); - await document.documentElement.requestFullscreen( - { screen: fullscreenScreen } - ); - await testPopupOnScreen(popupTest, popupScreen, - /*expectPopup=*/screenDetails.screens.length > 1); - }, testName); + await setUpWindowManagement(setUpTest); + const screens = window.screenDetails.screens; + const originalScreen = window.screenDetails.currentScreen; + for (const [i, screenA] of screens.entries()) { + const screenB = screens[(i + 1) % screens.length]; + let name = `Fullscreen on '${screenA.label}'; popup on '${screenB.label}'`; + promise_test(async test => { + await buttonClick(test, name); + await document.documentElement.requestFullscreen({ screen: screenA }); + await assertWindowOnScreen(window, screenA); + // Expect the popup to open if multiple screens are available. + const assertPlacement = screens.length > 1; + const popup = await openPopupOnScreen(screenB, assertPlacement); + if (!!popup) + popups.push(popup); + // Exit fullscreen; `window` should move back to `originalScreen`. + await buttonClick(test, `Exit fullscreen`); + await document.exitFullscreen(); + await assertWindowOnScreen(window, originalScreen); + assert_false(!!document.fullscreenElement); + if (autoClose.checked) + closePopups(); + }, name); } -}, 'Use multi-screen details to request fullscreen and open a pop-up in the same user activation.'); +}, 'Enter fullscreen and open a popup from one transient activation.'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html index 620cd6e..b6790780 100644 --- a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html
@@ -1,116 +1,36 @@ <!DOCTYPE html> -<meta charset="utf-8"> <meta name="timeout" content="long"> -<title>Multi-Screen Window Placement test: element.requestFullscreen()</title> -<link rel="help" href="https://w3c.github.io/window-placement/"> -This test uses multi-screen details to request fullscreen on different -displays and swap between them.<br> -It runs manually with `wpt serve` and a compatible browser.<br><br> -<button id="setUpButton">Request screen details</button> -<ul id="testButtons"></ul> -<ul id="logger"></ul> +<title>Window Management test: target-screen element.requestFullscreen()</title> +<link rel="help" href="https://w3c.github.io/window-management/"> +Tests use of multi-screen details to enter fullscreen on specific screens.<br> +The host device must have 2+ screens to yield meaningful results.<br><br> +<ul id="list"></ul> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> <script src="resources/helpers.js"></script> - <script> 'use strict'; -// Waits until `window` is located on `screen` or until 3 seconds elapses. -async function ensureWindowOnScreen(window, screen) { - // Returns true if window `w` in on screen `s`. - const isWindowOnScreen = async (w, s) => { - const center = { - x: w.screenLeft + w.outerWidth / 2, - y: w.screenTop + w.outerHeight / 2 - }; - return center.x >= s.left && (center.x < s.left + s.width) && - center.y >= s.top && (center.y < s.top + s.height) && - (await w.getScreenDetails()).currentScreen == s; - } - // Checks every 100ms if window `w` is on screen `s` up to 3s maximum. - const waitForWindowOnScreen = async (w, s, resolve, timestamp = Date.now()) => { - if (!w || w.closed || Date.now() - timestamp > 3000) - resolve(false); - else if (await isWindowOnScreen(w, s)) - resolve(true); - else - setTimeout(waitForWindowOnScreen.bind(this, w, s, resolve, timestamp), 100); - } - return new Promise(resolve => { waitForWindowOnScreen(window, screen, resolve); }); -} - -// Asserts that the browser window is correctly positioned on `screen`. -// `expectFullscreen` specifies whether to expect the window to be -// fullscreen or not. -async function testWindowOnScreen(test, screen, expectFullscreen) { - - // In chrome, the requestFullscreen promise may resolve before the - // transition completes and the bounds may be incorect in the meantime. - // Wait until the window is on the expected screen. - // TODO(crbug.com/1330724) Remove this. - await ensureWindowOnScreen(window, screen); - - assert_equals(!!document.fullscreenElement, expectFullscreen); - assert_equals((await window.getScreenDetails()).currentScreen, screen); - - if (expectFullscreen) { - // Window bounds should equal the bounds of the screen when in fullscreen. - assert_equals(window.screenX, screen.left); - assert_equals(window.screenY, screen.top); - assert_equals(window.innerWidth, screen.width); - assert_equals(window.innerHeight, screen.height); - } else { - // Verify the window is somewhere within the specified screen - assert_true(window.screenX >= screen.left); - assert_true(window.screenY >= screen.top); - assert_true(window.screenX + window.outerWidth <= screen.left + screen.width); - assert_true(window.screenY + window.outerHeight <= screen.top + screen.height); - } -} - promise_test(async setUpTest => { - await setUpWindowPlacement(setUpTest, setUpButton); - const screenDetails = await getScreenDetails(); - assert_true(!!screenDetails, 'Error getting screen details'); - for (const [i, fullscreenScreen] of screenDetails.screens.entries()) { - const originalScreen = screenDetails.currentScreen; - const swapFullscreen = - screenDetails.screens[(i + 1) % screenDetails.screens.length]; - let testName = - `Fullscreen on '${fullscreenScreen.label}' and swap to ${swapFullscreen.label}`; - promise_test(async fullscreenTest => { - // Step 1: Enter Fullscreen. - await addTestTriggerButtonAndAwaitClick(testButtons, - `Step 1: ${testName} (Enter Fullscreen)`, - fullscreenTest); - log(`Requesting fullscreen on screen: ${fullscreenScreen.label}`); - await document.documentElement.requestFullscreen( - { screen: fullscreenScreen } - ); - await testWindowOnScreen(fullscreenTest, fullscreenScreen, - /*expectFullscreen*/true); - // Step 2: Swap to another screen. - await addTestTriggerButtonAndAwaitClick(testButtons, - `Step 2: ${testName} (Swap screens)`, - fullscreenTest); - log(`Swapping fullscreen to screen: ${swapFullscreen.label}`); - await document.documentElement.requestFullscreen( - { screen: swapFullscreen } - ); - await testWindowOnScreen(fullscreenTest, swapFullscreen, - /*expectFullscreen*/true); - // Step 3: Exit fullscreen. Should restore window to `originalScreen`. - await addTestTriggerButtonAndAwaitClick(testButtons, - `Step 3: ${testName} (Exit Fullscreen)`, - fullscreenTest); - log(`Exiting fullscreen. Window should restore to ${originalScreen.label}.`); + await setUpWindowManagement(setUpTest); + const originalScreen = window.screenDetails.currentScreen; + for (const s of window.screenDetails.screens) { + const name = `Request fullscreen on '${s.label}`; + await promise_test(async test => { + // Request fullscreen on screen `s`; `window` should move there. + await buttonClick(test, name); + await document.documentElement.requestFullscreen({ screen: s }); + await assertWindowOnScreen(window, s); + assert_true(!!document.fullscreenElement); + + // Exit fullscreen; `window` should move back to `originalScreen`. + await buttonClick(test, `Exit fullscreen`); await document.exitFullscreen(); - await testWindowOnScreen(fullscreenTest, originalScreen, - /*expectFullscreen*/false); - }, testName); + await assertWindowOnScreen(window, originalScreen); + assert_false(!!document.fullscreenElement); + }, name); } -}, 'Use multi-screen details to request fullscreen on target displays and swap between them'); +}, 'Use multi-screen details to enter fullscreen on specific screens'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-move.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-move.tentative.https.html new file mode 100644 index 0000000..b91ee4cdc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-move.tentative.https.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<title>Window Management test: target-screen element.requestFullscreen()</title> +<link rel="help" href="https://w3c.github.io/window-management/"> +Tests use of multi-screen details to move fullscreen between screens.<br> +The host device must have 2+ screens to yield meaningful results.<br><br> +<ul id="list"></ul> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/helpers.js"></script> +<script> +'use strict'; + +promise_test(async test => { + await setUpWindowManagement(test); + const originalScreen = window.screenDetails.currentScreen; + // Request fullscreen on the current screen; the window should stay there. + await buttonClick(test, `Request fullscreen on '${originalScreen.label}'`); + await document.documentElement.requestFullscreen({ screen: originalScreen }); + await assertWindowOnScreen(window, originalScreen); + assert_true(!!document.fullscreenElement); + + for (const s of window.screenDetails.screens) { + // Request fullscreen on screen `s`; `window` should move there. + await buttonClick(test, `Request fullscreen on '${s.label}'`); + await document.documentElement.requestFullscreen({ screen: s }); + await assertWindowOnScreen(window, s); + assert_true(!!document.fullscreenElement); + } + + // Exit fullscreen; `window` should move back to `originalScreen`. + await buttonClick(test, `Exit fullscreen`); + await document.exitFullscreen(); + await assertWindowOnScreen(window, originalScreen); + assert_false(!!document.fullscreenElement); +}, 'Use multi-screen details to move fullscreen between screens'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html index c453107d..708e571c 100644 --- a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html +++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html
@@ -1,99 +1,39 @@ <!DOCTYPE html> -<meta charset="utf-8"> <meta name="timeout" content="long"> <!-- user agents are not required to support open features other than `noopener` and on some platforms position and size features don't make sense --> <meta name="flags" content="may"> -<title>Multi-Screen Window Management test: window.open()</title> -<link rel="help" href="https://w3c.github.io/window-placement/"> -This test uses multi-screen details to open a popup window on each screen.<br> -It runs automated or manually with `wpt serve` and a compatible browser.<br><br> -<button id="setUpButton">Request screen details</button> -<ul id="popupButtons"></ul> -<button id="cleanUpButton">Close any open popups</button><br> -<input id="autoCleanUp" type="checkbox" checked=true>Auto-close popups</input> -<ul id="logger"></ul> +<title>Window Management test: target-screen window.open()</title> +<link rel="help" href="https://w3c.github.io/window-management/"> +Tests use of multi-screen details to open a popup window on each screen.<br> +The host device must have 2+ screens to yield meaningful results.<br><br> +<button id="closeButton" onclick="closePopups">Close popups</button><br> +<input id="autoClose" type="checkbox" checked=true>Auto-close popups</input> +<ul id="list"></ul> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> <script src="resources/helpers.js"></script> - <script> 'use strict'; + let popups = []; - -cleanUpButton.addEventListener('click', async () => { +function closePopups() { popups.forEach(p => p.close()); -}); - -function checkPopupPlacement(popup, x, y, allowSameScreenClamping) { - // Window.screenX|Y may be zero, if the user agent wishes to hide information - // about the screen of the output device. They also may incorrectly reflect - // the origin of content viewport; in that case, estimate window coordinates - // by subtracing estimated frame insets (top-heavy, horizontally centered). - // Synchronous estimated placements may be clamped to the current screen. - const error = 10; - const dX = popup.screenX - x - (popup.outerWidth - popup.innerWidth) / 2; - const dY = popup.screenY - y - (popup.outerHeight - popup.innerHeight); - - assert_true(!popup.screenX || popup.screenX == x || Math.abs(dX) <= error || - (allowSameScreenClamping && popup.screenX >= screen.availLeft && - popup.screenX < screen.availLeft + screen.availWidth)); - assert_true(!popup.screenY || popup.screenY == y || Math.abs(dY) <= error || - (allowSameScreenClamping && popup.screenY >= screen.availTop && - popup.screenY < screen.availTop + screen.availHeight)); -} - -async function testPopupOnScreen(popupTest, screen) { - // Show a popup child window on the associated screen. - const left = screen.availLeft + Math.floor(screen.availWidth / 2) - 150; - const top = screen.availTop + Math.floor(screen.availHeight / 2) - 50; - log(`Opening a popup on '${screen.label}' at (${left}, ${top})`); - let popup = window.open( - '/resources/blank.html', '', - `left=${left},top=${top},width=300,height=100`); - popups.push(popup); - if (autoCleanUp.checked) - popupTest.add_cleanup(popup.close); - - // Window.open() synchronously returns a Window with estimated screenX|Y. - // Initial `screenX` and `screenY` values should match `left` and `top`. - log(`<div style='margin-left: 40px'>Initial bounds: - (${popup.screenX}, ${popup.screenY}) - </div>`); - // Allow synchronous estimated placements to be clamped to the current screen. - checkPopupPlacement(popup, left, top, true); - popup.initialScreenX = popup.screenX; - popup.initialScreenY = popup.screenY; - - // Await document.visibilitychange to check resolved Window.screenX|Y values - // after asynchronous window creation and clamped placement has occurred. - const visibilitychangeWatcher = - new EventWatcher(popupTest, popup.document, ['visibilitychange']); - await visibilitychangeWatcher.wait_for('visibilitychange'); - popup.document.write(`Expected: (${left}, ${top}) <br> \ - Initial: (${popup.initialScreenX}, ${popup.initialScreenY}) <br> \ - Resolved: (${popup.screenX}, ${popup.screenY}) `); - log(`<div style='margin-left: 40px'>Resolved bounds: - (${popup.screenX}, ${popup.screenY}) - </div>`); - // Do not allow resolved placements to be clamped to the current screen. - checkPopupPlacement(popup, left, top, false); + popups = []; } promise_test(async setUpTest => { - await setUpWindowManagement(setUpTest, setUpButton); - const screenDetails = await getScreenDetails(); - assert_true(!!screenDetails, 'Error getting screen details'); - assert_greater_than(screenDetails.screens.length, 0, 'Connect a screen'); - for (const s of screenDetails.screens) { - promise_test(async popupTest => { - await addTestTriggerButtonAndAwaitClick(popupButtons, - `Open a popup on '${s.label}'`, - popupTest); - await testPopupOnScreen(popupTest, s); - }, `Open a popup on '${s.label}'`); + await setUpWindowManagement(setUpTest); + for (const s of window.screenDetails.screens) { + const name = `Open a popup on '${s.label}'`; + await promise_test(async test => { + await buttonClick(test, name); + popups.push(await openPopupOnScreen(s)); + if (autoClose.checked) + closePopups(); + }, name); } }, 'Use multi-screen details to open a popup window on each screen'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js b/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js index 92442f9..3c869f1 100644 --- a/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js +++ b/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js
@@ -1,27 +1,42 @@ - -// Logs (appends) an HTML string to a logger element in a list format. -// An element in the document with id "logger" will be used as the log -// container. -function log(str) { - const entry = document.createElement('li'); - entry.innerHTML = str; - const loggerElement = document.getElementById('logger'); - loggerElement.appendChild(entry); - return entry; +// Appends a list item with `innerHTML` to the document's 'list' element. +function log(innerHTML) { + const li = document.createElement('li'); + li.innerHTML = innerHTML; + document.getElementById('list').appendChild(li); } -// Common setup for window management tests. Performs some basic assertions, and -// then waits for a click on the `setUpButton` element (for manual tests). -// Example usage: -// promise_test(async setUpTest => { -// await setUpWindowManagement(setUpTest, setUpButton); -// ... -// }); -async function setUpWindowManagement(setUpTest, setUpButton) { +// Returns a string with the label and bounds of screen `s` for logging. +function screenLog(s) { + return `'${s.label}': (${s.left},${s.top} ${s.width}x${s.height})`; +} + +// Returns a string with the bounds of window `w` for logging. +function windowLog(w) { + return `(${w.screenLeft},${w.screenTop} ${w.outerWidth}x${w.outerHeight})`; +} + +// Appends a button with `innerHTML` to the document's `list` element. +// Waits for a test driver or manual click, and disables the button afterwards. +async function buttonClick(test, innerHTML) { + const button = document.createElement('button'); + button.innerHTML = innerHTML; + const li = document.createElement('li'); + li.appendChild(button) + document.getElementById('list').appendChild(li); + const click = new EventWatcher(test, button, ['click']).wait_for('click'); + try { // Support manual testing where test_driver is not running. + await test_driver.click(button); + } catch { + } + await click; + button.disabled = true; +} + +// Grants `window-management` permission and caches `window.screenDetails`. +async function setUpWindowManagement(test) { assert_true( 'getScreenDetails' in self && 'isExtended' in screen, - `API not supported; use Chromium (not content_shell) and enable - chrome://flags/#enable-experimental-web-platform-features`); + `API not supported; use Chrome or Chromium (not content_shell)`); if (!screen.isExtended) log(`WARNING: Use multiple screens for full test coverage`); if (window.location.href.startsWith('file')) @@ -31,38 +46,78 @@ await test_driver.set_permission({ name: 'window-management' }, 'granted'); } catch { } - const setUpWatcher = new EventWatcher(setUpTest, setUpButton, ['click']); - const setUpClick = setUpWatcher.wait_for('click'); - try { // Support manual testing where test_driver is not running. - await test_driver.click(setUpButton); - } catch { - } - await setUpClick; - setUpButton.disabled = true; + await buttonClick(test, 'Request screen details'); + window.screenDetails = await window.getScreenDetails(); + assert_true(!!window.screenDetails, 'Error getting screen details'); } - -// Adds a button to the given `buttonContainer` element with the contents of -// `name`. Attaches an event watcher to the given test and waits for a signal -// from the test driver to click the button. If no test driver is available -// (manual testing) then awaits an actual click from the user instead. If -// `disableOnClick` is true, the button will also be disabled after it is -// clicked. -async function addTestTriggerButtonAndAwaitClick(buttonContainer, name, test) { - const button = document.createElement('button'); - button.innerHTML = name; - const entry = document.createElement('li'); - entry.appendChild(button); - buttonContainer.appendChild(entry); - const testWatcher = new EventWatcher(test, button, ['click']); - const buttonClick = testWatcher.wait_for('click'); - // Disable the button when it is clicked. - button.onclick = function() { - button.disabled = true; - }; - try { // Support manual testing where test_driver is not running. - await test_driver.click(button); - } catch { +// Polls until `condition` is true, with the given `interval` and `duration`. +// Returns a promise that will be resolved on success or timeout. +async function poll(condition, interval = 100, duration = 3000) { + const timeout = Date.now() + duration; + const loop = async (resolve) => { + if (condition() || Date.now() > timeout) + resolve(); + else + step_timeout(loop, interval, resolve); } - await buttonClick; + return new Promise(loop); +} + +// Open and return a popup on `screen`, optionally asserting placement. +async function openPopupOnScreen(screen, assertPlacement = true) { + const left = screen.availLeft + Math.floor(screen.availWidth / 2) - 150; + const top = screen.availTop + Math.floor(screen.availHeight / 2) - 50; + const features = `left=${left},top=${top},width=300,height=100`; + log(`Opening a popup with features '${features}' on ${screenLog(screen)}`); + // Window.open() synchronously returns a Window with estimated screenLeft|Top, + // which may be clamped to the opener's screen or incompletely initialized. + let popup = window.open('/resources/blank.html', '', features); + + if (assertPlacement) { + // Assert the popup is eventually placed at the expected location. + // This may occur after window load, document ready and visible, etc. + const initialBounds = windowLog(popup); + log(`<div style='margin-left: 40px'>Initial: ${initialBounds}</div>`); + await poll(() => { return popup.screenLeft == left && + popup.screenTop == top }); + popup.document.write(`Requested: (${left},${top} 300x100) <br> \ + Initial: ${initialBounds} <br> \ + Resolved: ${windowLog(popup)}`); + log(`<div style='margin-left: 40px'>Resolved: ${windowLog(popup)}</div>`); + const context = `popup: ${windowLog(popup)}, ${screenLog(screen)}`; + assert_equals(popup.screenLeft, left, context); + assert_equals(popup.screenTop, top, context); + } + + return popup; +} + +// Returns true if window `w` bounds are on screen `s` with threshold `t`. +function isWindowOnScreen(w, s, t = 100) { + return (w.screenLeft >= s.left - t) && (w.screenTop >= s.top - t) && + (w.screenLeft + w.outerWidth <= s.left + s.width + t) && + (w.screenTop + w.outerHeight <= s.top + s.height + t); +} + +// Asserts window `w` currentScreen matches screen `s`. Awaits pending changes, +// e.g. fullscreen promises may resolve before screen change: crbug.com/1330724. +async function assertWindowHasCurrentScreen(w, s) { + log(`assertWindowHasCurrentScreen w: ${windowLog(w)} s: ${screenLog(s)}`); + await poll(() => { return s === w.screenDetails.currentScreen; }); + assert_equals(screenLog(s), screenLog(w.screenDetails.currentScreen)); +} + +// Asserts window `w` bounds roughly match screen `s`. Awaits pending changes, +// e.g. fullscreen promises may resolve before bounds change: crbug.com/1330724. +async function assertWindowBoundsOnScreen(w, s) { + log(`assertWindowBoundsOnScreen w: ${windowLog(w)} s: ${screenLog(s)}`); + await poll(() => { return isWindowOnScreen(w, s); }); + assert_true(isWindowOnScreen(w, s), `${windowLog(w)} on ${screenLog(s)}`); +} + +// Asserts window `w` bounds and currentScreen match screen `s`. +async function assertWindowOnScreen(w, s) { + await assertWindowHasCurrentScreen(w, s); + await assertWindowBoundsOnScreen(w, s); }
diff --git a/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png index ded2a3d..8c51e74 100644 --- a/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png +++ b/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png index 54ce94a..878e869 100644 --- a/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png +++ b/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png index fe3a00a6..0b760203 100644 --- a/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png +++ b/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png index 3d069fe0..afee756 100644 --- a/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png +++ b/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png b/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png index ff54c04..5be7c58 100644 --- a/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png +++ b/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png index 15f0fa2..8d10c22 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png index 4e42bc8..387a1f7 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png index f6eac64b..0ca34a7 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png index eee50fd..084d9a4 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png index 0dcae1b..af18844 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png index 64e06cc..17cd1084 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png index ea02cfc..52854cbf 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png index 290d75f..d9254a51 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png index d8ec334..9f9e7fc 100644 --- a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png index b7529481..3e78ac9 100644 --- a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png index 2383b51..0eb5df8 100644 --- a/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png index 89591df..738ce2d1 100644 --- a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png index 9621add0..30044ce 100644 --- a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png index 468d8cf..6436d51 100644 --- a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png index 92e04f5..d07bbe0d 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png index 3a52a1a3..3f4c20f 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png index 7dcd37d..a7c0a99 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png index 08fe0f7..7a94b84 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png index 473420f..822c23d7 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png index 913823b1..231ddda8f 100644 --- a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png index 8554db71..8cde169 100644 --- a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png index b9eb8f7d..d8d8ad76 100644 --- a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png index cf35166..490d6eb 100644 --- a/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png +++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png index 7f305274..03efd24 100644 --- a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png +++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png index 36258d69..f481899 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png index 4f3bfdc9..bcc02d2 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png index ed7feb2f..d1d7f1b 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png index aa9882a..10f86ef5 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png index a059d5d..e8767e62 100644 --- a/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png b/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png index a50d758..875796a 100644 --- a/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png index c4f7dd07..a8d9d6a 100644 --- a/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png b/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png index e4802df..7826210a 100644 --- a/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png b/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png index 2acfeaa..eac29d6 100644 --- a/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png index d5cf659..90e38f3 100644 --- a/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png index 22bbd80..01265d1 100644 --- a/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png b/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png index 9bc99995..9f82103 100644 --- a/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png index 435ef9b..f5c8ea5 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png index b431a0b..9c56e02a 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png index 454d62c..d42789d 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png index 0f5f56da..196dacae 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png index d2bf2d1..c285e4f 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png index 0fd1ef8..49ad3c8 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png index e49fe5ec..353cec6 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png index c01aa6f..4384de9 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png index f641e0f..2032650b 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png index d2bf2d1..c285e4f 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png index 0fd1ef8..49ad3c8 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/direct-image-mask-expected.png deleted file mode 100644 index 091e5e72..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/direct-image-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-added-filters-expected.png deleted file mode 100644 index 3a4d00e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-added-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-removed-filters-expected.png deleted file mode 100644 index 2df70a3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-removed-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/masked-ancestor-expected.png deleted file mode 100644 index 33245f2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/masked-ancestor-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/multiple-masks-expected.png deleted file mode 100644 index 47bbb0e2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/multiple-masks-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/simple-composited-mask-expected.png deleted file mode 100644 index 324c154..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/simple-composited-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/backgrounds/mask-box-image-expected.png deleted file mode 100644 index 8c51e74..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/backgrounds/mask-box-image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/borders/border-inner-bleed-expected.png deleted file mode 100644 index 2ebbc36..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/borders/border-inner-bleed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-expected.png deleted file mode 100644 index 0b760203..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-opacity-expected.png deleted file mode 100644 index afee756..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-opacity-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png deleted file mode 100644 index 575d2b5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png deleted file mode 100644 index 27fd4525..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png deleted file mode 100644 index 74273ba..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png deleted file mode 100644 index 8b5a4ce..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png deleted file mode 100644 index e506bec..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/batik/masking/maskRegions-expected.png deleted file mode 100644 index ecd43b2c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/batik/masking/maskRegions-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/clip-mask-negative-scale-expected.png deleted file mode 100644 index 3fe10baa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/clip-mask-negative-scale-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/grayscale-gradient-mask-expected.png deleted file mode 100644 index 3f79c65..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/grayscale-gradient-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/filter-clip-expected.png deleted file mode 100644 index 9a7b28c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/filter-clip-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png index b6ee3b6..3979a62 100644 --- a/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/direct-image-mask-expected.png deleted file mode 100644 index 091e5e72..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/direct-image-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-added-filters-expected.png deleted file mode 100644 index 3a4d00e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-added-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-removed-filters-expected.png deleted file mode 100644 index 2df70a3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-removed-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/masked-ancestor-expected.png deleted file mode 100644 index 33245f2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/masked-ancestor-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/multiple-masks-expected.png deleted file mode 100644 index 47bbb0e2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/multiple-masks-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/simple-composited-mask-expected.png deleted file mode 100644 index 324c154..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/simple-composited-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/backgrounds/mask-box-image-expected.png deleted file mode 100644 index 8c51e74..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/backgrounds/mask-box-image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/borders/border-inner-bleed-expected.png deleted file mode 100644 index 2ebbc36..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/borders/border-inner-bleed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-expected.png deleted file mode 100644 index 0b760203..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-opacity-expected.png deleted file mode 100644 index afee756..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-opacity-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png deleted file mode 100644 index 575d2b5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png deleted file mode 100644 index 27fd4525..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png deleted file mode 100644 index 74273ba..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png deleted file mode 100644 index 8b5a4ce..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png deleted file mode 100644 index e506bec..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/batik/masking/maskRegions-expected.png deleted file mode 100644 index ecd43b2c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/batik/masking/maskRegions-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/clip-mask-negative-scale-expected.png deleted file mode 100644 index 3fe10baa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/clip-mask-negative-scale-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/grayscale-gradient-mask-expected.png deleted file mode 100644 index 3f79c65..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/grayscale-gradient-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/filters/filter-clip-expected.png deleted file mode 100644 index 9a7b28c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/filters/filter-clip-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/direct-image-mask-expected.png deleted file mode 100644 index 091e5e72..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/direct-image-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png deleted file mode 100644 index 3a4d00e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-removed-filters-expected.png deleted file mode 100644 index 2df70a3..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-removed-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/masked-ancestor-expected.png deleted file mode 100644 index 33245f2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/masked-ancestor-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/multiple-masks-expected.png deleted file mode 100644 index 47bbb0e2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/multiple-masks-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/simple-composited-mask-expected.png deleted file mode 100644 index 324c154..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/simple-composited-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/backgrounds/mask-box-image-expected.png deleted file mode 100644 index 8c51e74..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/backgrounds/mask-box-image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-inner-bleed-expected.png deleted file mode 100644 index 2ebbc36..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-inner-bleed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-expected.png deleted file mode 100644 index 0b760203..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-opacity-expected.png deleted file mode 100644 index afee756..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-opacity-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/shadow-multiple-expected.png deleted file mode 100644 index 575d2b5..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/shadow-multiple-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png deleted file mode 100644 index 27fd4525..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png deleted file mode 100644 index 74273ba..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png deleted file mode 100644 index 8b5a4ce..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png deleted file mode 100644 index e506bec..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/batik/masking/maskRegions-expected.png deleted file mode 100644 index ecd43b2c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/batik/masking/maskRegions-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/clip-mask-negative-scale-expected.png deleted file mode 100644 index 3fe10baa..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/clip-mask-negative-scale-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/grayscale-gradient-mask-expected.png deleted file mode 100644 index 3f79c65..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/grayscale-gradient-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/filters/filter-clip-expected.png deleted file mode 100644 index 9a7b28c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/filters/filter-clip-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png index 352937a..091e5e72 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png index ff1b35c..3a4d00e 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png index aa5f78f..2df70a3 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png index 044eef1..33245f2 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png index 38ca239..47bbb0e2 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png index 8012646..324c154 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png index d8ec334..9f9e7fc 100644 --- a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png index b7529481..3e78ac9 100644 --- a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png index 2383b51..0eb5df8 100644 --- a/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png index 89591df..738ce2d1 100644 --- a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png index 9621add0..30044ce 100644 --- a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png index 468d8cf..6436d51 100644 --- a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png index 649e3dd..3b3e27f 100644 --- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png index cd4a122..3d55a4a 100644 --- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png index e747c1f..0bbcdfd 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png index 3e773ec..2ebbc36 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png index dd6f072..cfee372 100644 --- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png index 30eab1f..082b060 100644 --- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png index ac9be292..87f0e1f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png index d2bf2d1..c285e4f 100644 --- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png index 0fd1ef8..49ad3c8 100644 --- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png index 49c543b..ba3813fc 100644 --- a/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png +++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png index 4876e755b3..575d2b5 100644 --- a/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png +++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png index a170c1f0..27fd4525 100644 --- a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png +++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png index 206559a..74273ba 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png index 5b6f9d62..8b5a4ce 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png index a4f25d7..e506bec 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png index 74131a1..83177d75 100644 --- a/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png b/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png index 7f080f3..76626da 100644 --- a/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png index 4a60dc1..ecd43b2c 100644 --- a/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png index 543bd8b..3fe10baa 100644 --- a/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png index 25aa2dd..bc877806 100644 --- a/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png b/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png index 05a26b2..62535deb 100644 --- a/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png index 435ef9b..f5c8ea5 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png index b431a0b..9c56e02a 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png index e2b28d2..8dfeac7 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png index 03b2964..b406a78 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png index ba7de06..b0f2fc48 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png index c9ad346..3ba49d6 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png index 8fe85e2..33773cb 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png index 9cf4e62..4fc57d8 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png index 8ab75b8..62e5806 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png index f9f14897..149909cc 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png index f1b428a..c67931a 100644 --- a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png index 2c04349..3a9cd7b 100644 --- a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png index f83dca2..731e3b82 100644 --- a/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png index 5c06a96..fc74e627 100644 --- a/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png index b58628c..f98fb8c 100644 --- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png index 921b40d..5c30ac2 100644 --- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png index 94938e2..583f1c5 100644 --- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png index 93f7d9f..6c8754f 100644 --- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png index 32a40d3..2503b133 100644 --- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png index fc9c5ee..f6f402d 100644 --- a/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png +++ b/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png index 08904d9..0cc642e6 100644 --- a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png +++ b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png index c2e2115..cc4ccabc 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png index a5314648..bc95367 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png index c928840..5616659 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png index 471d6b3a..47fd1a2 100644 --- a/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png b/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png index 2ef258e..060c3605 100644 --- a/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png index 49a7b75..5d7dc6a 100644 --- a/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png index fa6993b8..0e8908e 100644 --- a/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png index 8a2bdcef..f69008e7 100644 --- a/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png b/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png index 1c2ddf4a..57f4c53 100644 --- a/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png index 3f3c35aa..c5f2def 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png index 6ccaf72..b99c08431 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png index a9fee7f..5c6f9e1 100644 --- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png index e90236e..988a51b 100644 --- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/backgrounds/repeat/mask-negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/backgrounds/repeat/mask-negative-offset-repeat-expected.png new file mode 100644 index 0000000..74fba6d --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/fast/backgrounds/repeat/mask-negative-offset-repeat-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png deleted file mode 100644 index 5588c558..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/dynamic/text-combine-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/dynamic/text-combine-expected.png deleted file mode 100644 index ab21af1..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/fast/dynamic/text-combine-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/Kusa-Makura-background-canvas-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/Kusa-Makura-background-canvas-expected.png deleted file mode 100644 index 611a77a..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/Kusa-Makura-background-canvas-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/japanese-ruby-vertical-lr-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/japanese-ruby-vertical-lr-expected.png deleted file mode 100644 index 8cab23e..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/japanese-ruby-vertical-lr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/text-combine-various-fonts-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/text-combine-various-fonts-expected.png deleted file mode 100644 index 807b14e..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/text-combine-various-fonts-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/serviceworker/stream-reader-base-https-other-https-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/serviceworker/stream-reader-base-https-other-https-expected.txt new file mode 100644 index 0000000..c6c66b3 --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/serviceworker/stream-reader-base-https-other-https-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: network error +PASS Startup +PASS stream-reader-serviceworker +PASS ReadableStreamReader acquisition / releasing +PASS read contents with ReadableStreamReader +FAIL parallel read promise_test: Unhandled rejection with value: object "TypeError: network error" +PASS acquiring a reader should not set bodyUsed. +FAIL Clone after reading promise_test: Unhandled rejection with value: object "TypeError: network error" +PASS Cancelling stream stops downloading. +FAIL Cancelling stream should not affect cloned one. promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch" +PASS Streaming error should be reported as a TypeError. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/window/stream-reader-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/window/stream-reader-expected.txt new file mode 100644 index 0000000..bc96afa5 --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/window/stream-reader-expected.txt
@@ -0,0 +1,15 @@ +CONSOLE ERROR: Uncaught (in promise) TypeError: network error +CONSOLE ERROR: Uncaught (in promise) TypeError: network error +This is a testharness.js-based test. +Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: network error +PASS Startup +PASS ReadableStreamReader acquisition / releasing +PASS read contents with ReadableStreamReader +FAIL parallel read promise_test: Unhandled rejection with value: object "TypeError: network error" +PASS acquiring a reader should not set bodyUsed. +FAIL Clone after reading promise_test: Unhandled rejection with value: object "TypeError: network error" +PASS Cancelling stream stops downloading. +FAIL Cancelling stream should not affect cloned one. promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch" +PASS Streaming error should be reported as a TypeError. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/images/document-policy-oversized-images-forced-layout-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/images/document-policy-oversized-images-forced-layout-expected.txt deleted file mode 100644 index da7b2ea..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/http/tests/images/document-policy-oversized-images-forced-layout-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -CONSOLE ERROR: Document policy violation: oversized-images is not allowed in this document.
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/browser/set-download-behavior-deny-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/browser/set-download-behavior-deny-expected.txt new file mode 100644 index 0000000..9e6857e --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/browser/set-download-behavior-deny-expected.txt
@@ -0,0 +1,4 @@ +Tests download is canceled when behavior is set to deny. +Downloading via a navigation: +Error while evaluating 'location.href = "/devtools/network/resources/resource.php?download=1"': {"code":-32000,"message":"Inspected target navigated or closed"} +
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt index 0e35c4a..034c145 100644 --- a/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt +++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt
@@ -6,32 +6,32 @@ isChunked: true isH2: false redirected: false - headersSize: 175 + headersSize: 173 receivedDataSize: 2631 - reportedTotalSize: 2811 + reportedTotalSize: 2809 url: http://127.0.0.1:8000/inspector-protocol/resources/data-xfer-resource.php?size=4&flush_header_with_x_bytes=1&wait_after_headers_packet=25&flush_every=1&wait_every_x_bytes=1&wait_duration_every_x_bytes=25 isChunked: true isH2: false redirected: false - headersSize: 175 + headersSize: 173 receivedDataSize: 2631 - reportedTotalSize: 2811 + reportedTotalSize: 2809 url: http://127.0.0.1:8000/inspector-protocol/resources/data-xfer-resource.php?redirect=1 isChunked: false isH2: false redirected: false - headersSize: 169 + headersSize: 167 receivedDataSize: 2123 - reportedTotalSize: 2292 + reportedTotalSize: 2290 url: http://127.0.0.1:8000/inspector-protocol/resources/data-xfer-resource.php?cached=1 isChunked: false isH2: false redirected: false - headersSize: 169 + headersSize: 167 receivedDataSize: 2470 - reportedTotalSize: 2639 + reportedTotalSize: 2637
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/media/mixed-range-response-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/media/mixed-range-response-expected.txt new file mode 100644 index 0000000..bf5e5c52 --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/media/mixed-range-response-expected.txt
@@ -0,0 +1,26 @@ +CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +CONSOLE ERROR: Access to audio at 'http://localhost:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +CONSOLE ERROR: Access to audio at 'http://localhost:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000' (redirected from 'http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000') from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000' (redirected from 'http://127.0.0.1:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000') from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +CONSOLE ERROR: Access to audio at 'http://127.0.0.1:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=*' (redirected from 'http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3D*&cors_allow_origin=http://127.0.0.1:8000') from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +This is a testharness.js-based test. +FAIL Redirect from same-origin to same-origin must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg" +FAIL Redirect from same-origin to remote-origin must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg" +PASS CORS-disallowed remote-origin with crossOrigin=anonymous must fail. +FAIL CORS-allowed remote-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000" +FAIL Redirect from same-origin to same-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg" +PASS Redirect from same-origin to CORS-disallowed remote-origin with crossOrigin=anonymous must fail. +FAIL Redirect from same-origin to CORS-allowed remote-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000" +PASS Redirect from CORS-disallowed remote-origin to CORS-allowed remote-origin with crossOrigin=anonymous must fail. +FAIL Redirect from CORS-allowed remote-origin to CORS-allowed remote-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000" +FAIL Mixing same-origin responses must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg" +PASS Mixing same-origin response and remote-origin response must fail. +PASS Mixing remote-origin response and same-origin response must fail. +FAIL Mixing same remote-origin responses must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg" +FAIL Mixing same CORS-allowed remote-origin responses with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000" +FAIL Mixing same-origin response and CORS-allowed remote-origin response with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000" +FAIL Mixing CORS-allowed remote-origin response and same-origin response with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3D*&cors_allow_origin=http://127.0.0.1:8000" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/serviceworker/service-worker-mixed-response-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/serviceworker/service-worker-mixed-response-expected.txt new file mode 100644 index 0000000..98d1531 --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/serviceworker/service-worker-mixed-response-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Tests for Service Worker generated mixed responses. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&SW_FIRST=&SW_SECOND=&prevent_cache=1" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png b/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png index c1323cea..16c9937 100644 --- a/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png +++ b/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png deleted file mode 100644 index b970889..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-intro-01-t-expected.png b/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-intro-01-t-expected.png deleted file mode 100644 index d29f5ae..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-intro-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png b/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png index c70801b..a08cc32 100644 --- a/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png +++ b/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/exotic-color-space/images/missing-image-border-zoom-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/virtual/exotic-color-space/images/missing-image-border-zoom-expected.txt deleted file mode 100644 index dfddf31..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/virtual/exotic-color-space/images/missing-image-border-zoom-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -Blocked access to external URL https://www.example.com/doesntexist.png
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt index a329854..1ae371e6 100644 --- a/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt +++ b/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt
@@ -8,7 +8,7 @@ url : https://a.test:8443/inspector-protocol/resources/fledge_bidding_logic.js.php } ResourceReceiveResponse { - encodedDataLength : 228 + encodedDataLength : 226 fromCache : false fromServiceWorker : false mimeType : application/javascript @@ -37,7 +37,7 @@ ResourceFinish { decodedBodyLength : 598 didFail : false - encodedDataLength : 228 + encodedDataLength : 226 finishTime : <number> requestId : <string> } @@ -49,7 +49,7 @@ url : https://a.test:8443/inspector-protocol/resources/fledge_decision_logic.js.php } ResourceReceiveResponse { - encodedDataLength : 228 + encodedDataLength : 226 fromCache : false fromServiceWorker : false mimeType : application/javascript @@ -78,7 +78,7 @@ ResourceFinish { decodedBodyLength : 522 didFail : false - encodedDataLength : 228 + encodedDataLength : 226 finishTime : <number> requestId : <string> }
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/partitioned-cookies/http/tests/inspector-protocol/network/is-same-site-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/virtual/partitioned-cookies/http/tests/inspector-protocol/network/is-same-site-expected.txt new file mode 100644 index 0000000..e663374d --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/virtual/partitioned-cookies/http/tests/inspector-protocol/network/is-same-site-expected.txt
@@ -0,0 +1,132 @@ +Verifies that same site requests are marked as such +requests[ + [0] : { + headers : { + Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-iframe.html + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + initialPriority : Medium + isSameSite : true + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://127.0.0.1:8000/inspector-protocol/network/resources/relative.png + } + [1] : { + headers : { + Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-root.html + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + initialPriority : Low + isSameSite : true + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://127.0.0.1:8000/inspector-protocol/network/resources/root-relative-image.png + } + [2] : { + headers : { + Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-root.html + Upgrade-Insecure-Requests : 1 + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + initialPriority : VeryHigh + isSameSite : true + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-iframe.html + } + [3] : { + headers : { + Upgrade-Insecure-Requests : 1 + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + initialPriority : VeryHigh + isSameSite : true + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-root.html + } + [4] : { + headers : { + Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-iframe.html + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + initialPriority : Medium + isSameSite : true + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://127.0.0.1:8000/root.png + } + [5] : { + headers : { + Referer : http://devtools.oopif.test:8000/ + User-Agent : <string> + sec-ch-ua : "content_shell";v="999" + sec-ch-ua-mobile : ?0 + sec-ch-ua-platform : "Unknown" + } + initialPriority : Medium + isSameSite : false + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://127.0.0.1:8000/root.png + } + [6] : { + headers : { + Referer : http://127.0.0.1:8000/ + User-Agent : <string> + } + initialPriority : Low + isSameSite : false + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://devtools.oopif.test:8000/external-image.png + } + [7] : { + headers : { + Referer : http://devtools.oopif.test:8000/inspector-protocol/network/resources/same-site-iframe.html + User-Agent : <string> + } + initialPriority : Medium + isSameSite : false + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://devtools.oopif.test:8000/inspector-protocol/network/resources/relative.png + } + [8] : { + headers : { + Referer : http://127.0.0.1:8000/ + Upgrade-Insecure-Requests : 1 + User-Agent : <string> + } + initialPriority : VeryHigh + isSameSite : false + method : GET + mixedContentType : none + referrerPolicy : strict-origin-when-cross-origin + url : http://devtools.oopif.test:8000/inspector-protocol/network/resources/same-site-iframe.html + } +] +
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/text-antialias/international/001-expected.png b/third_party/blink/web_tests/platform/win11-arm64/virtual/text-antialias/international/001-expected.png deleted file mode 100644 index df15adb2..0000000 --- a/third_party/blink/web_tests/platform/win11-arm64/virtual/text-antialias/international/001-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png b/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png index c71b038..73929f5 100644 --- a/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png +++ b/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png index b98c1aad..a025ef1 100644 --- a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png +++ b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png index a56f9cbc..3f79c65 100644 --- a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png +++ b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png index 8b1b9a63..c0e85ad 100644 --- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png +++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png index 8b1b9a63..c0e85ad 100644 --- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png +++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png b/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png index e0479cec..11a1515e 100644 --- a/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png +++ b/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/svg/filters/filter-clip-expected.png index a44edc7..9a7b28c 100644 --- a/third_party/blink/web_tests/svg/filters/filter-clip-expected.png +++ b/third_party/blink/web_tests/svg/filters/filter-clip-expected.png Binary files differ
diff --git a/third_party/ipcz/include/ipcz/ipcz.h b/third_party/ipcz/include/ipcz/ipcz.h index 665533d4..b2072b9 100644 --- a/third_party/ipcz/include/ipcz/ipcz.h +++ b/third_party/ipcz/include/ipcz/ipcz.h
@@ -192,48 +192,44 @@ #define IPCZ_INVALID_DRIVER_HANDLE ((IpczDriverHandle)0) -// Flags given to the ipcz activity handler by a driver transport to notify ipcz -// about incoming data or state changes. +// Flags which may be passed by a driver to an IpczTransportActivityHandler when +// notifying ipcz about transport activity. typedef uint32_t IpczTransportActivityFlags; -// If set, the driver encountered an unrecoverable error using the transport and -// ipcz should discard it. Note that the driver is free to issue such -// notifications many times as long as it remains active, but ipcz will generally -// request deactivation ASAP once an error is signaled. +// Indicates that the driver encountered an unrecoverable error while using the +// transport. This generally results in ipcz deactivating the transport via the +// driver's DeactivateTransport(). #define IPCZ_TRANSPORT_ACTIVITY_ERROR IPCZ_FLAG_BIT(0) -// When ipcz wants to deactivate a transport, it invokes the driver's -// DeactivateTransport() function. Once the driver has finished any clean up and -// can ensure that the transport's activity handler will no longer be invoked, -// it must then invoke the activity handler one final time with this flag set. -// This finalizes deactivation and allows ipcz to free any associated resources. +// Informs ipcz that the driver will no longer invoke the activity handler for +// a given listener, as the driver is no longer listening for activity on the +// corresponding transport. #define IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED IPCZ_FLAG_BIT(1) #if defined(__cplusplus) extern "C" { #endif -// Notifies ipcz of activity on a transport. `transport` must be a handle to a -// transport which is currently activated. The `transport` handle is acquired -// exclusively by the driver transport via an ipcz call to the driver's -// ActivateTransport(), which also provides the handle to the driver. +// Notifies ipcz of activity on a transport. `listener` must be a handle to an +// active transport's listener, as provided to the driver by ipcz via +// ActivateTransport(). // -// The driver must use this function to feed incoming data and driver handles -// from the transport to ipcz, or to inform ipcz of any error conditions -// resulting in unexpected and irrecoverable dysfunction of the transport. +// Drivers use this function to feed incoming data and driver handles from a +// transport to ipcz, or to inform ipcz of any unrecoverable dysfunction of the +// transport. In the latter case, drivers specify IPCZ_TRANSPORT_ACTIVITY_ERROR +// in `flags` to instigate deactivation and disposal of the transport by ipcz. // -// If the driver encounters an unrecoverable error while performing I/O on the -// transport, it should invoke this with the IPCZ_TRANSPORT_ACTIVITY_ERROR flag -// to instigate deactivation of the transport by ipcz via a subsequent -// DeactivateTransport() call. +// If IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED is set in `flags`, this must be the +// last call made by the driver for the given `listener`. See also +// DeactivateTransport() defined on IpczDriver below. // // `options` is currently unused and must be null. // -// NOTE: It is the driver's responsibility to ensure that calls to this function -// for the same value of `transport` are mutually exclusive. Overlapping calls -// are unsafe and will result in undefined behavior. +// IMPORTANT: Drivers must ensure that all calls to this handler for the same +// `listener` are mutually exclusive. Overlapping calls are unsafe and will +// result in undefined behavior. typedef IpczResult(IPCZ_API* IpczTransportActivityHandler)( - IpczHandle transport, // in + IpczHandle listener, // in const void* data, // in size_t num_bytes, // in const IpczDriverHandle* driver_handles, // in @@ -259,11 +255,6 @@ // I/O operations to facilitate communication between nodes, giving embedding // systems full control over choice of OS-specific transport mechanisms and I/O // scheduling decisions. -// -// The driver API is meant to be used by both the application embedding ipcz, -// particularly for creating transports to make initial contact between nodes, -// as well as by ipcz itself to delegate creation and management of new -// transports which ipcz brokers between nodes. struct IPCZ_ALIGN(8) IpczDriver { // The exact size of this structure in bytes. Must be set accurately by the // application before passing this structure to any ipcz API functions. @@ -284,12 +275,12 @@ // Serializes a driver object identified by `handle` into a collection of // bytes and readily transmissible driver objects, for eventual transmission // over `transport`. At a minimum this must support serialization of transport - // and memory objects allocated by ipcz through the driver. Any other driver - // objects intended for applications to box and transmit through portals must - // also be serializable here. + // and memory objects created by the same driver. Any other driver objects + // intended for applications to box and transmit through portals must also be + // serializable here. // - // If the specified object is invalid or unserializable, the driver must - // ignore all other arguments (including `transport`) and return + // If the object identified by `handle` is invalid or unserializable, the + // driver must ignore all other arguments (including `transport`) and return // IPCZ_RESULT_INVALID_ARGUMENT. // // If the object can be serialized but success may depend on the value of @@ -307,27 +298,27 @@ // object through a more capable broker node. // // For all other outcomes, the object identified by `handle` is considered to - // be serializable and ultimately transmissible. + // be serializable. // // `num_bytes` and `num_handles` on input point to the capacities of the - // respective output buffers provided by ipcz. If either capacity pointer is - // null, a capacity of zero is implied; and if either input capacity is zero, - // the corresponding input buffer may be null. + // respective output buffers provided by `data` and `handles`. If either + // capacity pointer is null, a capacity of zero is implied; and if either + // input capacity is zero, the corresponding output buffer may be null. // // Except in the failure modes described above, the driver must update any // non-null capacity input to reflect the exact capacity required to serialize // the object. For example if `num_bytes` is non-null and the object // serializes to 8 bytes of data, `*num_bytes` must be set to 8 upon return. // - // If the required data or handle capacity is larger than the respective input - // capacity, the driver must return IPCZ_RESULT_RESUORCE_EXHAUSTED without - // modifying the contents of either `data` or `handles` buffers. + // If serializing the object requires more data or handle capacity than ipcz + // provided, the driver must return IPCZ_RESULT_RESUORCE_EXHAUSTED after + // updating the capacity values as described above. In this case the driver + // must not touch `data` or `handles`. // // Finally, if the input capacities were both sufficient, the driver must fill // `data` and `handles` with a serialized representation of the object and // return IPCZ_RESULT_OK. In this case ipcz relinquishes `handle` and will no - // longer refer to it unless the driver outputs it back in `handles`, implying - // that it was already transmissible as-is. + // longer refer to it. IpczResult(IPCZ_API* Serialize)(IpczDriverHandle handle, // in IpczDriverHandle transport, // in uint32_t flags, // in @@ -341,12 +332,12 @@ // ============= // // Deserializes a driver object from a collection of bytes and transmissible - // driver objects which was originally produced by Serialize() and received on - // the calling node via `transport`. + // driver handles that was originally produced by Serialize() and received by + // activity on `transport`. // // Any return value other than IPCZ_RESULT_OK indicates an error and implies - // that `handle` is unmodified. Otherwise `handle` must contain a valid driver - // handle to the deserialized object. + // that `handle` is unmodified. Otherwise `*handle` must be set to a valid + // driver handle which identifies the deserialized object upon return. IpczResult(IPCZ_API* Deserialize)( const volatile void* data, // in size_t num_bytes, // in @@ -372,6 +363,9 @@ // // Any return value other than IPCZ_RESULT_OK indicates an error and implies // that `new_transport0` and `new_transport1` are unmodified. + // + // Returned transports may be used immediately by ipcz for Transmit(), even + // if the transports are not yet activated. IpczResult(IPCZ_API* CreateTransports)( IpczDriverHandle transport0, // in IpczDriverHandle transport1, // in @@ -383,34 +377,33 @@ // ActivateTransport() // =================== // - // Called by ipcz to activate a transport. `driver_transport` is the - // driver-side handle assigned to the transport by the driver, either as given - // to ipcz via ConnectNode(), or as returned by the driver from an ipcz call - // out to CreateTransports(). + // Called by ipcz to activate a given `transport`, either as given to ipcz via + // ConnectNode(), or as returned by the driver from CreateTransports(). // - // `transport` is a handle the driver can use when calling `activity_handler` - // to update ipcz regarding any incoming data or state changes from the + // `listener` is a handle the driver must use when calling `activity_handler` + // to notify ipcz about any incoming data or state changes on the identified // transport. // // Before this returns, the driver should establish any I/O monitoring or - // scheduling state necessary to support operation of the endpoint, and once - // it returns ipcz may immediately begin making Transmit() calls on - // `driver_transport`. + // scheduling state necessary to support operation of the endpoint. // // Any return value other than IPCZ_RESULT_OK indicates an error, and the - // endpoint will be dropped by ipcz. Otherwise the endpoint may be used - // immediately to accept or submit data, and it should continue to operate - // until ipcz calls Close() on `driver_transport`. + // transport will be closed by ipcz. Otherwise the transport may immediately + // begin to invoke `activity_handler` and may continue to do so until + // deactivated via DeactivateTransport(). // - // Note that `activity_handler` invocations MUST be mutually exclusive, - // because transmissions from ipcz are expected to arrive and be processed - // strictly in-order. + // Note that while `activity_handler` may be invoked by the driver from any + // thread, invocations MUST be mutually exclusive for a given `listener`. + // Overlapping invocations are unsafe and will result in undefined behavior. // - // The driver may elicit forced destruction of itself by calling - // `activity_handler` with the flag IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED. + // The driver may elicit forced deactivation and destruction of an active + // transport by calling `activity_handler` with the + // IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED flag. Otherwise ipcz will eventually + // deactivate `transport` when it's no longer in use by calling + // DeactivateTransport(). IpczResult(IPCZ_API* ActivateTransport)( - IpczDriverHandle driver_transport, // in - IpczHandle transport, // in + IpczDriverHandle transport, // in + IpczHandle listener, // in IpczTransportActivityHandler activity_handler, // in uint32_t flags, // in const void* options); // in @@ -418,19 +411,20 @@ // DeactivateTransport() // ===================== // - // Called by ipcz to deactivate a transport. The driver does not need to - // complete deactivation synchronously, but it must begin to deactivate the - // transport and must invoke the transport's activity handler one final time - // with IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED once finished. Beyond that point, - // the activity handler must no longer be invoked for that transport. + // Called by ipcz to deactivate a transport that is no longer needed. // - // Note that even after deactivation, ipcz may continue to call into the - // transport until it's closed with an explicit call to the driver's Close() - // by ipcz. - IpczResult(IPCZ_API* DeactivateTransport)( - IpczDriverHandle driver_transport, // in - uint32_t flags, // in - const void* options); // in + // The driver does not need to complete deactivation synchronously, but it + // must eventually (soon) cease operation of the transport and finalize the + // deactivation by invoking activity handler one final time with + // IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED. Failure to do this will result in + // resource leaks. + // + // Note that even after deactivation, ipcz may continue to call into + // `transport` for other operations (e.g. Serialize() or Transmit()) until + // it's closed by ipcz with an explicit call to the driver's Close(). + IpczResult(IPCZ_API* DeactivateTransport)(IpczDriverHandle transport, // in + uint32_t flags, // in + const void* options); // in // Transmit() // ========== @@ -440,21 +434,19 @@ // it must return a result other than IPCZ_RESULT_OK, and this will cause the // transport's connection to be severed. // - // Note that any driver handles in `driver_handles` were obtained by ipcz from - // the driver itself, by some prior call to the driver's own Serialize() + // Note that all handles in `driver_handles` were obtained by ipcz from the + // driver itself, as returned by a prior call to the driver's own Serialize() // function. These handles are therefore expected to be directly transmissible // by the driver alongside any data in `data`. // - // The net result of this transmission should be an activity handler - // invocation on the corresponding remote transport by the driver on its node. - // It is the driver's responsibility to get any data and handles to the other - // transport, and to ensure that all transmissions from transport end up - // invoking the activity handler on the peer transport in the same order they - // were transmitted. + // The driver is responsible for ensuring that every Transmit() on a transport + // results in a corresponding activity handler invocation on the remote peer's + // transport, even if `num_bytes` and `num_driver_handles` are both zero. // - // If ipcz only wants to wake the peer node rather than transmit data or - // handles, `num_bytes` and `num_driver_handles` may both be zero. - IpczResult(IPCZ_API* Transmit)(IpczDriverHandle driver_transport, // in + // IMPORTANT: For any sequence of Transmit() calls from the same thread, the + // corresponding activity handler invocations on the peer transport must + // occur in the same order. + IpczResult(IPCZ_API* Transmit)(IpczDriverHandle transport, // in const void* data, // in size_t num_bytes, // in const IpczDriverHandle* driver_handles, // in @@ -468,7 +460,7 @@ // The ipcz Reject() API can be used by an application to reject a specific // parcel received from a portal. If the parcel in question came from a // remote node, ipcz invokes ReportBadTransportActivity() to notify the driver - // about the `transport` which delivered the rejected parcel. + // about the `transport` which received the rejected parcel. // // `context` is an opaque value passed by the application to the Reject() call // which elicited this invocation. @@ -1006,9 +998,10 @@ // ============= // // Connects `node` to another node in the system using an application-provided - // driver transport handle in `driver_transport` for communication. If this - // call will succeed, ipcz will call back into the driver to activate this - // transport via ActivateTransport() before returning. + // driver transport handle in `transport` for communication. If this call will + // succeed, ipcz will call back into the driver to activate the transport via + // ActivateTransport() before returning, and may call Transmit() before or + // after that as well. // // The application is responsible for delivering the other endpoint of the // transport to whatever other node will use it with its own corresponding @@ -1069,12 +1062,12 @@ // IPCZ_RESULT_OUT_OF_RANGE if `num_initial_portals` is larger than the // ipcz implementation allows. There is no hard limit specified, but // any ipcz implementation must support at least 8 initial portals. - IpczResult(IPCZ_API* ConnectNode)(IpczHandle node, // in - IpczDriverHandle driver_transport, // in - size_t num_initial_portals, // in - IpczConnectNodeFlags flags, // in - const void* options, // in - IpczHandle* initial_portals); // out + IpczResult(IPCZ_API* ConnectNode)(IpczHandle node, // in + IpczDriverHandle transport, // in + size_t num_initial_portals, // in + IpczConnectNodeFlags flags, // in + const void* options, // in + IpczHandle* initial_portals); // out // OpenPortals() // =============
diff --git a/third_party/ipcz/src/ipcz/api_object.h b/third_party/ipcz/src/ipcz/api_object.h index 9a4610f..e57c85f 100644 --- a/third_party/ipcz/src/ipcz/api_object.h +++ b/third_party/ipcz/src/ipcz/api_object.h
@@ -23,7 +23,7 @@ kNode, kPortal, kBox, - kTransport, + kTransportListener, kParcel, };
diff --git a/third_party/ipcz/src/ipcz/driver_transport.cc b/third_party/ipcz/src/ipcz/driver_transport.cc index a8cb7a1..096f1b3b 100644 --- a/third_party/ipcz/src/ipcz/driver_transport.cc +++ b/third_party/ipcz/src/ipcz/driver_transport.cc
@@ -19,21 +19,21 @@ namespace { -IpczResult IPCZ_API NotifyTransport(IpczHandle transport, +IpczResult IPCZ_API NotifyTransport(IpczHandle listener, const void* data, size_t num_bytes, const IpczDriverHandle* driver_handles, size_t num_driver_handles, IpczTransportActivityFlags flags, const void* options) { - DriverTransport* t = DriverTransport::FromHandle(transport); + DriverTransport* t = DriverTransport::FromHandle(listener); if (!t) { return IPCZ_RESULT_INVALID_ARGUMENT; } if (flags & IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED) { const Ref<DriverTransport> doomed_transport = - DriverTransport::TakeFromHandle(transport); + DriverTransport::TakeFromHandle(listener); doomed_transport->NotifyDeactivated(); return IPCZ_RESULT_OK; }
diff --git a/third_party/ipcz/src/ipcz/driver_transport.h b/third_party/ipcz/src/ipcz/driver_transport.h index e95bfff..c1f79e67 100644 --- a/third_party/ipcz/src/ipcz/driver_transport.h +++ b/third_party/ipcz/src/ipcz/driver_transport.h
@@ -26,7 +26,7 @@ // on the transport, and ipcz calls into this object to submit outgoing messages // for transmission by the driver. class DriverTransport - : public APIObjectImpl<DriverTransport, APIObject::kTransport> { + : public APIObjectImpl<DriverTransport, APIObject::kTransportListener> { public: using Pair = std::pair<Ref<DriverTransport>, Ref<DriverTransport>>;
diff --git a/third_party/ipcz/src/reference_drivers/async_reference_driver.cc b/third_party/ipcz/src/reference_drivers/async_reference_driver.cc index 98ae2c4..0705d2ad 100644 --- a/third_party/ipcz/src/reference_drivers/async_reference_driver.cc +++ b/third_party/ipcz/src/reference_drivers/async_reference_driver.cc
@@ -211,11 +211,11 @@ } IpczResult IPCZ_API ActivateTransport(IpczDriverHandle transport, - IpczHandle ipcz_transport, + IpczHandle listener, IpczTransportActivityHandler handler, uint32_t, const void*) { - AsyncTransport::FromHandle(transport)->Activate(ipcz_transport, handler); + AsyncTransport::FromHandle(transport)->Activate(listener, handler); return IPCZ_RESULT_OK; }
diff --git a/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc b/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc index 23f57256..4f655f49 100644 --- a/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc +++ b/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc
@@ -306,33 +306,33 @@ } IpczResult IPCZ_API -ActivateTransport(IpczDriverHandle driver_transport, - IpczHandle transport, +ActivateTransport(IpczDriverHandle transport, + IpczHandle listener, IpczTransportActivityHandler activity_handler, uint32_t flags, const void* options) { - MultiprocessTransport::FromHandle(driver_transport) - ->Activate(transport, activity_handler); + MultiprocessTransport::FromHandle(transport)->Activate(listener, + activity_handler); return IPCZ_RESULT_OK; } -IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle driver_transport, +IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle transport, uint32_t flags, const void* options) { - MultiprocessTransport::FromHandle(driver_transport)->Deactivate(); + MultiprocessTransport::FromHandle(transport)->Deactivate(); return IPCZ_RESULT_OK; } -IpczResult IPCZ_API Transmit(IpczDriverHandle driver_transport, +IpczResult IPCZ_API Transmit(IpczDriverHandle transport, const void* data, size_t num_bytes, const IpczDriverHandle* handles, size_t num_handles, uint32_t flags, const void* options) { - return MultiprocessTransport::FromHandle(driver_transport) - ->Transmit(absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes), - absl::MakeSpan(handles, num_handles)); + return MultiprocessTransport::FromHandle(transport)->Transmit( + absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes), + absl::MakeSpan(handles, num_handles)); } IpczResult IPCZ_API ReportBadTransportActivity(IpczDriverHandle transport,
diff --git a/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc b/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc index 8b086c6..0a66de0 100644 --- a/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc +++ b/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc
@@ -340,32 +340,31 @@ return IPCZ_RESULT_OK; } -IpczResult IPCZ_API ActivateTransport(IpczDriverHandle driver_transport, - IpczHandle transport, +IpczResult IPCZ_API ActivateTransport(IpczDriverHandle transport, + IpczHandle listener, IpczTransportActivityHandler handler, uint32_t flags, const void* options) { - return InProcessTransport::FromHandle(driver_transport) - ->Activate(transport, handler); + return InProcessTransport::FromHandle(transport)->Activate(listener, handler); } -IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle driver_transport, +IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle transport, uint32_t flags, const void* options) { - InProcessTransport::FromHandle(driver_transport)->Deactivate(); + InProcessTransport::FromHandle(transport)->Deactivate(); return IPCZ_RESULT_OK; } -IpczResult IPCZ_API Transmit(IpczDriverHandle driver_transport, +IpczResult IPCZ_API Transmit(IpczDriverHandle transport, const void* data, size_t num_bytes, const IpczDriverHandle* handles, size_t num_handles, uint32_t flags, const void* options) { - return InProcessTransport::FromHandle(driver_transport) - ->Transmit(absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes), - absl::MakeSpan(handles, num_handles)); + return InProcessTransport::FromHandle(transport)->Transmit( + absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes), + absl::MakeSpan(handles, num_handles)); } } // namespace
diff --git a/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc b/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc index a2b8760..ca328a17 100644 --- a/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc +++ b/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc
@@ -35,7 +35,7 @@ // This is used by tests to conveniently handle driver transport notifications // with lambdas. class TransportReceiver - : public APIObjectImpl<TransportReceiver, APIObject::kTransport> { + : public APIObjectImpl<TransportReceiver, APIObject::kTransportListener> { public: explicit TransportReceiver(TransportHandlers handlers) : handlers_(std::move(handlers)) {}
diff --git a/tools/binary_size/libsupersize/viewer/static/dom.js b/tools/binary_size/libsupersize/viewer/static/dom.js index 43fa4eb..be0f7cc5 100644 --- a/tools/binary_size/libsupersize/viewer/static/dom.js +++ b/tools/binary_size/libsupersize/viewer/static/dom.js
@@ -60,6 +60,32 @@ element.className = className; return element; }, + /** + * Schedule a one-time |task| call on next animation frame when |node| is + * added to the DOM, or if |node| is already in the DOM. + * @param {!Node} node + * @param {!function(): *} task + */ + onNodeAdded(node, task) { + if (document.contains(node)) { + requestAnimationFrame(task); + return; + } + let found = false; + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + for (const node of mutation.addedNodes) { + if (node.contains(node)) { + observer.disconnect(); + found = true; + requestAnimationFrame(task); + return; + } + } + } + }); + observer.observe(document, {subtree: true, childList: true}); + }, }; /** Centralized object for element access. */
diff --git a/tools/binary_size/libsupersize/viewer/static/state.js b/tools/binary_size/libsupersize/viewer/static/state.js index 0f97490..1545bb95 100644 --- a/tools/binary_size/libsupersize/viewer/static/state.js +++ b/tools/binary_size/libsupersize/viewer/static/state.js
@@ -73,10 +73,11 @@ class QueryParamUiState extends UiState { /** * @param {string} name - * @param {?function(string): StateValue} parser * @param {!StateValue} defaultValue + * @param {?function(string): StateValue} parser + * @param {boolean} isHash */ - constructor(name, defaultValue, parser) { + constructor(name, defaultValue, parser, isHash) { super(defaultValue); /** @public @const {string} */ @@ -85,6 +86,9 @@ /** @private @const {?function(string): StateValue} null = identity. */ this.parser = parser; + /** @public @const {boolean} */ + this.isHash = isHash; + /** @public {string} */ this.hidden = false; } @@ -124,8 +128,9 @@ /** * @param {string} name * @param {!HasValue} elt + * @param {boolean} isHash */ - constructor(name, elt) { + constructor(name, elt, isHash) { let parser = null; let readElt = () => elt.value; let writeElt = (v) => { @@ -178,7 +183,7 @@ throw new Error('Unknown element type.'); } - super(name, readElt(), parser); + super(name, readElt(), parser, isHash); /** @private @const {function(): StateValue} */ this.readElt = readElt; @@ -222,13 +227,14 @@ * Instantiation helper that also pushes object to |uiStates|. * @param {string} name * @param {?HasValue} elt + * @param {boolean=} isHash */ - const newUiState = (name, elt) => { + const newUiState = (name, elt, isHash = false) => { if (!elt) { // Assume string value with defaultValue == ''. - this.uiStates.push(new QueryParamUiState(name, '', null)); + this.uiStates.push(new QueryParamUiState(name, '', null, isHash)); } else { - this.uiStates.push(new ElementUiState(name, elt)); + this.uiStates.push(new ElementUiState(name, elt, isHash)); } return this.uiStates[this.uiStates.length - 1]; }; @@ -279,12 +285,15 @@ * @private */ toString() { - const params = new URLSearchParams(); + const queryParams = new URLSearchParams(); + const hashParams = new URLSearchParams(); for (const st of this.uiStates) { - st.writeToSearchParams(params); + st.writeToSearchParams(st.isHash ? hashParams : queryParams); } - const queryString = params.toString(); - return queryString.length > 0 ? `?${queryString}` : ''; + const queryString = queryParams.toString(); + const hashString = hashParams.toString(); + return (queryString.length > 0 ? `?${queryString}` : '') + + (hashString.length > 0 ? `#${hashString}` : ''); } /** @private */ @@ -361,9 +370,10 @@ /** @public */ init() { - const params = new URLSearchParams(location.search.slice(1)); + const queryParams = new URLSearchParams(location.search.slice(1)); + const hashParams = new URLSearchParams(location.hash.slice(1)); for (const st of this.uiStates) { - st.readFromSearchParams(params); + st.readFromSearchParams(st.isHash ? hashParams : queryParams); } // At this point it's possible to update the URL to fix mistakes and // canonicalize (e.g., param ordering). However, we choose to NOT do this
diff --git a/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js b/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js index 3649e4f1..ca0422e6 100644 --- a/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js +++ b/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js
@@ -48,7 +48,6 @@ this.boundHandleFocusOut = this.handleFocusOut.bind(this); } - /** * Displays an error modal to indicate that the symbol tree is empty. * @param {boolean} show @@ -189,8 +188,8 @@ handleRefocus(event) { // Prevent click that would cause another focus event. event.preventDefault(); - // focusout handler will handle cleanup. /** @type {!HTMLElement} */ (event.currentTarget).blur(); + // Let focusout handles the cleanup. } /**
diff --git a/tools/binary_size/libsupersize/viewer/static/tree-ui.js b/tools/binary_size/libsupersize/viewer/static/tree-ui.js index 6ce7975..a2e994da 100644 --- a/tools/binary_size/libsupersize/viewer/static/tree-ui.js +++ b/tools/binary_size/libsupersize/viewer/static/tree-ui.js
@@ -24,6 +24,9 @@ class TreeUi { /** @param {!HTMLUListElement} rootElt */ constructor(rootElt) { + /** @protected @const {!HTMLUListElement} rootElt */ + this.rootElt = rootElt; + /** * @protected {HTMLCollectionOf<!TreeNodeElement>} Collection of all tree * node elements. Updates itself automatically. @@ -125,6 +128,44 @@ } /** + * @param {!HTMLAnchorElement} link + * @return {!HTMLLIElement} + * @protected + */ + getTreeItemFromLink(link) { + // Canonical structure: + // <li> <!-- |treeitem| --> + // <a class="node">...</a> <!-- |link| --> + // <ul>...</ul> <!-- |group| --> + // </li> + return /** @type {!HTMLLIElement} */ (link.parentElement); + } + + /** + * @param {!HTMLAnchorElement} link + * @return {!HTMLUListElement} + * @protected + */ + getGroupFromLink(link) { + return /** @type {!HTMLUListElement} */ (link.nextElementSibling); + } + + /** + * @param {!HTMLElement} link + * @param {!Array<DocumentFragment>} childrenElements + * @protected + */ + autoExpandAttentionWorthyChild(link, childrenElements) { + if (childrenElements.length === 1) { + // Open inner element if it only has a single child; this ensures nodes + // like "java"->"com"->"google" are opened all at once. + const node = /** @type {!TreeNodeElement} */ ( + childrenElements[0].querySelector('.node')); + node.click(); + } + } + + /** * Populates |link| with * @param {!HTMLAnchorElement} link * @protected @@ -132,16 +173,10 @@ async expandGroupElement(link) { const childrenData = await this.getGroupChildrenData(link); const newElements = childrenData.map((data) => this.makeNodeElement(data)); - if (newElements.length === 1) { - // Open inner element if it only has a single child; this ensures nodes - // like "java"->"com"->"google" are opened all at once. - /** @type {!TreeNodeElement} */ - const childLink = newElements[0].querySelector('.node'); - childLink.click(); // Can trigger further expansion. - } + this.autoExpandAttentionWorthyChild(link, newElements); const newElementsFragment = dom.createFragment(newElements); requestAnimationFrame(() => { - link.nextElementSibling.appendChild(newElementsFragment); + this.getGroupFromLink(link).appendChild(newElementsFragment); }); } @@ -152,15 +187,9 @@ */ async toggleGroupElement(event) { event.preventDefault(); - - // Canonical structure: - // <li> <!-- |treeitem| --> - // <a class="node">...</a> <!-- |link| --> - // <ul>...</ul> <!-- |group| --> - // </li> const link = /** @type {!HTMLAnchorElement} */ (event.currentTarget); - const treeitem = /** @type {!HTMLLIElement} */ (link.parentElement); - const group = /** @type {!HTMLUListElement} */ (link.nextElementSibling); + const treeitem = this.getTreeItemFromLink(link); + const group = this.getGroupFromLink(link); const isExpanded = treeitem.getAttribute('aria-expanded') === 'true'; if (isExpanded) { @@ -282,6 +311,35 @@ return false; } + /** + * Handler for gaining focus relative to other TreeUi instances. + * @protected + */ + onTreeFocus() {} + + /** + * Handler for losing focus relative to other TreeUi instances, i.e., this + * does NOT fire when non-TreeUi UI elements gain focus. + * @protected + */ + onTreeBlur() {} + /** @public */ - init() {} + focus() { + if (TreeUi.activeTreeUi !== this) { + if (TreeUi.activeTreeUi) + TreeUi.activeTreeUi.onTreeBlur(); + TreeUi.activeTreeUi = this; + TreeUi.activeTreeUi.onTreeFocus(); + } + } + + /** @public */ + init() { + // Each instance contributes to managing focus / blur dynamics. + this.rootElt.addEventListener('click', () => this.focus()); + } } + +/** @type {?TreeUi} */ +TreeUi.activeTreeUi = null;
diff --git a/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js b/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js index 54646028..2953b73 100644 --- a/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js +++ b/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js
@@ -128,6 +128,7 @@ Module._free(heapBuffer.byteOffset); } +/** @return {SizeProperties} */ function wasmLoadSizeProperties() { const cwrapQueryProperty = Module.cwrap('QueryProperty', 'number', ['string']);
diff --git a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp index 0a763ef5..b671d3ae 100644 --- a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp +++ b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
@@ -21,9 +21,7 @@ TypeMatcher GarbageCollectedType() { auto has_gc_base = hasCanonicalType(hasDeclaration( - cxxRecordDecl(isDerivedFrom(hasAnyName("::blink::GarbageCollected", - "::blink::GarbageCollectedMixin", - "::cppgc::GarbageCollected", + cxxRecordDecl(isDerivedFrom(hasAnyName("::cppgc::GarbageCollected", "::cppgc::GarbageCollectedMixin"))) .bind("gctype"))); return anyOf(has_gc_base, @@ -31,10 +29,8 @@ } auto MemberType() { - auto has_member_name = hasAnyName("::blink::Member", "::blink::WeakMember", - "::cppgc::internal::BasicMember"); - return anyOf(hasType(recordDecl(has_member_name)), - hasType(typeAliasTemplateDecl(has_member_name))); + return hasType(hasCanonicalType(hasDeclaration(cxxRecordDecl( + isSameOrDerivedFrom(hasName("::cppgc::internal::BasicMember")))))); } class UniquePtrGarbageCollectedMatcher : public MatchFinder::MatchCallback {
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp index e0742a0..1de2408 100644 --- a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp +++ b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
@@ -85,7 +85,7 @@ options_(options), cache_(instance), json_(0) { - // Only check structures in the blink, cppgc and pdfium. + // Only check structures in blink, cppgc and pdfium. options_.checked_namespaces.insert("blink"); options_.checked_namespaces.insert("cppgc"); @@ -96,12 +96,9 @@ // Ignore GC implementation files. options_.ignored_directories.push_back( - "third_party/blink/renderer/platform/heap/"); + "third_party/blink/renderer/platform/heap/collection_support/"); options_.ignored_directories.push_back("v8/src/heap/cppgc/"); options_.ignored_directories.push_back("v8/src/heap/cppgc-js/"); - - options_.allowed_directories.push_back( - "third_party/blink/renderer/platform/heap/test/"); } void BlinkGCPluginConsumer::HandleTranslationUnit(ASTContext& context) { @@ -647,10 +644,6 @@ #endif for (const auto& ignored_dir : options_.ignored_directories) if (filename.find(ignored_dir) != std::string::npos) { - for (const auto& allowed_dir : options_.allowed_directories) { - if (filename.find(allowed_dir) != std::string::npos) - return false; - } return true; } return false;
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h index d80a79f..9c3eac3d 100644 --- a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h +++ b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
@@ -62,8 +62,6 @@ std::set<std::string> checked_namespaces; std::vector<std::string> checked_directories; std::vector<std::string> ignored_directories; - // |allowed_directories| overrides |ignored_directories|. - std::vector<std::string> allowed_directories; }; #endif // TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_OPTIONS_H_
diff --git a/tools/clang/blink_gc_plugin/Config.h b/tools/clang/blink_gc_plugin/Config.h index 8cfef79..aeea156 100644 --- a/tools/clang/blink_gc_plugin/Config.h +++ b/tools/clang/blink_gc_plugin/Config.h
@@ -57,9 +57,6 @@ llvm::StringRef ns_name, RecordInfo* info, RecordInfo::TemplateArgs* args) { - if (name == "Member") { - return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args); - } if (name == "BasicMember") { if (!VerifyNamespaceAndArgCount("cppgc", 2, ns_name, info, args)) return false; @@ -72,9 +69,6 @@ llvm::StringRef ns_name, RecordInfo* info, RecordInfo::TemplateArgs* args) { - if (name == "WeakMember") { - return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args); - } if (name == "BasicMember") { if (!VerifyNamespaceAndArgCount("cppgc", 2, ns_name, info, args)) return false; @@ -87,9 +81,6 @@ llvm::StringRef ns_name, RecordInfo* info, RecordInfo::TemplateArgs* args) { - if ((name == "Persistent") || (name == "WeakPersistent")) { - return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args); - } if (name == "BasicPersistent") { return VerifyNamespaceAndArgCount("cppgc", 1, ns_name, info, args); } @@ -100,10 +91,6 @@ llvm::StringRef ns_name, RecordInfo* info, RecordInfo::TemplateArgs* args) { - if ((name == "CrossThreadPersistent") || - (name == "CrossThreadWeakPersistent")) { - return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args); - } if (name == "BasicCrossThreadPersistent") { return VerifyNamespaceAndArgCount("cppgc", 1, ns_name, info, args); }
diff --git a/tools/clang/blink_gc_plugin/process-graph.py b/tools/clang/blink_gc_plugin/process-graph.py index c9c3c8d..4f5f4ce 100755 --- a/tools/clang/blink_gc_plugin/process-graph.py +++ b/tools/clang/blink_gc_plugin/process-graph.py
@@ -362,8 +362,6 @@ ignored_cycles.append(block) gc_bases = ( - 'blink::GarbageCollected', - 'blink::GarbageCollectedMixin', 'cppgc::GarbageCollected', 'cppgc::GarbageCollectedMixin', )
diff --git a/tools/clang/blink_gc_plugin/tests/heap/stubs.h b/tools/clang/blink_gc_plugin/tests/heap/stubs.h index fde6a6bc..724386e 100644 --- a/tools/clang/blink_gc_plugin/tests/heap/stubs.h +++ b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
@@ -167,8 +167,6 @@ } // namespace absl -#if defined(USE_V8_OILPAN) - namespace cppgc { class Visitor { @@ -181,13 +179,23 @@ }; namespace internal { +class WriteBarrierPolicyImpl; +class CheckingPolicyImpl; +class StorateTypeImpl; +class LocationPolicyImpl; + class StrongMemberTag; class WeakMemberTag; +template <typename StorageType> class MemberBase {}; -template <typename T, typename Tag> -class BasicMember : public MemberBase { +template <typename T, + typename WeaknessTag, + typename WriteBarrierPolicy, + typename CheckingPolicy, + typename StorageType> +class BasicMember : public MemberBase<StorageType> { public: operator T*() const { return 0; } T* operator->() const { return 0; } @@ -199,7 +207,10 @@ class PersistentBase {}; -template <typename T, typename Tag> +template <typename T, + typename WeaknessPolicy, + typename LocationPolicy, + typename CheckingPolicy> class BasicPersistent : public PersistentBase { public: operator T*() const { return 0; } @@ -210,8 +221,13 @@ class StrongCrossThreadPersistentPolicy; class WeakCrossThreadPersistentPolicy; -template <typename T, typename Tag> -class BasicCrossThreadPersistent : public PersistentBase { +class CrossThreadPersistentBase : public PersistentBase {}; + +template <typename T, + typename WeaknessPolicy, + typename LocationPolicy, + typename CheckingPolicy> +class BasicCrossThreadPersistent : public CrossThreadPersistentBase { public: operator T*() const { return 0; } T* operator->() const { return 0; } @@ -243,25 +259,43 @@ }; template <typename T> -using Member = internal::BasicMember<T, internal::StrongMemberTag>; +using Member = internal::BasicMember<T, + internal::StrongMemberTag, + internal::WriteBarrierPolicyImpl, + internal::CheckingPolicyImpl, + internal::StorateTypeImpl>; template <typename T> -using WeakMember = internal::BasicMember<T, internal::WeakMemberTag>; +using WeakMember = internal::BasicMember<T, + internal::WeakMemberTag, + internal::WriteBarrierPolicyImpl, + internal::CheckingPolicyImpl, + internal::StorateTypeImpl>; template <typename T> -using Persistent = - internal::BasicPersistent<T, internal::StrongPersistentPolicy>; +using Persistent = internal::BasicPersistent<T, + internal::StrongPersistentPolicy, + internal::LocationPolicyImpl, + internal::CheckingPolicyImpl>; template <typename T> -using WeakPersistent = - internal::BasicPersistent<T, internal::WeakPersistentPolicy>; +using WeakPersistent = internal::BasicPersistent<T, + internal::WeakPersistentPolicy, + internal::LocationPolicyImpl, + internal::CheckingPolicyImpl>; namespace subtle { template <typename T> -using CrossThreadPersistent = internal:: - BasicCrossThreadPersistent<T, internal::StrongCrossThreadPersistentPolicy>; +using CrossThreadPersistent = internal::BasicCrossThreadPersistent< + T, + internal::StrongCrossThreadPersistentPolicy, + internal::LocationPolicyImpl, + internal::CheckingPolicyImpl>; template <typename T> -using CrossThreadWeakPersistent = internal:: - BasicCrossThreadPersistent<T, internal::WeakCrossThreadPersistentPolicy>; +using CrossThreadWeakPersistent = internal::BasicCrossThreadPersistent< + T, + internal::WeakCrossThreadPersistentPolicy, + internal::LocationPolicyImpl, + internal::CheckingPolicyImpl>; } // namespace subtle @@ -293,88 +327,6 @@ template <typename T> using CrossThreadWeakPersistent = cppgc::subtle::CrossThreadWeakPersistent<T>; -#else // !defined(USE_V8_OILPAN) - -namespace blink { - -class Visitor { - public: - template <typename T, void (T::*method)(Visitor*)> - void RegisterWeakMembers(const T* obj); - - template <typename T> - void Trace(const T&); -}; - -template <typename T> -class GarbageCollected { - public: - void* operator new(size_t, void* location) { return location; } - - private: - void* operator new(size_t) = delete; - void* operator new[](size_t) = delete; -}; - -template <typename T, typename... Args> -T* MakeGarbageCollected(Args&&... args) { - return new (reinterpret_cast<void*>(0x87654321)) T(args...); -} - -class GarbageCollectedMixin { - public: - virtual void AdjustAndMark(Visitor*) const = 0; - virtual bool IsHeapObjectAlive(Visitor*) const = 0; - virtual void Trace(Visitor*) const {} -}; - -template<typename T> class Member { -public: - operator T*() const { return 0; } - T* operator->() const { return 0; } - bool operator!() const { return false; } - - private: - uint32_t compressed; -}; - -template<typename T> class WeakMember { -public: - operator T*() const { return 0; } - T* operator->() const { return 0; } - bool operator!() const { return false; } -}; - -template<typename T> class Persistent { -public: - operator T*() const { return 0; } - T* operator->() const { return 0; } - bool operator!() const { return false; } -}; - -template<typename T> class WeakPersistent { -public: - operator T*() const { return 0; } - T* operator->() const { return 0; } - bool operator!() const { return false; } -}; - -template<typename T> class CrossThreadPersistent { -public: - operator T*() const { return 0; } - T* operator->() const { return 0; } - bool operator!() const { return false; } -}; - -template<typename T> class CrossThreadWeakPersistent { -public: - operator T*() const { return 0; } - T* operator->() const { return 0; } - bool operator!() const { return false; } -}; - -#endif // !defined(USE_V8_OILPAN) - using namespace WTF; #define DISALLOW_NEW() \
diff --git a/tools/clang/blink_gc_plugin/tests/test.py b/tools/clang/blink_gc_plugin/tests/test.py index 9536cf29..cfdfdd59 100755 --- a/tools/clang/blink_gc_plugin/tests/test.py +++ b/tools/clang/blink_gc_plugin/tests/test.py
@@ -18,14 +18,11 @@ class BlinkGcPluginTest(plugin_testing.ClangPluginTest): """Test harness for the Blink GC plugin.""" - def __init__(self, use_cppgc, *args, **kwargs): + def __init__(self, *args, **kwargs): super(BlinkGcPluginTest, self).__init__(*args, **kwargs) - self.use_cppgc = use_cppgc def AdjustClangArguments(self, clang_cmd): clang_cmd.append('-Wno-inaccessible-base') - if self.use_cppgc: - clang_cmd.append('-DUSE_V8_OILPAN') def ProcessOneResult(self, test_name, actual): # Some Blink GC plugins dump a JSON representation of the object graph, and @@ -47,11 +44,6 @@ # Clean up the .graph.json file to prevent false passes from stale # results from a previous run. os.remove('%s.graph.json' % test_name) - if self.use_cppgc: - if os.path.exists('%s.cppgc.txt' % test_name): - # Some tests include namespace names in the output and thus require a - # different output file for comparison. - test_name = '%s.cppgc' % test_name return super(BlinkGcPluginTest, self).ProcessOneResult(test_name, actual) @@ -66,24 +58,8 @@ dir_name = os.path.dirname(os.path.realpath(__file__)) - num_failures_blink = BlinkGcPluginTest( - False, # USE_V8_OILPAN - dir_name, - args.clang_path, - 'blink-gc-plugin', - args.reset_results).Run() - - num_failures_cppgc = BlinkGcPluginTest( - True, # USE_V8_OILPAN - dir_name, - args.clang_path, - 'blink-gc-plugin', - args.reset_results).Run() - - print("\nBlink GC Plugin Summary: %d tests failed without USE_V8_OILPAN, " \ - "%d tests failed with USE_V8_OILPAN" % ( - num_failures_blink, num_failures_cppgc)) - return num_failures_blink + num_failures_cppgc + return BlinkGcPluginTest(dir_name, args.clang_path, 'blink-gc-plugin', + args.reset_results).Run() if __name__ == '__main__':
diff --git a/tools/clang/blink_gc_plugin/tests/trace_if_needed.cppgc.txt b/tools/clang/blink_gc_plugin/tests/trace_if_needed.cppgc.txt deleted file mode 100644 index 1acc31c..0000000 --- a/tools/clang/blink_gc_plugin/tests/trace_if_needed.cppgc.txt +++ /dev/null
@@ -1,7 +0,0 @@ -trace_if_needed.cpp:9:1: warning: [blink-gc] Class 'TemplatedObject<cppgc::internal::BasicMember<blink::HeapObject, cppgc::internal::StrongMemberTag>>' has untraced fields that require tracing. -template <typename T> -^ -./trace_if_needed.h:21:5: note: [blink-gc] Untraced field 'm_two' declared here: - T m_two; - ^ -1 warning generated.
diff --git a/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt b/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt index e789c81..a39af8b3 100644 --- a/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt +++ b/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt
@@ -1,4 +1,4 @@ -trace_if_needed.cpp:9:1: warning: [blink-gc] Class 'TemplatedObject<blink::Member<blink::HeapObject>>' has untraced fields that require tracing. +trace_if_needed.cpp:9:1: warning: [blink-gc] Class 'TemplatedObject<cppgc::internal::BasicMember<blink::HeapObject, cppgc::internal::StrongMemberTag, cppgc::internal::WriteBarrierPolicyImpl, cppgc::internal::CheckingPolicyImpl, cppgc::internal::StorateTypeImpl>>' has untraced fields that require tracing. template <typename T> ^ ./trace_if_needed.h:21:5: note: [blink-gc] Untraced field 'm_two' declared here:
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index b7fe3bcb..bcc7aa7 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -326,6 +326,10 @@ "META": {"sizes": {"includes": [30],}}, "includes": [3320], }, + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/sandbox_internals/resources.grd": { + "META": {"sizes": {"includes": [5],}}, + "includes": [3330], + }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/segmentation_internals/resources.grd": { "META": {"sizes": {"includes": [10]}}, "includes": [3340],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 9fc70cd0..039e53f 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -59991,6 +59991,7 @@ <int value="-1557747651" label="FractionalScrollOffsets:disabled"/> <int value="-1557527869" label="LoadingWithMojo:disabled"/> <int value="-1556805396" label="ScreenshotsForAndroidV2:enabled"/> + <int value="-1555616901" label="ShoppingListTrackByDefault:disabled"/> <int value="-1555510175" label="PasswordImport:enabled"/> <int value="-1555375841" label="FedCmRpContext:enabled"/> <int value="-1554921134" @@ -60229,6 +60230,7 @@ <int value="-1439701253" label="EnableExternalKeyboardsInDiagnosticsApp:enabled"/> <int value="-1438279809" label="GamepadExtensions:disabled"/> + <int value="-1437913839" label="AndroidAppIntegrationSafeSearch:disabled"/> <int value="-1437526584" label="HelpAppReleaseNotes:enabled"/> <int value="-1437091873" label="ArcInputOverlayAlphaV2:disabled"/> <int value="-1436892902" label="FastPairSavedDevices:disabled"/> @@ -61339,6 +61341,7 @@ <int value="-871419968" label="FilesTrashDrive:enabled"/> <int value="-870994173" label="NtpChromeCartModule:enabled"/> <int value="-870120067" label="EnableSearchBoxSelection:enabled"/> + <int value="-869690461" label="ShoppingListTrackByDefault:enabled"/> <int value="-868138290" label="CrostiniPortForwarding:disabled"/> <int value="-868041476" label="OmniboxFocusTriggersSRPZeroSuggest:enabled"/> <int value="-867571486" label="PrivateStateTokens:disabled"/> @@ -64491,6 +64494,7 @@ <int value="783270752" label="AndroidHistoryManager:enabled"/> <int value="783443490" label="ArcInputOverlayBeta:enabled"/> <int value="785273919" label="CompositingBasedThrottling:disabled"/> + <int value="785795587" label="AndroidAppIntegrationSafeSearch:enabled"/> <int value="786070201" label="EcheSWAProcessAndroidAccessibilityTree:disabled"/> <int value="787080596" label="DynamicTcmallocTuning:enabled"/>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml index 485daf95..f4f93a0 100644 --- a/tools/metrics/histograms/metadata/content/histograms.xml +++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -766,8 +766,8 @@ </histogram> <histogram name="ContentSuggestions.Feed.ActivityLoggingEnabled" enum="Boolean" - expires_after="2023-07-23"> - <owner>rogerm@chromium.org</owner> + expires_after="2024-01-31"> + <owner>dewittj@chromium.org</owner> <owner>feed@chromium.org</owner> <summary> Whether the feed was fetched with activity logging enabled. This is logged
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml index b78529a..f4f2ba7 100644 --- a/tools/metrics/histograms/metadata/cookie/histograms.xml +++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -300,6 +300,19 @@ </summary> </histogram> +<histogram name="Cookie.ErrorInitializeDB" enum="SqliteLoggedResultCode" + expires_after="2023-11-12"> + <owner>wfh@chromium.org</owner> + <owner>src/net/cookies/OWNERS</owner> + <summary> + The exact database error encountered if initializing the cookies database + fails catastrophically. Initializing the cookies database happens once per + network context configured with persistent cookies, so this metric could be + reported multiple times from the same client. Catastrophic errors are + defined in sql::IsErrorCatastrophic. + </summary> +</histogram> + <histogram name="Cookie.ExpirationDuration400DaysGT" units="days" expires_after="2024-02-20"> <owner>arichiv@chromium.org</owner> @@ -909,6 +922,20 @@ <summary>For each cookie added to the store, record it's type(s).</summary> </histogram> +<histogram name="Cookie.WinGetLastErrorInitializeDB" enum="WinGetLastError" + expires_after="2023-11-12"> + <owner>wfh@chromium.org</owner> + <owner>src/net/cookies/OWNERS</owner> + <summary> + The result of calling ::GetLastError if initializing the cookies database + fails catastrophically. Initializing the cookies database happens once per + network context configured with persistent cookies, so this metric could be + reported multiple times from the same client. Catastrophic errors are + defined in sql::IsErrorCatastrophic. This metric is only reported on + Windows. + </summary> +</histogram> + </histograms> </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml index cc842c2..01ae883 100644 --- a/tools/metrics/histograms/metadata/gpu/histograms.xml +++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1398,17 +1398,6 @@ </summary> </histogram> -<histogram name="GPU.SupportsDisableMsaa" enum="BooleanSupported" - expires_after="2023-12-10"> - <owner>vasilyt@chromium.org</owner> - <owner>graphics-dev@chromium.org</owner> - <summary> - This metric records if we had support for non-aa draws with hardware MSAA - via GL_EXT_multisample_compatibility. Recorded once for each raster task - that had non-aa draw. - </summary> -</histogram> - <histogram name="GPU.SupportsDX12" enum="BooleanSupported" expires_after="2023-11-01"> <owner>magchen@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml index 3a43ad4..d1443491 100644 --- a/tools/metrics/histograms/metadata/omnibox/histograms.xml +++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -1515,6 +1515,16 @@ </summary> </histogram> +<histogram name="Omnibox.ScrollToTLD.Duration" units="ms" + expires_after="2023-08-12"> + <owner>peilinwang@google.com</owner> + <owner>woa-performance-bugs+jank@google.com</owner> + <summary> + Measures the amount of time it takes to call UrlBar.scrollToTLD(). Logged + once per call. + </summary> +</histogram> + <histogram name="Omnibox.Search.OffTheRecord" enum="BooleanOffTheRecord" expires_after="2024-02-01"> <owner>jdonnelly@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index ddd7a26a..cb0c26bb 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -10561,6 +10561,19 @@ </summary> </histogram> +<histogram name="ReportingAndNEL.ErrorInitializeDB" + enum="SqliteLoggedResultCode" expires_after="2023-11-12"> + <owner>wfh@chromium.org</owner> + <owner>src/net/reporting/OWNERS</owner> + <summary> + The exact database error encountered when initializing the Reporting and NEL + database, if initialization fails catastrophically. This is recorded if the + database initialization fails catastrophically when the DB initialization + attempt is made, which typically occurs upon the first network request after + startup. Catastrophic errors are defined in sql::IsErrorCatastrophic. + </summary> +</histogram> + <histogram name="ReportingAndNEL.NumberOfLoadedNELPolicies" units="policy count" expires_after="2023-06-25"> <owner>yhirano@chromium.org</owner> @@ -10618,6 +10631,19 @@ </summary> </histogram> +<histogram name="ReportingAndNEL.WinGetLastErrorInitializeDB" + enum="WinGetLastError" expires_after="2023-11-12"> + <owner>wfh@chromium.org</owner> + <owner>src/net/reporting/OWNERS</owner> + <summary> + The result of calling ::GetLastError() if initializing the Reporting and NEL + database fails catastrophically. This is recorded, on Windows only, if the + database initialization fails when the DB initialization attempt is made, + which typically occurs upon the first network request after startup. + Catastrophic errors are defined in sql::IsErrorCatastrophic. + </summary> +</histogram> + <histogram name="Reset.ChromeOS.PowerwashDialogShown" enum="PowerwashDialogViewType" expires_after="M77"> <owner>merkulova@chromium.org</owner>
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index bd31dd7..ca2270cef 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc
@@ -103,6 +103,17 @@ main_image_->SetVisible(false); subtitle_->SetVisible(false); + auto minimize = CreateMinimizeButton(base::BindRepeating( + [](BubbleFrameView* view, const ui::Event& event) { + if (view->input_protector_.IsPossiblyUnintendedInteraction(event)) + return; + view->GetWidget()->Minimize(); + }, + this)); + minimize->SetProperty(views::kElementIdentifierKey, kMinimizeButtonElementId); + minimize->SetVisible(false); + minimize_ = AddChildView(std::move(minimize)); + auto close = CreateCloseButton(base::BindRepeating( [](BubbleFrameView* view, const ui::Event& event) { if (view->input_protector_.IsPossiblyUnintendedInteraction(event)) @@ -115,17 +126,6 @@ close->SetVisible(false); close_ = AddChildView(std::move(close)); - auto minimize = CreateMinimizeButton(base::BindRepeating( - [](BubbleFrameView* view, const ui::Event& event) { - if (view->input_protector_.IsPossiblyUnintendedInteraction(event)) - return; - view->GetWidget()->Minimize(); - }, - this)); - minimize->SetProperty(views::kElementIdentifierKey, kMinimizeButtonElementId); - minimize->SetVisible(false); - minimize_ = AddChildView(std::move(minimize)); - auto progress_indicator = std::make_unique<ProgressBar>( kProgressIndicatorHeight, /*allow_round_corner=*/false); progress_indicator->SetBackgroundColor(SK_ColorTRANSPARENT);
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h index ce28272..d5070a209 100644 --- a/ui/views/bubble/bubble_frame_view.h +++ b/ui/views/bubble/bubble_frame_view.h
@@ -349,12 +349,12 @@ raw_ptr<Label> subtitle_ = nullptr; + // The optional minimize button (the _). + raw_ptr<Button> minimize_ = nullptr; + // The optional close button (the X). raw_ptr<Button> close_ = nullptr; - // The optional minimize button. - raw_ptr<Button> minimize_ = nullptr; - // The optional progress bar. Used to indicate bubble pending state. By // default it is invisible. raw_ptr<ProgressBar> progress_indicator_ = nullptr;
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc index d62a456..87473f24 100644 --- a/ui/views/bubble/bubble_frame_view_unittest.cc +++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -4,6 +4,7 @@ #include "ui/views/bubble/bubble_frame_view.h" +#include <algorithm> #include <memory> #include <utility> @@ -30,6 +31,7 @@ #include "ui/views/test/test_views.h" #include "ui/views/test/view_metadata_test_utils.h" #include "ui/views/test/views_test_base.h" +#include "ui/views/view_class_properties.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" #include "ui/views/widget/widget_interactive_uitest_utils.h" @@ -1470,4 +1472,27 @@ bubble->GetWindowBoundsInScreen().width()); } +// Close should be the next element after minimize. +TEST_F(BubbleFrameViewTest, MinimizeBeforeClose) { + auto delegate_unique = std::make_unique<TestBubbleDialogDelegateView>(); + TestBubbleDialogDelegateView* const delegate = delegate_unique.get(); + TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW)); + delegate->SetAnchorView(anchor.widget().GetContentsView()); + delegate->SetShouldShowCloseButton(true); + delegate->SetCanMinimize(true); + Widget* bubble = + BubbleDialogDelegateView::CreateBubble(std::move(delegate_unique)); + bubble->Show(); + + auto minimze_iter = std::find_if( + delegate->GetBubbleFrameView()->children().begin(), + delegate->GetBubbleFrameView()->children().end(), [](views::View* child) { + return child->GetProperty(views::kElementIdentifierKey) == + BubbleFrameView::kMinimizeButtonElementId; + }); + ASSERT_NE(minimze_iter, delegate->GetBubbleFrameView()->children().end()); + EXPECT_EQ((*++minimze_iter)->GetProperty(views::kElementIdentifierKey), + BubbleFrameView::kCloseButtonElementId); +} + } // namespace views
diff --git a/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts b/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts index 9aa5d40..1910687 100644 --- a/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts +++ b/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
@@ -20,8 +20,8 @@ let documentInstance: ColorChangeUpdater|null = null; // <if expr="chromeos_ash"> -const COLOR_PROVIDER_CHANGED: string = 'color-provider-changed'; -type ColorChangeListener = () => void; +// Event fired after updated colors have been fetched and applied. +export const COLOR_PROVIDER_CHANGED: string = 'color-provider-changed'; // </if> export class ColorChangeUpdater { @@ -115,18 +115,6 @@ } } -// <if expr="chromeos_ash"> -export function addColorChangeListener(listener: ColorChangeListener) { - ColorChangeUpdater.forDocument().eventTarget.addEventListener( - COLOR_PROVIDER_CHANGED, listener); -} - -export function removeColorChangeListener(listener: ColorChangeListener) { - ColorChangeUpdater.forDocument().eventTarget.removeEventListener( - COLOR_PROVIDER_CHANGED, listener); -} -// </if> - /** * Starts listening for ColorProvider changes from the browser and updates the * top level HTML document whenever changes occur.
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble.html b/ui/webui/resources/cr_components/help_bubble/help_bubble.html index 1e40d6e..6fa19eb 100644 --- a/ui/webui/resources/cr_components/help_bubble/help_bubble.html +++ b/ui/webui/resources/cr_components/help_bubble/help_bubble.html
@@ -1,6 +1,14 @@ <link rel="stylesheet" href="chrome://theme/colors.css?sets=ui,chrome&shadow_host=true"> <style include="cr-hidden-style"> :host { + /* Color declarations. + * TODO(crbug.com/1454258): Temporary fallback values for cases where + * colors.css and its colors are not available within the WebUI. */ + --help-bubble-background: var(--color-feature-promo-bubble-background, + var(--google-blue-700)); + --help-bubble-foreground: var(--color-feature-promo-bubble-foreground, + var(--google-grey-200)); + /* Variable declarations. Some of these will change for the 2023 refresh. */ --help-bubble-border-radius: 8px; --help-bubble-close-button-icon-size: 16px; @@ -41,7 +49,7 @@ /* #inner-arrow is rotated and positioned in a container to simplify * positioning */ #inner-arrow { - background-color: var(--color-feature-promo-bubble-background); + background-color: var(--help-bubble-background); height: var(--help-bubble-arrow-size); left: calc(0px - var(--help-bubble-arrow-size-half)); position: absolute; @@ -119,8 +127,8 @@ #progress div { --help-bubble-progress-size: 8px; - background-color: var(--color-feature-promo-bubble-foreground); - border: 1px solid var(--color-feature-promo-bubble-foreground); + background-color: var(--help-bubble-foreground); + border: 1px solid var(--help-bubble-foreground); border-radius: 50%; display: inline-block; height: var(--help-bubble-progress-size); @@ -130,7 +138,7 @@ } #progress .total-progress { - background-color: var(--color-feature-promo-bubble-background); + background-color: var(--help-bubble-background); } #topBody, @@ -154,11 +162,11 @@ } .help-bubble { - --cr-focus-outline-color: var(--color-feature-promo-bubble-foreground); - background-color: var(--color-feature-promo-bubble-background); + --cr-focus-outline-color: var(--help-bubble-foreground); + background-color: var(--help-bubble-background); border-radius: var(--help-bubble-border-radius); box-sizing: border-box; - color: var(--color-feature-promo-bubble-foreground); + color: var(--help-bubble-foreground); display: flex; flex-direction: column; justify-content: space-between; @@ -188,14 +196,18 @@ */ cr-icon-button, cr-button { - --help-bubble-button-foreground: var(--color-feature-promo-bubble-foreground); - --help-bubble-button-background: var(--color-feature-promo-bubble-background); + --help-bubble-button-foreground: var(--help-bubble-foreground); + --help-bubble-button-background: var(--help-bubble-background); --help-bubble-button-hover-alpha: 10%; } cr-button.default-button { - --help-bubble-button-foreground: var(--color-feature-promo-bubble-default-button-foreground); - --help-bubble-button-background: var(--color-feature-promo-bubble-default-button-background); + --help-bubble-button-foreground: var( + --color-feature-promo-bubble-default-button-foreground, + var(--help-bubble-background)); + --help-bubble-button-background: var( + --color-feature-promo-bubble-default-button-background, + var(--help-bubble-foreground)); --help-bubble-button-hover-alpha: 6%; } @@ -240,10 +252,10 @@ --help-bubble-body-icon-size: 24px; --iron-icon-height: var(--help-bubble-body-icon-image-size); --iron-icon-width: var(--help-bubble-body-icon-image-size); - background-color: var(--color-feature-promo-bubble-foreground); + background-color: var(--help-bubble-foreground); border-radius: 50%; box-sizing: border-box; - color: var(--color-feature-promo-bubble-background); + color: var(--help-bubble-background); height: var(--help-bubble-body-icon-size); margin-inline-end: var(--help-bubble-element-spacing); padding: calc((var(--help-bubble-body-icon-size) - @@ -264,14 +276,14 @@ } #buttons cr-button { - --border-color: var(--color-feature-promo-bubble-foreground); - --focus-shadow-color: var(--color-feature-promo-bubble-foreground); + --border-color: var(--help-bubble-foreground); + --focus-shadow-color: var(--help-bubble-foreground); --text-color: var(--help-bubble-button-foreground); background-color: var(--help-bubble-button-background); } #buttons cr-button:focus { - border: 2px solid var(--color-feature-promo-bubble-background); + border: 2px solid var(--help-bubble-background); padding: 7px 15px; }
diff --git a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html index 141c3813..402a291 100644 --- a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html +++ b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
@@ -141,9 +141,9 @@ :host-context([chrome-refresh-2023]):host(:focus-visible) #bar { background-clip: padding-box; - border-color: transparent; + border: none; outline: 2px solid var(--cr-toggle-checked-bar-color); - outline-offset: 1px; + outline-offset: 2px; } #knob {