diff --git a/DEPS b/DEPS index 3627356..f076cdc0 100644 --- a/DEPS +++ b/DEPS
@@ -209,7 +209,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'b2a2e7c9e3fe50a3a77a068ae6dd29661f4dcab4', + 'skia_revision': 'fa06f102f13bcfa94748ae2d9beb9f66ab4ce150', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -221,7 +221,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': '3b2ef1cdbecc0f83cd6191549dd4369bdc9b9d8e', + 'angle_revision': 'a766ab14edda8c0d0760364e6e3866a550d15986', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -229,7 +229,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': '88780c39d858d4a89e928a885299cfd942a095b5', + 'pdfium_revision': 'f115a5253d0699082058a1586d6b63fa998ba39e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -280,7 +280,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': '70ce64f4639423f995fb9172f25b68d546634bd4', + 'catapult_revision': '1b8cf3bcf95e50cafecc633a6f687ed16e3b2193', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -288,7 +288,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': 'eacc13c35821daac752d59480018e6573b13a5eb', + 'devtools_frontend_revision': '85c4713355a396eaae1b502df2bb589b32e1ac08', # 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. @@ -328,7 +328,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '963991a1074ca7ee86485937545165efaf1563c5', + 'dawn_revision': '4d5e02366a582a4e21d73ce1e58a47fb176e07ed', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -548,12 +548,12 @@ Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248', 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'aa4852822741a0cc59902469077376f84664b45d', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'bd4649d035b14a8ef54a686a0717122d529a4478', 'condition': 'checkout_ios', }, 'src/ios/third_party/edo/src': { - 'url': Var('chromium_git') + '/external/github.com/google/eDistantObject.git' + '@' + 'b9cfc0cb37060725f3e968c186e14e6172388546', + 'url': Var('chromium_git') + '/external/github.com/google/eDistantObject.git' + '@' + '73009d72eb528b1108d1540e3cd8d03d0b34280e', 'condition': 'checkout_ios', }, @@ -966,7 +966,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6234dd231719d51d565ca0d846cfaac6c72a2499', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '3a56ba9d9c9d22bc78e24f96a9096247d53649f8', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1338,7 +1338,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'ea617741a1bcc0951495c6f8fcee219e1fc563d0', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '424d8898471d8c779a0378ff6fb9117e1de3095e', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1416,7 +1416,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'DwlFUQdUj3INh9MLxAcJZ3wbIZfyV56T7mDDgiUWq3oC' + 'version': '3VMKWKF7CpMmSlkl7BVH47knjv3eZcJI9P0dGBoSB_YC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1549,10 +1549,10 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a0b8774ce8cec1dc8f4308810bf05eb8867c62de', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '267e0b71649664a27d79f23773f0bde9e0e1164f', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '34974c270a8740dcd63069fffa59741ab0416f1a', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'b2f8c1675d74b860c63f97a38e63f3578505391d', + Var('webrtc_git') + '/src.git' + '@' + '816b638048fb7cc5ba72968a59650b693b704101', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1613,7 +1613,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@efad8beeee3b28d639831c927fd97328cb571a4a', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@1e9aaa658f76d5548db117085a93bd74e62cdef4', 'condition': 'checkout_src_internal', }, @@ -1621,7 +1621,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/eche_app/app', - 'version': 'uQBANVE52z0ySq0IRBuva5HYP2xW-1un1_JVzs1pyGkC', + 'version': 'yY4G9__wVxlswvn7cNuQGTFi4WP3FitAGp1I_1AgGagC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4200,6 +4200,14 @@ '-s', 'src/third_party/gvr-android-sdk/test-libraries/controller_test_api.aar.sha1', ], }, + # Download and unpack MediaPipe Integration tests. + { + 'name': 'mediapipe_integration_testdata', + 'pattern': '.', + 'action': [ 'python', + 'src/content/test/gpu/gpu_tests/mediapipe_update.py', + ], + }, # Download VR test APKs only if the environment variable is set { 'name': 'vr_test_apks',
diff --git a/ash/ambient/ambient_photo_controller_unittest.cc b/ash/ambient/ambient_photo_controller_unittest.cc index 8ea15d87..94f4775b 100644 --- a/ash/ambient/ambient_photo_controller_unittest.cc +++ b/ash/ambient/ambient_photo_controller_unittest.cc
@@ -19,6 +19,7 @@ #include "base/base_paths.h" #include "base/bind.h" #include "base/callback.h" +#include "base/containers/contains.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -26,7 +27,6 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/scoped_observation.h" -#include "base/stl_util.h" #include "base/system/sys_info.h" #include "base/test/bind.h" #include "base/timer/timer.h"
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc index 556464d..d9a2e65 100644 --- a/ash/app_list/views/search_result_view.cc +++ b/ash/app_list/views/search_result_view.cc
@@ -151,11 +151,10 @@ for (const auto& tag : tags) { if (tag.styles & SearchResult::Tag::URL) { render_text->ApplyColor(kUrlColor, tag.range); - } else if (tag.styles & SearchResult::Tag::MATCH) { - render_text->ApplyColor( - AppListColorProvider::Get()->GetSearchBoxTextColor( - kDeprecatedSearchBoxTextDefaultColor), - tag.range); + } + if (tag.styles & SearchResult::Tag::MATCH && + app_list_features::IsLauncherQueryHighlightingEnabled()) { + render_text->ApplyWeight(gfx::Font::Weight::BOLD, tag.range); } } title_text_ = std::move(render_text); @@ -177,8 +176,13 @@ kDeprecatedSearchBoxTextDefaultColor)); const SearchResult::Tags& tags = result()->details_tags(); for (const auto& tag : tags) { - if (tag.styles & SearchResult::Tag::URL) + if (tag.styles & SearchResult::Tag::URL) { render_text->ApplyColor(kUrlColor, tag.range); + } + if (tag.styles & SearchResult::Tag::MATCH && + app_list_features::IsLauncherQueryHighlightingEnabled()) { + render_text->ApplyWeight(gfx::Font::Weight::BOLD, tag.range); + } } details_text_ = std::move(render_text); }
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index ee40fe0..d63dab2 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -3474,6 +3474,9 @@ <message name="IDS_ASH_MULTIPASTE_ZERO_STATE_CONTEXTUAL_NUDGE" desc="The label used for the zero state multipaste nudge, to be seen when there are no items on the clipboard and the user press the keyboard shortcut for multipaste."> Access your clipboard history by pressing <ph name="SHORTCUT_KEY_NAME">$1<ex>Launcher</ex></ph> + V to view your clipboard. Copy an item to get started. </message> + <message name="IDS_ASH_MULTIPASTE_SCREENSHOT_NOTIFICATION_NUDGE" desc="The label used to show the keyboard shortcut for multipaste, to be seen aside the screenshot notification banner which notifies the user that the screenshot has been copied to clipboard."> + + V + </message> <message name="IDS_APP_LIST_BLOCKED_APP" desc="The spoken feedback text when a focused app is blocked."> Blocked
diff --git a/ash/ash_strings_grd/IDS_ASH_MULTIPASTE_SCREENSHOT_NOTIFICATION_NUDGE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_MULTIPASTE_SCREENSHOT_NOTIFICATION_NUDGE.png.sha1 new file mode 100644 index 0000000..fa13f4cf2 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_MULTIPASTE_SCREENSHOT_NOTIFICATION_NUDGE.png.sha1
@@ -0,0 +1 @@ +629f0ea724a1360a89cf8e1692d66b2601b6ccdd \ No newline at end of file
diff --git a/ash/capture_mode/capture_mode_notification_view.cc b/ash/capture_mode/capture_mode_notification_view.cc index 07f5a6a..174237b1 100644 --- a/ash/capture_mode/capture_mode_notification_view.cc +++ b/ash/capture_mode/capture_mode_notification_view.cc
@@ -4,11 +4,15 @@ #include "ash/capture_mode/capture_mode_notification_view.h" +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/assistant/assistant_state.h" +#include "ash/public/cpp/clipboard_history_controller.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" #include "ash/style/scoped_light_mode_as_default.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/chromeos/events/keyboard_layout_util.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/background.h" #include "ui/views/layout/box_layout.h" @@ -30,6 +34,65 @@ constexpr int kPlayIconBackgroundCornerRadiusDip = 20; constexpr gfx::Size kPlayIconViewSize{40, 40}; +// The size of the keyboard shortcut icon. +constexpr int kKeyboardShortcutIconSize = 14; + +bool IsAssistantAvailable() { + AssistantStateBase* state = AssistantState::Get(); + return state->allowed_state() == + chromeos::assistant::AssistantAllowedState::ALLOWED && + state->settings_enabled().value_or(false); +} + +gfx::ImageSkia GetShortcutIcon(SkColor icon_color) { + // Set the keyboard shortcut icon depending on whether search button or + // launcher button is being used. + const bool use_launcher_key = ui::DeviceUsesKeyboardLayout2(); + + if (!use_launcher_key) { + return gfx::CreateVectorIcon(kClipboardSearchIcon, + kKeyboardShortcutIconSize, icon_color); + } + + if (IsAssistantAvailable()) { + return gfx::CreateVectorIcon(gfx::IconDescription( + kClipboardLauncherOuterIcon, kKeyboardShortcutIconSize, icon_color, + &kClipboardLauncherInnerIcon)); + } + + return gfx::CreateVectorIcon(kClipboardLauncherNoAssistantIcon, + kKeyboardShortcutIconSize, icon_color); +} + +std::unique_ptr<views::View> CreateClipboardShortcutView() { + std::unique_ptr<views::View> clipboard_shortcut_view = + std::make_unique<views::View>(); + + auto* color_provider = AshColorProvider::Get(); + const SkColor background_color = color_provider->GetControlsLayerColor( + AshColorProvider::ControlsLayerType::kControlBackgroundColorActive); + // The text and icon are showing on the background with |background_color| + // so its color is same with kButtonLabelColorPrimary although they're + // not theoretically showing on a button. + const SkColor text_icon_color = color_provider->GetContentLayerColor( + AshColorProvider::ContentLayerType::kButtonLabelColorPrimary); + clipboard_shortcut_view->SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal)); + + gfx::ImageSkia shortcut_icon = GetShortcutIcon(text_icon_color); + auto* keyboard_shortcut_icon = clipboard_shortcut_view->AddChildView( + std::make_unique<views::ImageView>()); + keyboard_shortcut_icon->SetImage(shortcut_icon); + + views::Label* shortcut_label = clipboard_shortcut_view->AddChildView( + std::make_unique<views::Label>(l10n_util::GetStringUTF16( + IDS_ASH_MULTIPASTE_SCREENSHOT_NOTIFICATION_NUDGE))); + shortcut_label->SetBackgroundColor(background_color); + shortcut_label->SetEnabledColor(text_icon_color); + ClipboardHistoryController::Get()->MarkScreenshotNotificationNudgeShown(); + return clipboard_shortcut_view; +} + // Creates the banner view that will show on top of the notification image. std::unique_ptr<views::View> CreateBannerView() { std::unique_ptr<views::View> banner_view = std::make_unique<views::View>(); @@ -46,11 +109,11 @@ // not theoretically showing on a button. const SkColor text_icon_color = color_provider->GetContentLayerColor( AshColorProvider::ContentLayerType::kButtonLabelColorPrimary); - auto layout = std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, - gfx::Insets(kBannerVerticalInsetDip, kBannerHorizontalInsetDip), - kBannerIconTextSpacingDip); - banner_view->SetLayoutManager(std::move(layout)); + auto* layout = + banner_view->SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal, + gfx::Insets(kBannerVerticalInsetDip, kBannerHorizontalInsetDip), + kBannerIconTextSpacingDip)); banner_view->SetBackground(views::CreateSolidBackground(background_color)); views::ImageView* icon = @@ -62,8 +125,14 @@ std::make_unique<views::Label>(l10n_util::GetStringUTF16( IDS_ASH_SCREEN_CAPTURE_SCREENSHOT_COPIED_TO_CLIPBOARD))); label->SetBackgroundColor(background_color); + label->SetHorizontalAlignment(gfx::ALIGN_LEFT); label->SetEnabledColor(text_icon_color); + if (features::IsClipboardHistoryScreenshotNudgeEnabled()) { + banner_view->AddChildView(CreateClipboardShortcutView()); + layout->SetFlexForView(label, 1); + } + return banner_view; }
diff --git a/ash/clipboard/clipboard_history_controller_impl.cc b/ash/clipboard/clipboard_history_controller_impl.cc index 0a0ae80..c9dcd18 100644 --- a/ash/clipboard/clipboard_history_controller_impl.cc +++ b/ash/clipboard/clipboard_history_controller_impl.cc
@@ -287,6 +287,10 @@ nudge_controller_->MarkNewFeatureBadgeShown(); } +void ClipboardHistoryControllerImpl::MarkScreenshotNotificationNudgeShown() { + nudge_controller_->MarkScreenshotNotificationNudgeShown(); +} + bool ClipboardHistoryControllerImpl::CanShowMenu() const { return !IsEmpty() && ClipboardHistoryUtil::IsEnabledInCurrentMode(); }
diff --git a/ash/clipboard/clipboard_history_controller_impl.h b/ash/clipboard/clipboard_history_controller_impl.h index b60d96f..69ce862 100644 --- a/ash/clipboard/clipboard_history_controller_impl.h +++ b/ash/clipboard/clipboard_history_controller_impl.h
@@ -110,6 +110,7 @@ bool CanShowMenu() const override; bool ShouldShowNewFeatureBadge() const override; void MarkNewFeatureBadgeShown() override; + void MarkScreenshotNotificationNudgeShown() override; std::unique_ptr<ScopedClipboardHistoryPause> CreateScopedPause() override; base::Value GetHistoryValues( const std::set<std::string>& item_id_filter) const override;
diff --git a/ash/clipboard/clipboard_nudge_constants.h b/ash/clipboard/clipboard_nudge_constants.h index 2e71dce..511aabb 100644 --- a/ash/clipboard/clipboard_nudge_constants.h +++ b/ash/clipboard/clipboard_nudge_constants.h
@@ -19,6 +19,9 @@ kZeroStateNudge = 1, // Blue new feature badge for clipboard history's context menu option. kNewFeatureBadge = 2, + // Shows the keyboard shortcut for clipboard history in the screenshot + // notification nudge. + kScreenshotNotificationNudge = 3, }; const char kOnboardingNudge_ShowCount[] = @@ -39,6 +42,13 @@ "Ash.ClipboardHistory.Nudges.NewFeatureBadge.ToFeatureOpenTime"; const char kNewBadge_PasteTime[] = "Ash.ClipboardHistory.Nudges.NewFeatureBadge.ToFeaturePasteTime"; +const char kScreenshotNotification_ShowCount[] = + "Ash.ClipboardHistory.Nudges.ScreenshotNotificationNudge.ShownCount"; +const char kScreenshotNotification_OpenTime[] = + "Ash.ClipboardHistory.Nudges.ScreenshotNotificationNudge.ToFeatureOpenTime"; +const char kScreenshotNotification_PasteTime[] = + "Ash.ClipboardHistory.Nudges.ScreenshotNotificationNudge." + "ToFeaturePasteTime"; constexpr int kNotificationLimit = 3; constexpr int kContextMenuBadgeShowLimit = 3;
diff --git a/ash/clipboard/clipboard_nudge_controller.cc b/ash/clipboard/clipboard_nudge_controller.cc index d6a2a7f..23a5a1d 100644 --- a/ash/clipboard/clipboard_nudge_controller.cc +++ b/ash/clipboard/clipboard_nudge_controller.cc
@@ -37,6 +37,40 @@ // Clock that can be overridden for testing. base::Clock* g_clock_override = nullptr; + +base::Time GetTime() { + if (g_clock_override) + return g_clock_override->Now(); + return base::Time::Now(); +} + +bool LogFeatureOpenTime( + const ClipboardNudgeController::TimeMetricHelper& metric_show_time, + const std::string& open_histogram) { + if (!metric_show_time.ShouldLogFeatureOpenTime()) + return false; + base::TimeDelta time_since_shown = + metric_show_time.GetTimeSinceShown(GetTime()); + // Tracks the amount of time between showing the user a nudge and + // the user opening the ClipboardHistory menu. + base::UmaHistogramExactLinear(open_histogram, time_since_shown.InSeconds(), + kMaxSeconds); + return true; +} + +bool LogFeatureUsedTime( + const ClipboardNudgeController::TimeMetricHelper& metric_show_time, + const std::string& paste_histogram) { + if (!metric_show_time.ShouldLogFeatureUsedTime()) + return false; + base::TimeDelta time_since_shown = + metric_show_time.GetTimeSinceShown(GetTime()); + // Tracks the amount of time between showing the user a nudge and + // the user opening the ClipboardHistory menu. + base::UmaHistogramExactLinear(paste_histogram, time_since_shown.InSeconds(), + kMaxSeconds); + return true; +} } // namespace // A class for observing the clipboard nudge fade out animation. Once the fade @@ -139,6 +173,19 @@ new_feature_last_shown_time_.ResetTime(); } +void ClipboardNudgeController::MarkScreenshotNotificationNudgeShown() { + base::UmaHistogramBoolean(kScreenshotNotification_ShowCount, true); + if (screenshot_notification_last_shown_time_.ShouldLogFeatureOpenTime()) { + base::UmaHistogramExactLinear(kScreenshotNotification_OpenTime, kMaxSeconds, + kMaxSeconds); + } + if (screenshot_notification_last_shown_time_.ShouldLogFeatureUsedTime()) { + base::UmaHistogramExactLinear(kScreenshotNotification_PasteTime, + kMaxSeconds, kMaxSeconds); + } + screenshot_notification_last_shown_time_.ResetTime(); +} + bool ClipboardNudgeController::ShouldShowNewFeatureBadge() { PrefService* prefs = Shell::Get()->session_controller()->GetLastActiveUserPrefService(); @@ -300,78 +347,41 @@ void ClipboardNudgeController::OnClipboardHistoryMenuShown( crosapi::mojom::ClipboardHistoryControllerShowSource show_source) { - if (last_shown_time_.ShouldLogFeatureOpenTime()) { - base::TimeDelta time_since_shown = - last_shown_time_.GetTimeSinceShown(GetTime()); - - // Tracks the amount of time between showing the user a nudge and the user - // opening the ClipboardHistory menu. - base::UmaHistogramExactLinear(kOnboardingNudge_OpenTime, - time_since_shown.InSeconds(), kMaxSeconds); + if (LogFeatureOpenTime(last_shown_time_, kOnboardingNudge_OpenTime)) last_shown_time_.set_was_logged_as_opened(); - } - if (new_feature_last_shown_time_.ShouldLogFeatureOpenTime()) { - switch (show_source) { - case crosapi::mojom::ClipboardHistoryControllerShowSource::kAccelerator: - case crosapi::mojom::ClipboardHistoryControllerShowSource:: - kVirtualKeyboard: - case crosapi::mojom::ClipboardHistoryControllerShowSource::kUnknown: - break; - case crosapi::mojom::ClipboardHistoryControllerShowSource:: - kRenderViewContextMenu: - case crosapi::mojom::ClipboardHistoryControllerShowSource:: - kTextfieldContextMenu: - base::TimeDelta time_since_shown = - new_feature_last_shown_time_.GetTimeSinceShown(GetTime()); - // Tracks the amount of time between showing the user the new badge and - // the user opening the ClipboardHistory menu. - base::UmaHistogramExactLinear( - kNewBadge_OpenTime, time_since_shown.InSeconds(), kMaxSeconds); + switch (show_source) { + case crosapi::mojom::ClipboardHistoryControllerShowSource::kAccelerator: + case crosapi::mojom::ClipboardHistoryControllerShowSource::kVirtualKeyboard: + case crosapi::mojom::ClipboardHistoryControllerShowSource::kUnknown: + break; + case crosapi::mojom::ClipboardHistoryControllerShowSource:: + kRenderViewContextMenu: + case crosapi::mojom::ClipboardHistoryControllerShowSource:: + kTextfieldContextMenu: + if (LogFeatureOpenTime(new_feature_last_shown_time_, kNewBadge_OpenTime)) new_feature_last_shown_time_.set_was_logged_as_opened(); - break; - } } - if (zero_state_last_shown_time_.ShouldLogFeatureOpenTime()) { - base::TimeDelta time_since_shown = - zero_state_last_shown_time_.GetTimeSinceShown(GetTime()); - // Tracks the amount of time between showing the user a zero state nudge and - // the user opening the ClipboardHistory menu. - base::UmaHistogramExactLinear(kZeroStateNudge_OpenTime, - time_since_shown.InSeconds(), kMaxSeconds); + if (LogFeatureOpenTime(zero_state_last_shown_time_, kZeroStateNudge_OpenTime)) zero_state_last_shown_time_.set_was_logged_as_opened(); + if (LogFeatureOpenTime(screenshot_notification_last_shown_time_, + kScreenshotNotification_OpenTime)) { + screenshot_notification_last_shown_time_.set_was_logged_as_opened(); } } void ClipboardNudgeController::OnClipboardHistoryPasted() { - if (last_shown_time_.ShouldLogFeatureUsedTime()) { - base::TimeDelta time_since_shown = - last_shown_time_.GetTimeSinceShown(GetTime()); - - // Tracks the amount of time between showing the user a nudge and the user - // using the ClipboardHistory feature. - base::UmaHistogramExactLinear(kOnboardingNudge_PasteTime, - time_since_shown.InSeconds(), kMaxSeconds); + if (LogFeatureUsedTime(last_shown_time_, kOnboardingNudge_PasteTime)) last_shown_time_.set_was_logged_as_used(); - } - if (new_feature_last_shown_time_.ShouldLogFeatureUsedTime()) { - base::TimeDelta time_since_shown = - new_feature_last_shown_time_.GetTimeSinceShown(GetTime()); - // Tracks the amount of time between showing the user a new badge and the - // user using the ClipboardHistory feature. - base::UmaHistogramExactLinear(kNewBadge_PasteTime, - time_since_shown.InSeconds(), kMaxSeconds); + if (LogFeatureUsedTime(new_feature_last_shown_time_, kNewBadge_PasteTime)) new_feature_last_shown_time_.set_was_logged_as_used(); - } - if (zero_state_last_shown_time_.ShouldLogFeatureUsedTime()) { - base::TimeDelta time_since_shown = - zero_state_last_shown_time_.GetTimeSinceShown(GetTime()); - - // Tracks the amount of time between showing the user a nudge and the user - // using the ClipboardHistory feature. - base::UmaHistogramExactLinear(kZeroStateNudge_PasteTime, - time_since_shown.InSeconds(), kMaxSeconds); + if (LogFeatureUsedTime(zero_state_last_shown_time_, + kZeroStateNudge_PasteTime)) { zero_state_last_shown_time_.set_was_logged_as_used(); } + if (LogFeatureUsedTime(screenshot_notification_last_shown_time_, + kScreenshotNotification_PasteTime)) { + screenshot_notification_last_shown_time_.set_was_logged_as_used(); + } } void ClipboardNudgeController::ForceCloseAnimatingNudge() {
diff --git a/ash/clipboard/clipboard_nudge_controller.h b/ash/clipboard/clipboard_nudge_controller.h index 8d42f176..e1e5b4a6 100644 --- a/ash/clipboard/clipboard_nudge_controller.h +++ b/ash/clipboard/clipboard_nudge_controller.h
@@ -42,6 +42,25 @@ public SessionObserver, public ClipboardHistoryController::Observer { public: + class TimeMetricHelper { + public: + TimeMetricHelper() = default; + TimeMetricHelper(const TimeMetricHelper&) = delete; + TimeMetricHelper& operator=(const TimeMetricHelper&) = delete; + ~TimeMetricHelper() = default; + + bool ShouldLogFeatureUsedTime() const; + bool ShouldLogFeatureOpenTime() const; + base::TimeDelta GetTimeSinceShown(base::Time current_time) const; + void ResetTime(); + void set_was_logged_as_used() { was_logged_as_used_ = true; } + void set_was_logged_as_opened() { was_logged_as_opened_ = true; } + + private: + base::Time last_shown_time_; + bool was_logged_as_used_ = false; + bool was_logged_as_opened_ = false; + }; ClipboardNudgeController( ClipboardHistory* clipboard_history, ClipboardHistoryControllerImpl* clipboard_history_controller); @@ -71,6 +90,9 @@ // Increment the 'new' feature badge shown count. void MarkNewFeatureBadgeShown(); + // Increment the screenshot notification nudge shown count. + void MarkScreenshotNotificationNudgeShown(); + // ClipboardHistoryControllerImpl: void OnClipboardHistoryMenuShown( crosapi::mojom::ClipboardHistoryControllerShowSource show_source) @@ -94,25 +116,6 @@ void FireHideNudgeTimerForTesting(); private: - class TimeMetricHelper { - public: - TimeMetricHelper() = default; - TimeMetricHelper(const TimeMetricHelper&) = delete; - TimeMetricHelper& operator=(const TimeMetricHelper&) = delete; - ~TimeMetricHelper() = default; - - bool ShouldLogFeatureUsedTime() const; - bool ShouldLogFeatureOpenTime() const; - base::TimeDelta GetTimeSinceShown(base::Time current_time) const; - void ResetTime(); - void set_was_logged_as_used() { was_logged_as_used_ = true; } - void set_was_logged_as_opened() { was_logged_as_opened_ = true; } - - private: - base::Time last_shown_time_; - bool was_logged_as_used_ = false; - bool was_logged_as_opened_ = false; - }; // Gets the number of times the nudge has been shown. int GetShownCount(PrefService* prefs); // Gets the last time the nudge was shown. @@ -139,6 +142,9 @@ // Time the new feature badge was last shown. TimeMetricHelper new_feature_last_shown_time_; + // Time the screenshot notification nudge was last shown. + TimeMetricHelper screenshot_notification_last_shown_time_; + // Owned by ClipboardHistoryController. const ClipboardHistory* clipboard_history_;
diff --git a/ash/clipboard/clipboard_nudge_controller_unittest.cc b/ash/clipboard/clipboard_nudge_controller_unittest.cc index 6ce63d0a..1f810f1b 100644 --- a/ash/clipboard/clipboard_nudge_controller_unittest.cc +++ b/ash/clipboard/clipboard_nudge_controller_unittest.cc
@@ -92,6 +92,9 @@ case ClipboardNudgeType::kNewFeatureBadge: nudge_controller_->MarkNewFeatureBadgeShown(); return; + case ClipboardNudgeType::kScreenshotNotificationNudge: + nudge_controller_->MarkScreenshotNotificationNudgeShown(); + return; } } @@ -306,6 +309,8 @@ histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 0); histograms().ExpectTotalCount(kNewBadge_OpenTime, 0); histograms().ExpectTotalCount(kNewBadge_PasteTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 0); } // Test that opening the clipboard history after showing the nudges logs only @@ -315,6 +320,7 @@ ShowNudgeForType(ClipboardNudgeType::kOnboardingNudge); ShowNudgeForType(ClipboardNudgeType::kZeroStateNudge); ShowNudgeForType(ClipboardNudgeType::kNewFeatureBadge); + ShowNudgeForType(ClipboardNudgeType::kScreenshotNotificationNudge); nudge_controller_->OnClipboardHistoryMenuShown( crosapi::mojom::ClipboardHistoryControllerShowSource:: kRenderViewContextMenu); @@ -322,9 +328,11 @@ histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 1); histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 1); histograms().ExpectTotalCount(kNewBadge_OpenTime, 1); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 1); histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 0); histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 0); histograms().ExpectTotalCount(kNewBadge_PasteTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 0); } // Test that pasting something from the clipboard history after showing the @@ -334,6 +342,7 @@ ShowNudgeForType(ClipboardNudgeType::kOnboardingNudge); ShowNudgeForType(ClipboardNudgeType::kZeroStateNudge); ShowNudgeForType(ClipboardNudgeType::kNewFeatureBadge); + ShowNudgeForType(ClipboardNudgeType::kScreenshotNotificationNudge); nudge_controller_->OnClipboardHistoryMenuShown( crosapi::mojom::ClipboardHistoryControllerShowSource:: kRenderViewContextMenu); @@ -342,9 +351,11 @@ histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 1); histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 1); histograms().ExpectTotalCount(kNewBadge_OpenTime, 1); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 1); histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 1); histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 1); histograms().ExpectTotalCount(kNewBadge_PasteTime, 1); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 1); } // Test that the onboarding nudge being shown only logs the metrics for the @@ -359,9 +370,11 @@ histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 1); histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 0); histograms().ExpectTotalCount(kNewBadge_OpenTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 0); histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 1); histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 0); histograms().ExpectTotalCount(kNewBadge_PasteTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 0); } // Test that the zero state nudge being shown only logs the metrics for the zero @@ -376,9 +389,11 @@ histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 0); histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 1); histograms().ExpectTotalCount(kNewBadge_OpenTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 0); histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 0); histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 1); histograms().ExpectTotalCount(kNewBadge_PasteTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 0); } // Test that the new feature badge being shown only logs the metrics for the new @@ -393,9 +408,31 @@ histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 0); histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 0); histograms().ExpectTotalCount(kNewBadge_OpenTime, 1); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 0); histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 0); histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 0); histograms().ExpectTotalCount(kNewBadge_PasteTime, 1); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 0); +} + +// Test that the screenshot notification nudge being shown only logs the metrics +// for the screenshot notification nudge histograms, +TEST_F(ClipboardNudgeControllerTest, + ScreenshotNotification_DoesNotLogOtherMetrics) { + ShowNudgeForType(ClipboardNudgeType::kScreenshotNotificationNudge); + nudge_controller_->OnClipboardHistoryMenuShown( + crosapi::mojom::ClipboardHistoryControllerShowSource:: + kRenderViewContextMenu); + nudge_controller_->OnClipboardHistoryPasted(); + + histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 0); + histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 0); + histograms().ExpectTotalCount(kNewBadge_OpenTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 1); + histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 0); + histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 0); + histograms().ExpectTotalCount(kNewBadge_PasteTime, 0); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 1); } // Test that nudge metrics will not log multiple times if the nudges are not @@ -404,6 +441,7 @@ ShowNudgeForType(ClipboardNudgeType::kOnboardingNudge); ShowNudgeForType(ClipboardNudgeType::kZeroStateNudge); ShowNudgeForType(ClipboardNudgeType::kNewFeatureBadge); + ShowNudgeForType(ClipboardNudgeType::kScreenshotNotificationNudge); nudge_controller_->OnClipboardHistoryMenuShown( crosapi::mojom::ClipboardHistoryControllerShowSource:: kRenderViewContextMenu); @@ -416,9 +454,11 @@ histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 1); histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 1); histograms().ExpectTotalCount(kNewBadge_OpenTime, 1); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 1); histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 1); histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 1); histograms().ExpectTotalCount(kNewBadge_PasteTime, 1); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 1); } // Test that nudge metrics can log more times as the nudges are shown before. @@ -426,6 +466,7 @@ ShowNudgeForType(ClipboardNudgeType::kOnboardingNudge); ShowNudgeForType(ClipboardNudgeType::kZeroStateNudge); ShowNudgeForType(ClipboardNudgeType::kNewFeatureBadge); + ShowNudgeForType(ClipboardNudgeType::kScreenshotNotificationNudge); nudge_controller_->OnClipboardHistoryMenuShown( crosapi::mojom::ClipboardHistoryControllerShowSource:: kRenderViewContextMenu); @@ -433,6 +474,7 @@ ShowNudgeForType(ClipboardNudgeType::kOnboardingNudge); ShowNudgeForType(ClipboardNudgeType::kZeroStateNudge); ShowNudgeForType(ClipboardNudgeType::kNewFeatureBadge); + ShowNudgeForType(ClipboardNudgeType::kScreenshotNotificationNudge); nudge_controller_->OnClipboardHistoryMenuShown( crosapi::mojom::ClipboardHistoryControllerShowSource:: kRenderViewContextMenu); @@ -441,9 +483,11 @@ histograms().ExpectTotalCount(kOnboardingNudge_OpenTime, 2); histograms().ExpectTotalCount(kZeroStateNudge_OpenTime, 2); histograms().ExpectTotalCount(kNewBadge_OpenTime, 2); + histograms().ExpectTotalCount(kScreenshotNotification_OpenTime, 2); histograms().ExpectTotalCount(kOnboardingNudge_PasteTime, 2); histograms().ExpectTotalCount(kZeroStateNudge_PasteTime, 2); histograms().ExpectTotalCount(kNewBadge_PasteTime, 2); + histograms().ExpectTotalCount(kScreenshotNotification_PasteTime, 2); } // For the new feature badge, metrics should only log for opening a menu by a
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 532cd0b..f035ab9 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -402,6 +402,11 @@ const base::Feature kClipboardHistoryContextMenuNudge{ "ClipboardHistoryContextMenuNudge", base::FEATURE_DISABLED_BY_DEFAULT}; +// If enabled, the clipboard history shortcut will appear in screenshot +// notifications. +const base::Feature kClipboardHistoryScreenshotNudge{ + "ClipboardHistoryScreenshotNudge", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables copying an image to the system clipboard to support pasting onto // different surfaces const base::Feature kEnableFilesAppCopyImage{"EnableFilesAppCopyImage", @@ -863,6 +868,10 @@ return base::FeatureList::IsEnabled(kClipboardHistoryContextMenuNudge); } +bool IsClipboardHistoryScreenshotNudgeEnabled() { + return base::FeatureList::IsEnabled(kClipboardHistoryScreenshotNudge); +} + bool IsPciguardUiEnabled() { return base::FeatureList::IsEnabled(kEnablePciguardUi); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 37205c6c..cf0248a 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -176,6 +176,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kClipboardHistoryContextMenuNudge; COMPONENT_EXPORT(ASH_CONSTANTS) +extern const base::Feature kClipboardHistoryScreenshotNudge; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEnableFilesAppCopyImage; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kFsNosymfollow; COMPONENT_EXPORT(ASH_CONSTANTS) @@ -351,6 +353,8 @@ bool IsClipboardHistoryContextMenuNudgeEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsClipboardHistoryEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) +bool IsClipboardHistoryScreenshotNudgeEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) bool IsClipboardHistoryNudgeSessionResetEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeSWAEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeepLinkingEnabled();
diff --git a/ash/public/cpp/app_list/app_list_features.cc b/ash/public/cpp/app_list/app_list_features.cc index e0816186..665cd2d1 100644 --- a/ash/public/cpp/app_list/app_list_features.cc +++ b/ash/public/cpp/app_list/app_list_features.cc
@@ -53,6 +53,8 @@ "EnableLauncherSearchNormalization", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kCategoricalSearch{"CategoricalSearch", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kLauncherQueryHighlighting{ + "LauncherQueryHighlighting", base::FEATURE_DISABLED_BY_DEFAULT}; bool IsAppDataSearchEnabled() { return base::FeatureList::IsEnabled(kEnableAppDataSearch); @@ -138,6 +140,10 @@ return base::FeatureList::IsEnabled(kCategoricalSearch); } +bool IsLauncherQueryHighlightingEnabled() { + return base::FeatureList::IsEnabled(kLauncherQueryHighlighting); +} + std::string CategoricalSearchType() { return GetFieldTrialParamValueByFeature(kCategoricalSearch, "ranking"); }
diff --git a/ash/public/cpp/app_list/app_list_features.h b/ash/public/cpp/app_list/app_list_features.h index c249eed..84ba2fb 100644 --- a/ash/public/cpp/app_list/app_list_features.h +++ b/ash/public/cpp/app_list/app_list_features.h
@@ -79,9 +79,12 @@ // Enables normalization of search results in the launcher. ASH_PUBLIC_EXPORT extern const base::Feature kEnableLauncherSearchNormalization; -// Enables normalization of search results in the launcher. +// Enables categorical search in the launcher. ASH_PUBLIC_EXPORT extern const base::Feature kCategoricalSearch; +// Enables search query highlighting in the launcher. +ASH_PUBLIC_EXPORT extern const base::Feature kLauncherQueryHighlighting; + bool ASH_PUBLIC_EXPORT IsAppDataSearchEnabled(); bool ASH_PUBLIC_EXPORT IsAppListSearchAutocompleteEnabled(); bool ASH_PUBLIC_EXPORT IsAppRankerEnabled(); @@ -101,6 +104,7 @@ bool ASH_PUBLIC_EXPORT IsOmniboxRichEntitiesEnabled(); bool ASH_PUBLIC_EXPORT IsLauncherSearchNormalizationEnabled(); bool ASH_PUBLIC_EXPORT IsCategoricalSearchEnabled(); +bool ASH_PUBLIC_EXPORT IsLauncherQueryHighlightingEnabled(); std::string ASH_PUBLIC_EXPORT AnswerServerUrl(); std::string ASH_PUBLIC_EXPORT AnswerServerQuerySuffix();
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc index 59d6dc9d..4590922 100644 --- a/ash/public/cpp/ash_features.cc +++ b/ash/public/cpp/ash_features.cc
@@ -132,6 +132,9 @@ const base::Feature kTemporaryHoldingSpace{"TemporaryHoldingSpace", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kTemporaryHoldingSpaceArcIntegration{ + "TemporaryHoldingSpaceArcIntegration", base::FEATURE_ENABLED_BY_DEFAULT}; + const base::Feature kDragUnpinnedAppToPin{"DragUnpinnedAppToPin", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -302,6 +305,11 @@ return base::FeatureList::IsEnabled(kTemporaryHoldingSpace); } +bool IsTemporaryHoldingSpaceArcIntegrationEnabled() { + return IsTemporaryHoldingSpaceEnabled() && + base::FeatureList::IsEnabled(kTemporaryHoldingSpaceArcIntegration); +} + bool IsDragUnpinnedAppToPinEnabled() { return base::FeatureList::IsEnabled(kDragUnpinnedAppToPin); }
diff --git a/ash/public/cpp/ash_features.h b/ash/public/cpp/ash_features.h index 4f0c8a1..b62f6f3 100644 --- a/ash/public/cpp/ash_features.h +++ b/ash/public/cpp/ash_features.h
@@ -177,11 +177,16 @@ // Enables notifications to be shown within context menus. ASH_PUBLIC_EXPORT extern const base::Feature kNotificationsInContextMenu; -// Enables the experimental productivity feature that aims to reduce context -// switching by enabling users to collect content and transfer or access it -// later. +// Enables the productivity feature that aims to reduce context switching by +// enabling users to collect content and transfer or access it later. ASH_PUBLIC_EXPORT extern const base::Feature kTemporaryHoldingSpace; +// Enables ARC integration with the productivity feature that aims to reduce +// context switching by enabling users to collect content and transfer or access +// it later. Note that this flag has no effect w/o `kTemporaryHoldingSpace`. +ASH_PUBLIC_EXPORT extern const base::Feature + kTemporaryHoldingSpaceArcIntegration; + // Enables dragging an unpinned open app to pinned app side to pin. ASH_PUBLIC_EXPORT extern const base::Feature kDragUnpinnedAppToPin; @@ -263,6 +268,8 @@ ASH_PUBLIC_EXPORT bool IsTemporaryHoldingSpaceEnabled(); +ASH_PUBLIC_EXPORT bool IsTemporaryHoldingSpaceArcIntegrationEnabled(); + ASH_PUBLIC_EXPORT bool IsDragUnpinnedAppToPinEnabled(); ASH_PUBLIC_EXPORT bool IsScalableStatusAreaEnabled();
diff --git a/ash/public/cpp/clipboard_history_controller.h b/ash/public/cpp/clipboard_history_controller.h index 742b9f41..09020be 100644 --- a/ash/public/cpp/clipboard_history_controller.h +++ b/ash/public/cpp/clipboard_history_controller.h
@@ -69,6 +69,9 @@ // Increment the 'new' feature badge shown count. virtual void MarkNewFeatureBadgeShown() = 0; + // Increment the screenshot notification nudge shown count. + virtual void MarkScreenshotNotificationNudgeShown() = 0; + // Creates a ScopedClipboardHistoryPause, which pauses ClipboardHistory for // its lifetime. virtual std::unique_ptr<ScopedClipboardHistoryPause> CreateScopedPause() = 0;
diff --git a/ash/public/cpp/holding_space/holding_space_item.cc b/ash/public/cpp/holding_space/holding_space_item.cc index b5212cf..ff0a74347 100644 --- a/ash/public/cpp/holding_space/holding_space_item.cc +++ b/ash/public/cpp/holding_space/holding_space_item.cc
@@ -56,6 +56,20 @@ } // static +bool HoldingSpaceItem::IsDownload(HoldingSpaceItem::Type type) { + switch (type) { + case Type::kArcDownload: + case Type::kDownload: + return true; + case Type::kNearbyShare: + case Type::kPinnedFile: + case Type::kScreenRecording: + case Type::kScreenshot: + return false; + } +} + +// static // NOTE: This method must remain in sync with `Serialize()`. If multiple // serialization versions are supported, care must be taken to handle each. std::unique_ptr<HoldingSpaceItem> HoldingSpaceItem::Deserialize(
diff --git a/ash/public/cpp/holding_space/holding_space_item.h b/ash/public/cpp/holding_space/holding_space_item.h index ae8c26fb..4d93affe 100644 --- a/ash/public/cpp/holding_space/holding_space_item.h +++ b/ash/public/cpp/holding_space/holding_space_item.h
@@ -58,6 +58,9 @@ const GURL& file_system_url, ImageResolver image_resolver); + // Returns `true` if `type` is a download type, `false` otherwise. + static bool IsDownload(HoldingSpaceItem::Type type); + // Deserializes from `base::DictionaryValue` to `HoldingSpaceItem`. // This creates a partially initialized item with an empty file system URL. // The item should be finalized using `Finalize()`.
diff --git a/ash/system/ime_menu/ime_list_view.cc b/ash/system/ime_menu/ime_list_view.cc index 3b6c69b..35536726 100644 --- a/ash/system/ime_menu/ime_list_view.cc +++ b/ash/system/ime_menu/ime_list_view.cc
@@ -383,6 +383,8 @@ ImeListViewTestApi::~ImeListViewTestApi() = default; views::View* ImeListViewTestApi::GetToggleView() const { + if (!ime_list_view_->keyboard_status_row_) + return nullptr; return ime_list_view_->keyboard_status_row_->toggle(); }
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc index 99ded39..cc426f2 100644 --- a/ash/system/ime_menu/ime_menu_tray.cc +++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -485,10 +485,10 @@ void ImeMenuTray::OnIMERefresh() { UpdateTrayLabel(); if (bubble_ && ime_list_view_) { - ime_list_view_->Update(ime_controller_->current_ime().id, - ime_controller_->available_imes(), - ime_controller_->current_ime_menu_items(), false, - ImeListView::SHOW_SINGLE_IME); + ime_list_view_->Update( + ime_controller_->current_ime().id, ime_controller_->available_imes(), + ime_controller_->current_ime_menu_items(), ShouldShowKeyboardToggle(), + ImeListView::SHOW_SINGLE_IME); } }
diff --git a/ash/system/ime_menu/ime_menu_tray_unittest.cc b/ash/system/ime_menu/ime_menu_tray_unittest.cc index 04f6cac..b0976dce 100644 --- a/ash/system/ime_menu/ime_menu_tray_unittest.cc +++ b/ash/system/ime_menu/ime_menu_tray_unittest.cc
@@ -19,6 +19,10 @@ #include "ui/accessibility/ax_node_data.h" #include "ui/base/ime/chromeos/ime_bridge.h" #include "ui/base/ime/text_input_flags.h" +#include "ui/display/test/display_manager_test_api.h" +#include "ui/events/devices/device_data_manager_test_api.h" +#include "ui/events/devices/input_device.h" +#include "ui/events/devices/touchscreen_device.h" #include "ui/events/event.h" #include "ui/views/controls/label.h" @@ -111,6 +115,12 @@ ui::IMEBridge::Get()->SetCurrentInputContext(input_context); } + bool MenuHasOnScreenKeyboardToggle() const { + if (!GetTray()->ime_list_view_) + return false; + return ImeListViewTestApi(GetTray()->ime_list_view_).GetToggleView(); + } + private: DISALLOW_COPY_AND_ASSIGN(ImeMenuTrayTest); }; @@ -347,4 +357,65 @@ EXPECT_FALSE(IsVoiceEnabled()); } +TEST_F(ImeMenuTrayTest, ShowOnScreenKeyboardToggle) { + Shell::Get()->ime_controller()->ShowImeMenuOnShelf(true); + ASSERT_TRUE(IsVisible()); + ASSERT_FALSE(IsTrayBackgroundActive()); + + ui::GestureEvent tap(0, 0, 0, base::TimeTicks(), + ui::GestureEventDetails(ui::ET_GESTURE_TAP)); + GetTray()->PerformAction(tap); + EXPECT_TRUE(IsTrayBackgroundActive()); + EXPECT_TRUE(IsBubbleShown()); + + EXPECT_FALSE(MenuHasOnScreenKeyboardToggle()); + + // The on-screen keyboard toggle should show if the device has a touch + // screen, and does not have an internal keyboard. + std::vector<ui::TouchscreenDevice> screens; + screens.push_back( + ui::TouchscreenDevice(1, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, + "Touchscreen", gfx::Size(1024, 768), 0)); + ui::DeviceDataManagerTestApi().SetTouchscreenDevices(screens); + + std::vector<ui::InputDevice> keyboard_devices; + keyboard_devices.push_back(ui::InputDevice( + 1, ui::InputDeviceType::INPUT_DEVICE_USB, "external keyboard")); + ui::DeviceDataManagerTestApi().SetKeyboardDevices(keyboard_devices); + + // Bubble gets closed when the keyboard suppression state changes. + EXPECT_FALSE(IsBubbleShown()); + + GetTray()->PerformAction(ui::GestureEvent( + 0, 0, 0, base::TimeTicks(), ui::GestureEventDetails(ui::ET_GESTURE_TAP))); + EXPECT_TRUE(IsBubbleShown()); + + EXPECT_TRUE(MenuHasOnScreenKeyboardToggle()); + + // The toggle should not be removed on IME device refresh. + ImeInfo info; + info.id = "ime"; + info.name = u"English UK"; + info.short_name = u"UK"; + info.third_party = true; + + SetCurrentIme("ime", {info}); + EXPECT_TRUE(MenuHasOnScreenKeyboardToggle()); + + // The toggle should be hidden with internal keyboard. + keyboard_devices.push_back(ui::InputDevice( + 1, ui::InputDeviceType::INPUT_DEVICE_USB, "external keyboard")); + keyboard_devices.push_back(ui::InputDevice( + 1, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "internal keyboard")); + ui::DeviceDataManagerTestApi().SetKeyboardDevices(keyboard_devices); + + // Bubble gets closed when the keyboard suppression state changes. + EXPECT_FALSE(IsBubbleShown()); + + GetTray()->PerformAction(ui::GestureEvent( + 0, 0, 0, base::TimeTicks(), ui::GestureEventDetails(ui::ET_GESTURE_TAP))); + EXPECT_TRUE(IsBubbleShown()); + EXPECT_FALSE(MenuHasOnScreenKeyboardToggle()); +} + } // namespace ash
diff --git a/ash/wm/desks/desks_bar_view.cc b/ash/wm/desks/desks_bar_view.cc index ade5ac4..2365764 100644 --- a/ash/wm/desks/desks_bar_view.cc +++ b/ash/wm/desks/desks_bar_view.cc
@@ -27,7 +27,7 @@ #include "ash/wm/overview/overview_grid.h" #include "ash/wm/overview/overview_highlight_controller.h" #include "ash/wm/overview/overview_session.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/aura/window.h" #include "ui/events/event_observer.h"
diff --git a/base/BUILD.gn b/base/BUILD.gn index 5849d4ce..169612c 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -3772,6 +3772,7 @@ "android/java/src/org/chromium/base/NativeLibraryLoadedStatus.java", "android/java/src/org/chromium/base/annotations/NativeMethods.java", ] + deps = [ "//build/android:build_config_java" ] } @@ -3971,20 +3972,18 @@ android_library("base_javatests") { testonly = true + deps = [ ":base_java", ":base_java_test_support", - ":jni_java", "//base/test:test_support_java", - "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", - "//third_party/androidx:androidx_test_monitor_java", "//third_party/androidx:androidx_test_runner_java", - "//third_party/androidx:androidx_test_uiautomator_uiautomator_java", "//third_party/hamcrest:hamcrest_java", "//third_party/junit:junit", "//third_party/mockito:mockito_java", ] + sources = [ # AssertsTest doesn't really belong in //base but it's preferable to # stick it here than create another target for a single test. @@ -4031,21 +4030,15 @@ android_library("base_java_test_support") { testonly = true + deps = [ ":base_java", - ":jni_java", "//third_party/android_sdk:android_support_chromium_java", "//third_party/android_sdk:android_test_base_java", "//third_party/android_sdk:android_test_mock_java", - "//third_party/android_support_test_runner:exposed_instrumentation_api_publish_java", - "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/androidx:androidx_core_core_java", - "//third_party/androidx:androidx_test_monitor_java", - "//third_party/androidx:androidx_test_runner_java", - "//third_party/androidx:androidx_test_uiautomator_uiautomator_java", - "//third_party/hamcrest:hamcrest_core_java", "//third_party/hamcrest:hamcrest_java", "//third_party/junit", "//third_party/ub-uiautomator:ub_uiautomator_java", @@ -4129,10 +4122,9 @@ android_library("base_java_process_launcher_test_support") { testonly = true - deps = [ - ":base_java", - ":base_java_test_support", - ] + + deps = [ ":base_java" ] + sources = [ "test/android/javatests/src/org/chromium/base/process_launcher/TestChildProcessConnection.java" ] } @@ -4154,14 +4146,13 @@ # Make sure robolectric tests have classes filtered out of base_java by # jar_excluded_patterns. srcjar_deps = [ "//build/android:native_libraries_gen" ] + deps = [ ":base_java", "//testing/android/junit:junit_test_support", "//third_party/android_deps:robolectric_all_java", "//third_party/android_support_test_runner:runner_java", "//third_party/androidx:androidx_test_core_java", - "//third_party/androidx:androidx_test_monitor_java", - "//third_party/androidx:androidx_test_uiautomator_uiautomator_java", "//third_party/hamcrest:hamcrest_java", "//third_party/junit:junit", ] @@ -4247,12 +4238,15 @@ [ "android/javatests/src/org/chromium/base/profiler/TestSupport.java" ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + deps = [ "//base:base_java" ] } android_library("base_java_unittest_support") { testonly = true + deps = [ ":base_java" ] + sources = [ "test/android/java/src/org/chromium/base/ContentUriTestUtils.java", "test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java",
diff --git a/base/android/features_jni.cc b/base/android/features_jni.cc index f3f1797..77503c5 100644 --- a/base/android/features_jni.cc +++ b/base/android/features_jni.cc
@@ -3,7 +3,9 @@ // found in the LICENSE file. #include "base/base_jni_headers/Features_jni.h" +#include "base/android/jni_string.h" #include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" namespace base { namespace android { @@ -13,5 +15,17 @@ *reinterpret_cast<base::Feature*>(native_feature_pointer)); } +jboolean JNI_Features_GetFieldTrialParamByFeatureAsBoolean( + JNIEnv* env, + jlong native_feature_pointer, + const JavaParamRef<jstring>& jparam_name, + const jboolean jdefault_value) { + const base::Feature& feature = + *reinterpret_cast<base::Feature*>(native_feature_pointer); + const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name); + return base::GetFieldTrialParamByFeatureAsBool(feature, param_name, + jdefault_value); +} + } // namespace android } // namespace base
diff --git a/base/android/java/src/org/chromium/base/Features.java b/base/android/java/src/org/chromium/base/Features.java index c3e986c..d3c78766 100644 --- a/base/android/java/src/org/chromium/base/Features.java +++ b/base/android/java/src/org/chromium/base/Features.java
@@ -33,11 +33,26 @@ return FeaturesJni.get().isEnabled(getFeaturePointer()); } + /** + * Returns a field trial param as a boolean for the specified feature. + * + * @param paramName The name of the param. + * @param defaultValue The boolean value to use if the param is not available. + * @return The parameter value as a boolean. Default value if the feature does not exist or the + * specified parameter does not exist or its string value is neither "true" nor "false". + */ + public boolean getFieldTrialParamByFeatureAsBoolean(String paramName, boolean defaultValue) { + return FeaturesJni.get().getFieldTrialParamByFeatureAsBoolean( + getFeaturePointer(), paramName, defaultValue); + } + /** Returns a pointer to the native Feature object represented by this object instance. */ protected abstract long getFeaturePointer(); @NativeMethods interface Natives { boolean isEnabled(long featurePointer); + boolean getFieldTrialParamByFeatureAsBoolean( + long featurePointer, String paramName, boolean defaultValue); } }
diff --git a/base/android/jni_generator/BUILD.gn b/base/android/jni_generator/BUILD.gn index 092ca8b4d..6b3714e4 100644 --- a/base/android/jni_generator/BUILD.gn +++ b/base/android/jni_generator/BUILD.gn
@@ -27,7 +27,9 @@ android_library("jni_annotation_sample_java") { sources = [ "java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java" ] + deps = [ "//base:base_java" ] + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] }
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn index d71c1af..ebac81a 100644 --- a/base/test/BUILD.gn +++ b/base/test/BUILD.gn
@@ -481,13 +481,13 @@ android_library("test_support_java") { testonly = true + deps = [ "//base:base_java", - "//base:base_java_test_support", "//testing/android/native_test:native_main_runner_java", "//third_party/android_deps:com_google_code_findbugs_jsr305_java", - "//third_party/androidx:androidx_annotation_annotation_java", ] + srcjar_deps = [ ":test_support_java_aidl" ] sources = [ "android/java/src/org/chromium/base/GarbageCollectionTestUtils.java",
diff --git a/base/trace_event/builtin_categories.h b/base/trace_event/builtin_categories.h index 90989e5..563674ae 100644 --- a/base/trace_event/builtin_categories.h +++ b/base/trace_event/builtin_categories.h
@@ -37,14 +37,15 @@ X("base") \ X("benchmark") \ X("blink") \ - X("blink.bindings") \ X("blink.animations") \ + X("blink.bindings") \ X("blink.console") \ - X("blink_gc") \ X("blink.net") \ - X("blink_style") \ + X("blink.resource") \ X("blink.user_timing") \ X("blink.worker") \ + X("blink_gc") \ + X("blink_style") \ X("Blob") \ X("browser") \ X("browsing_data") \ @@ -271,13 +272,14 @@ X("benchmark,rail") \ X("benchmark,uma") \ X("benchmark,viz") \ - X("blink.animations,devtools.timeline,benchmark,rail") \ X("blink,benchmark") \ X("blink,benchmark,rail," TRACE_DISABLED_BY_DEFAULT("blink.debug.layout")) \ + X("blink,blink.resource") \ X("blink,blink_style") \ X("blink,devtools.timeline") \ X("blink,loading") \ X("blink,rail") \ + X("blink.animations,devtools.timeline,benchmark,rail") \ X("blink.user_timing,rail") \ X("blink_gc,devtools.timeline") \ X("browser,content,navigation") \
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index e9a6c60..c419ee0 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1612,14 +1612,6 @@ "-Wno-non-c-typedef-for-linkage", ] - if (llvm_force_head_revision) { - # TODO(https://crbug.com/1203071): Clean up and enable. - cflags += [ - "-Wno-unused-but-set-parameter", - "-Wno-unused-but-set-variable", - ] - } - cflags_c += [ # TODO(https://crbug.com/995993): Clean up and enable. "-Wno-implicit-fallthrough",
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 5120beb..0febc09 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -4.20210428.2.1 +4.20210428.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 553c134..0febc09 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -4.20210428.1.1 +4.20210428.3.1
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 4b366b5..47f6adf0 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -19,6 +19,7 @@ #include "base/command_line.h" #include "base/compiler_specific.h" #include "base/containers/adapters.h" +#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/debug/crash_logging.h" #include "base/debug/dump_without_crashing.h" @@ -29,7 +30,6 @@ #include "base/memory/read_only_shared_memory_region.h" #include "base/metrics/histogram.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" #include "base/trace_event/traced_value.h"
diff --git a/chrome/VERSION b/chrome/VERSION index 0b725993..b92db85 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=92 MINOR=0 -BUILD=4492 +BUILD=4493 PATCH=0
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected index a6a5cf73..c1f0d2e 100644 --- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -1292,6 +1292,9 @@ android:name="org.chromium.components.payments.PaymentDetailsUpdateService" android:exported="true" tools:ignore="ExportedService"> + <intent-filter> # DIFF-ANCHOR: c68af934 + <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS"/> + </intent-filter> # DIFF-ANCHOR: c68af934 </service> # DIFF-ANCHOR: 2a1cd701 <service # DIFF-ANCHOR: 0c6c4fd9 android:name="org.chromium.content.app.PrivilegedProcessService0"
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected index 2f3d450..3f8d263d 100644 --- a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
@@ -1180,6 +1180,9 @@ android:name="org.chromium.components.payments.PaymentDetailsUpdateService" android:exported="true" tools:ignore="ExportedService"> + <intent-filter> # DIFF-ANCHOR: c68af934 + <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS"/> + </intent-filter> # DIFF-ANCHOR: c68af934 </service> # DIFF-ANCHOR: 2a1cd701 <service # DIFF-ANCHOR: 0c6c4fd9 android:name="org.chromium.content.app.PrivilegedProcessService0"
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index 4f5b3ec..fc59631 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -1062,12 +1062,16 @@ <service android:name="org.chromium.chrome.browser.incognito.IncognitoNotificationService" android:exported="false"/> - <!-- service used by payment apps to notify the browser about changes in user selected - payment method, shipping address, or shipping option --> + <!-- Service used by payment apps to notify the browser about changes in user selected + payment method, shipping address, or shipping option. --> <service android:name="org.chromium.components.payments.PaymentDetailsUpdateService" android:exported="true" - tools:ignore="ExportedService"/> + tools:ignore="ExportedService"> + <intent-filter> + <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS" /> + </intent-filter> + </service> <receiver android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver" android:exported="false"/>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index 7a323ac..be363db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -78,6 +78,7 @@ import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory; import org.chromium.components.browser_ui.contacts_picker.ContactsPickerDialog; import org.chromium.components.browser_ui.photo_picker.DecoderServiceHost; +import org.chromium.components.browser_ui.photo_picker.PhotoPickerDelegateBase; import org.chromium.components.browser_ui.photo_picker.PhotoPickerDialog; import org.chromium.components.browser_ui.share.ShareImageFileUtils; import org.chromium.components.browser_ui.util.ConversionUtils; @@ -98,7 +99,6 @@ import org.chromium.content_public.common.ContentSwitches; import org.chromium.ui.base.Clipboard; import org.chromium.ui.base.PhotoPicker; -import org.chromium.ui.base.PhotoPickerDelegate; import org.chromium.ui.base.PhotoPickerListener; import org.chromium.ui.base.SelectFileDialog; import org.chromium.ui.base.WindowAndroid; @@ -123,9 +123,6 @@ private static final Object SNAPSHOT_DATABASE_LOCK = new Object(); private static final String SNAPSHOT_DATABASE_NAME = "snapshots.db"; - // The feature param for determining whether the PhotoPicker should animate thumbnails. - private static final String FEATURE_PARAM_ANIMATE_THUMBNAILS = "animate_thumbnails"; - private static ProcessInitializationHandler sInstance; private boolean mInitializedPreNative; @@ -217,26 +214,18 @@ return new Intent(ContextUtils.getApplicationContext(), DecoderService.class); }); - SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegate() { + SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegateBase() { @Override public PhotoPicker showPhotoPicker(WindowAndroid windowAndroid, PhotoPickerListener listener, boolean allowMultiple, List<String> mimeTypes) { PhotoPickerDialog dialog = new PhotoPickerDialog(windowAndroid, windowAndroid.getContext().get().getContentResolver(), listener, allowMultiple, - ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( - ChromeFeatureList.PHOTO_PICKER_VIDEO_SUPPORT, - FEATURE_PARAM_ANIMATE_THUMBNAILS, false), mimeTypes); dialog.getWindow().getAttributes().windowAnimations = R.style.PickerDialogAnimation; dialog.show(); return dialog; } - - @Override - public boolean supportsVideos() { - return ChromeFeatureList.isEnabled(ChromeFeatureList.PHOTO_PICKER_VIDEO_SUPPORT); - } }); ContactsPicker.setContactsPickerDelegate(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java index 177ad6b1..4c843e2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java
@@ -20,19 +20,15 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.components.autofill.EditableOption; import org.chromium.components.payments.AbortReason; -import org.chromium.components.payments.AndroidPaymentApp; -import org.chromium.components.payments.AndroidPaymentAppFactory; import org.chromium.components.payments.BrowserPaymentRequest; import org.chromium.components.payments.ErrorStrings; import org.chromium.components.payments.JourneyLogger; import org.chromium.components.payments.MethodStrings; -import org.chromium.components.payments.PackageManagerDelegate; import org.chromium.components.payments.PaymentApp; import org.chromium.components.payments.PaymentAppFactoryDelegate; import org.chromium.components.payments.PaymentAppFactoryInterface; import org.chromium.components.payments.PaymentAppService; import org.chromium.components.payments.PaymentAppType; -import org.chromium.components.payments.PaymentDetailsUpdateServiceHelper; import org.chromium.components.payments.PaymentFeatureList; import org.chromium.components.payments.PaymentHandlerHost; import org.chromium.components.payments.PaymentOptionsUtils; @@ -140,15 +136,6 @@ } /** - * Creates an instance of Android payment app factory. - * @return The instance, can be null for testing. - */ - @Nullable - default PaymentAppFactoryInterface createAndroidPaymentAppFactory() { - return new AndroidPaymentAppFactory(); - } - - /** * Creates an instance of service-worker payment app factory. * @return The instance, can be null for testing. */ @@ -328,10 +315,6 @@ @Override public void addPaymentAppFactories( PaymentAppService service, PaymentAppFactoryDelegate delegate) { - String androidFactoryId = AndroidPaymentAppFactory.class.getName(); - if (!service.containsFactory(androidFactoryId)) { - service.addUniqueFactory(mDelegate.createAndroidPaymentAppFactory(), androidFactoryId); - } String swFactoryId = PaymentAppServiceBridge.class.getName(); if (!service.containsFactory(swFactoryId)) { service.addUniqueFactory(mDelegate.createServiceWorkerPaymentAppFactory(), swFactoryId); @@ -561,12 +544,6 @@ EditableOption selectedShippingOption, PaymentApp selectedPaymentApp) { if (mPaymentRequestService == null || mSpec == null || mSpec.isDestroyed()) return false; selectedPaymentApp.setPaymentHandlerHost(getPaymentHandlerHost()); - // Only native apps can use PaymentDetailsUpdateService. - if (selectedPaymentApp.getPaymentAppType() == PaymentAppType.NATIVE_MOBILE_APP) { - PaymentDetailsUpdateServiceHelper.getInstance().initialize(new PackageManagerDelegate(), - ((AndroidPaymentApp) selectedPaymentApp).packageName(), - mPaymentRequestService /* PaymentApp.PaymentRequestUpdateEventListener */); - } PaymentResponseHelperInterface paymentResponseHelper = new ChromePaymentResponseHelper(selectedShippingAddress, selectedShippingOption, mPaymentUiService.getSelectedContact(), selectedPaymentApp, @@ -644,7 +621,6 @@ mPaymentHandlerHost.destroy(); mPaymentHandlerHost = null; } - PaymentDetailsUpdateServiceHelper.getInstance().reset(); } // Implements BrowserPaymentRequest: @@ -756,7 +732,6 @@ disconnectFromClientWithDebugMessage(errorMessage); } else { mPaymentUiService.onPayButtonProcessingCancelled(); - PaymentDetailsUpdateServiceHelper.getInstance().reset(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java index 88be558..01d0b06a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java
@@ -62,7 +62,6 @@ import org.chromium.components.payments.JourneyLogger; import org.chromium.components.payments.PaymentApp; import org.chromium.components.payments.PaymentAppType; -import org.chromium.components.payments.PaymentDetailsUpdateServiceHelper; import org.chromium.components.payments.PaymentFeatureList; import org.chromium.components.payments.PaymentOptionsUtils; import org.chromium.components.payments.PaymentRequestParams; @@ -692,7 +691,6 @@ // Go back to the payment sheet mPaymentRequestUI.onPayButtonProcessingCancelled(); - PaymentDetailsUpdateServiceHelper.getInstance().reset(); if (!TextUtils.isEmpty(errors.error)) { mPaymentRequestUI.setRetryErrorMessage(errors.error); } else {
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index f455bf9..3d608e8c 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1718,8 +1718,8 @@ "storage/appcache_feature_prefs.h", "storage/durable_storage_permission_context.cc", "storage/durable_storage_permission_context.h", - "subresource_filter/chrome_subresource_filter_client.cc", - "subresource_filter/chrome_subresource_filter_client.h", + "subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.cc", + "subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.h", "subresource_filter/subresource_filter_history_observer.cc", "subresource_filter/subresource_filter_history_observer.h", "subresource_filter/subresource_filter_profile_context_factory.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 1b7c8f1..7e8e8607 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -4147,9 +4147,6 @@ flag_descriptions::kForceSpectreVariant2MitigationDescription, kOsCrOS, FEATURE_VALUE_TYPE( sandbox::policy::features::kForceSpectreVariant2Mitigation)}, - {"smbfs-file-shares", flag_descriptions::kSmbfsFileSharesName, - flag_descriptions::kSmbfsFileSharesName, kOsCrOS, - FEATURE_VALUE_TYPE(features::kSmbFs)}, {"spectre-v2-mitigation", flag_descriptions::kSpectreVariant2MitigationName, flag_descriptions::kSpectreVariant2MitigationDescription, kOsCrOS, FEATURE_VALUE_TYPE(sandbox::policy::features::kSpectreVariant2Mitigation)}, @@ -7277,6 +7274,13 @@ FEATURE_VALUE_TYPE(password_manager::features::kBiometricTouchToFill)}, #endif +#if BUILDFLAG(IS_CHROMEOS_ASH) + {"launcher-query-highlighting", + flag_descriptions::kLauncherQueryHighlightingName, + flag_descriptions::kLauncherQueryHighlightingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(app_list_features::kLauncherQueryHighlighting)}, +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/accessibility/caption_controller_browsertest.cc b/chrome/browser/accessibility/caption_controller_browsertest.cc index 3b4cc08d..54414c9 100644 --- a/chrome/browser/accessibility/caption_controller_browsertest.cc +++ b/chrome/browser/accessibility/caption_controller_browsertest.cc
@@ -167,10 +167,15 @@ IN_PROC_BROWSER_TEST_F(CaptionControllerTest, ProfilePrefsAreRegistered) { EXPECT_FALSE( browser()->profile()->GetPrefs()->GetBoolean(prefs::kLiveCaptionEnabled)); + +#if !defined(OS_CHROMEOS) + // These prefs are used for the component updater, but SODA does not use the + // component updater on Chrome OS. EXPECT_EQ(base::FilePath(), g_browser_process->local_state()->GetFilePath( prefs::kSodaBinaryPath)); EXPECT_EQ(base::FilePath(), g_browser_process->local_state()->GetFilePath( prefs::kSodaEnUsConfigPath)); +#endif // !defined(OS_CHROMEOS) } IN_PROC_BROWSER_TEST_F(CaptionControllerTest, @@ -179,20 +184,28 @@ SetLiveCaptionEnabled(true); EXPECT_TRUE( browser()->profile()->GetPrefs()->GetBoolean(prefs::kLiveCaptionEnabled)); +#if !defined(OS_CHROMEOS) + // These prefs are used for the component updater, but SODA does not use the + // component updater on Chrome OS. EXPECT_EQ(base::FilePath(), g_browser_process->local_state()->GetFilePath( prefs::kSodaBinaryPath)); EXPECT_EQ(base::FilePath(), g_browser_process->local_state()->GetFilePath( prefs::kSodaEnUsConfigPath)); +#endif // !defined(OS_CHROMEOS) // Ensure that live caption is also enabled in the incognito profile. Profile* incognito_profile = browser()->profile()->GetPrimaryOTRProfile(/*create_if_needed=*/true); EXPECT_TRUE( incognito_profile->GetPrefs()->GetBoolean(prefs::kLiveCaptionEnabled)); +#if !defined(OS_CHROMEOS) + // These prefs are used for the component updater, but SODA does not use the + // component updater on Chrome OS. EXPECT_EQ(base::FilePath(), g_browser_process->local_state()->GetFilePath( prefs::kSodaBinaryPath)); EXPECT_EQ(base::FilePath(), g_browser_process->local_state()->GetFilePath( prefs::kSodaEnUsConfigPath)); +#endif // !defined(OS_CHROMEOS) } IN_PROC_BROWSER_TEST_F(CaptionControllerTest, LiveCaptionEnabledChanged) {
diff --git a/chrome/browser/accessibility/soda_installer.h b/chrome/browser/accessibility/soda_installer.h index fd58c741..b86a703 100644 --- a/chrome/browser/accessibility/soda_installer.h +++ b/chrome/browser/accessibility/soda_installer.h
@@ -7,6 +7,7 @@ #include "base/files/file_path.h" #include "base/observer_list.h" +#include "components/prefs/pref_registry_simple.h" class PrefService; @@ -39,6 +40,10 @@ // instance. static SodaInstaller* GetInstance(); + // Registers user preferences related to the Speech On-Device API (SODA) + // component. + static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); + // Initialize SODA if any SODA-utilising feature is enabled. Intended to be // called during embedder startup. Checks whether SODA is due for // uninstallation, and if so, triggers uninstallation.
diff --git a/chrome/browser/accessibility/soda_installer_impl.cc b/chrome/browser/accessibility/soda_installer_impl.cc index 4a31632..aefbf59 100644 --- a/chrome/browser/accessibility/soda_installer_impl.cc +++ b/chrome/browser/accessibility/soda_installer_impl.cc
@@ -60,6 +60,19 @@ return instance.get(); } +// static +void speech::SodaInstaller::RegisterLocalStatePrefs( + PrefRegistrySimple* registry) { + registry->RegisterTimePref(prefs::kSodaScheduledDeletionTime, base::Time()); + registry->RegisterFilePathPref(prefs::kSodaBinaryPath, base::FilePath()); + + // Register language pack config path preferences. + for (const speech::SodaLanguagePackComponentConfig& config : + speech::kLanguageComponentConfigs) { + registry->RegisterFilePathPref(config.config_path_pref, base::FilePath()); + } +} + SodaInstallerImpl::SodaInstallerImpl() = default; SodaInstallerImpl::~SodaInstallerImpl() {
diff --git a/chrome/browser/android/metrics/ukm_utils_for_test.cc b/chrome/browser/android/metrics/ukm_utils_for_test.cc index b912cf5..375bd1f 100644 --- a/chrome/browser/android/metrics/ukm_utils_for_test.cc +++ b/chrome/browser/android/metrics/ukm_utils_for_test.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "base/android/jni_string.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "chrome/browser/android/metrics/jni_headers/UkmUtilsForTest_jni.h" #include "chrome/browser/browser_process.h" #include "components/metrics_services_manager/metrics_services_manager.h"
diff --git a/chrome/browser/apps/app_service/app_platform_metrics.cc b/chrome/browser/apps/app_service/app_platform_metrics.cc index 98622bd..a54ffeeb 100644 --- a/chrome/browser/apps/app_service/app_platform_metrics.cc +++ b/chrome/browser/apps/app_service/app_platform_metrics.cc
@@ -6,6 +6,8 @@ #include "base/metrics/histogram_functions.h" #include "chrome/browser/apps/app_service/app_service_metrics.h" +#include "chrome/browser/apps/app_service/app_service_proxy.h" +#include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/extensions/application_launch.h" @@ -20,35 +22,61 @@ namespace { -// This is used for logging, so do not remove or reorder existing entries. -enum class AppTypeName { - kUnknown = 0, - kArc = 1, - kBuiltIn = 2, - kCrostini = 3, - kChromeApp = 4, - kWeb = 5, - kMacOs = 6, - kPluginVm = 7, - kStandaloneBrowser = 8, - kRemote = 9, - kBorealis = 10, - kSystemWeb = 11, - kChromeBrowser = 12, +// UMA metrics for a snapshot count of installed apps. +constexpr char kArcAppsCountHistogramName[] = "Apps.AppsCount.Arc"; +constexpr char kBuiltInAppsCountHistogramName[] = "Apps.AppsCount.BuiltIn"; +constexpr char kCrostiniAppsCountHistogramName[] = "Apps.AppsCount.Crostini"; +constexpr char kExtensionAppsCountHistogramName[] = "Apps.AppsCount.ChromeApp"; +constexpr char kWebAppsCountHistogramName[] = "Apps.AppsCount.WebApp"; +constexpr char kMacOsAppsCountHistogramName[] = "Apps.AppsCount.MacOs"; +constexpr char kPluginVmAppsCountHistogramName[] = "Apps.AppsCount.PluginVm"; +constexpr char kStandaloneBrowserAppsCountHistogramName[] = + "Apps.AppsCount.StandaloneBrowser"; +constexpr char kRemoteAppsCountHistogramName[] = "Apps.AppsCount.RemoteApp"; +constexpr char kBorealisAppsCountHistogramName[] = "Apps.AppsCount.Borealis"; +constexpr char kSystemWebAppsCountHistogramName[] = + "Apps.AppsCount.SystemWebApp"; - // Add any new values above this one, and update kMaxValue to the highest - // enumerator value. - kMaxValue = kChromeBrowser, -}; +const char* GetAppsCountHistogramName(apps::AppTypeName app_type_name) { + switch (app_type_name) { + case apps::AppTypeName::kUnknown: + return nullptr; + case apps::AppTypeName::kArc: + return kArcAppsCountHistogramName; + case apps::AppTypeName::kBuiltIn: + return kBuiltInAppsCountHistogramName; + case apps::AppTypeName::kCrostini: + return kCrostiniAppsCountHistogramName; + case apps::AppTypeName::kChromeApp: + return kExtensionAppsCountHistogramName; + case apps::AppTypeName::kWeb: + return kWebAppsCountHistogramName; + case apps::AppTypeName::kMacOs: + return kMacOsAppsCountHistogramName; + case apps::AppTypeName::kPluginVm: + return kPluginVmAppsCountHistogramName; + case apps::AppTypeName::kStandaloneBrowser: + return kStandaloneBrowserAppsCountHistogramName; + case apps::AppTypeName::kRemote: + return kRemoteAppsCountHistogramName; + case apps::AppTypeName::kBorealis: + return kBorealisAppsCountHistogramName; + case apps::AppTypeName::kSystemWeb: + return kSystemWebAppsCountHistogramName; + case apps::AppTypeName::kChromeBrowser: + return nullptr; + } +} // Determines what app type a Chrome App should be logged as based on its launch // container and app id. In particular, Chrome apps in tabs are logged as part // of Chrome browser. -AppTypeName GetAppTypeNameForChromeApp(Profile* profile, - const std::string& app_id, - apps::mojom::LaunchContainer container) { +apps::AppTypeName GetAppTypeNameForChromeApp( + Profile* profile, + const std::string& app_id, + apps::mojom::LaunchContainer container) { if (app_id == extension_misc::kChromeAppId) { - return AppTypeName::kChromeBrowser; + return apps::AppTypeName::kChromeBrowser; } DCHECK(profile); @@ -59,14 +87,14 @@ registry->GetInstalledExtension(app_id); if (CanLaunchViaEvent(extension)) { - return AppTypeName::kChromeApp; + return apps::AppTypeName::kChromeApp; } switch (container) { case apps::mojom::LaunchContainer::kLaunchContainerWindow: - return AppTypeName::kChromeApp; + return apps::AppTypeName::kChromeApp; case apps::mojom::LaunchContainer::kLaunchContainerTab: - return AppTypeName::kChromeBrowser; + return apps::AppTypeName::kChromeBrowser; default: break; } @@ -75,40 +103,41 @@ extensions::GetLaunchContainer(extensions::ExtensionPrefs::Get(profile), extension); if (launch_container == apps::mojom::LaunchContainer::kLaunchContainerTab) { - return AppTypeName::kChromeBrowser; + return apps::AppTypeName::kChromeBrowser; } - return AppTypeName::kChromeApp; + return apps::AppTypeName::kChromeApp; } // Determines what app type a web app should be logged as based on its launch // container and app id. In particular, web apps in tabs are logged as part of // Chrome browser. -AppTypeName GetAppTypeNameForWebApp(Profile* profile, - const std::string& app_id, - apps::mojom::LaunchContainer container) { +apps::AppTypeName GetAppTypeNameForWebApp( + Profile* profile, + const std::string& app_id, + apps::mojom::LaunchContainer container) { auto* provider = web_app::WebAppProvider::Get(profile); DCHECK(provider); const auto* registrar = provider->registrar().AsWebAppRegistrar(); if (!registrar) { - return AppTypeName::kChromeBrowser; + return apps::AppTypeName::kChromeBrowser; } const auto* web_app = registrar->GetAppById(app_id); if (!web_app) { - return AppTypeName::kChromeBrowser; + return apps::AppTypeName::kChromeBrowser; } if (web_app->IsSystemApp()) { - return AppTypeName::kSystemWeb; + return apps::AppTypeName::kSystemWeb; } switch (container) { case apps::mojom::LaunchContainer::kLaunchContainerWindow: - return AppTypeName::kWeb; + return apps::AppTypeName::kWeb; case apps::mojom::LaunchContainer::kLaunchContainerTab: - return AppTypeName::kChromeBrowser; + return apps::AppTypeName::kChromeBrowser; default: break; } @@ -116,42 +145,42 @@ if (web_app::ConvertDisplayModeToAppLaunchContainer( registrar->GetAppEffectiveDisplayMode(app_id)) == apps::mojom::LaunchContainer::kLaunchContainerTab) { - return AppTypeName::kChromeBrowser; + return apps::AppTypeName::kChromeBrowser; } - return AppTypeName::kWeb; + return apps::AppTypeName::kWeb; } // Returns AppTypeName used for app launch metrics. -AppTypeName GetAppTypeName(Profile* profile, - apps::mojom::AppType app_type, - const std::string& app_id, - apps::mojom::LaunchContainer container) { +apps::AppTypeName GetAppTypeName(Profile* profile, + apps::mojom::AppType app_type, + const std::string& app_id, + apps::mojom::LaunchContainer container) { switch (app_type) { case apps::mojom::AppType::kUnknown: - return AppTypeName::kUnknown; + return apps::AppTypeName::kUnknown; case apps::mojom::AppType::kArc: - return AppTypeName::kArc; + return apps::AppTypeName::kArc; case apps::mojom::AppType::kBuiltIn: - return AppTypeName::kBuiltIn; + return apps::AppTypeName::kBuiltIn; case apps::mojom::AppType::kCrostini: - return AppTypeName::kCrostini; + return apps::AppTypeName::kCrostini; case apps::mojom::AppType::kExtension: return GetAppTypeNameForChromeApp(profile, app_id, container); case apps::mojom::AppType::kWeb: return GetAppTypeNameForWebApp(profile, app_id, container); case apps::mojom::AppType::kMacOs: - return AppTypeName::kMacOs; + return apps::AppTypeName::kMacOs; case apps::mojom::AppType::kPluginVm: - return AppTypeName::kPluginVm; + return apps::AppTypeName::kPluginVm; case apps::mojom::AppType::kStandaloneBrowser: - return AppTypeName::kStandaloneBrowser; + return apps::AppTypeName::kStandaloneBrowser; case apps::mojom::AppType::kRemote: - return AppTypeName::kRemote; + return apps::AppTypeName::kRemote; case apps::mojom::AppType::kBorealis: - return AppTypeName::kBorealis; + return apps::AppTypeName::kBorealis; case apps::mojom::AppType::kSystemWeb: - return AppTypeName::kSystemWeb; + return apps::AppTypeName::kSystemWeb; } } @@ -163,8 +192,8 @@ // Records the number of times Chrome OS apps are launched grouped by the app // type. -void RecordAppLaunchPerAppType(AppTypeName app_type_name) { - if (app_type_name == AppTypeName::kUnknown) { +void RecordAppLaunchPerAppType(apps::AppTypeName app_type_name) { + if (app_type_name == apps::AppTypeName::kUnknown) { return; } @@ -191,4 +220,78 @@ GetAppTypeName(profile, app_type, app_id, container)); } +AppPlatformMetrics::AppPlatformMetrics( + Profile* profile, + apps::AppRegistryCache& app_registry_cache) + : profile_(profile), + app_registry_cache_(app_registry_cache), + first_report_on_current_device_(true) { + Observe(&app_registry_cache); +} + +AppPlatformMetrics::~AppPlatformMetrics() = default; + +// static +const char* AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName app_type_name) { + return GetAppsCountHistogramName(app_type_name); +} + +void AppPlatformMetrics::OnNewDay() { + // Ignores the first report. Apps and extensions may sync slowly after the + // OOBE process, biasing the metrics downwards toward zero. + if (first_report_on_current_device_) { + first_report_on_current_device_ = false; + return; + } + + should_record_metrics_on_new_day_ = true; + RecordAppsCount(apps::mojom::AppType::kUnknown); +} + +void AppPlatformMetrics::OnAppTypeInitialized(apps::mojom::AppType app_type) { + if (should_record_metrics_on_new_day_) + RecordAppsCount(app_type); +} + +void AppPlatformMetrics::OnAppRegistryCacheWillBeDestroyed( + apps::AppRegistryCache* cache) { + Observe(nullptr); +} + +void AppPlatformMetrics::OnAppUpdate(const apps::AppUpdate& update) {} + +void AppPlatformMetrics::RecordAppsCount(apps::mojom::AppType app_type) { + std::map<AppTypeName, int> app_count; + app_registry_cache_.ForEachApp( + [app_type, this, &app_count](const apps::AppUpdate& update) { + if (app_type != apps::mojom::AppType::kUnknown && + (update.AppType() != app_type || + update.AppId() == extension_misc::kChromeAppId)) { + return; + } + + AppTypeName app_type_name = + GetAppTypeName(profile_, update.AppType(), update.AppId(), + apps::mojom::LaunchContainer::kLaunchContainerNone); + + if (app_type_name == AppTypeName::kChromeBrowser || + app_type_name == AppTypeName::kUnknown) { + return; + } + + ++app_count[app_type_name]; + }); + + for (auto it : app_count) { + const char* histogram_name = GetAppsCountHistogramName(it.first); + if (histogram_name) { + // If there are more than a thousand apps installed, then that count is + // going into an overflow bucket. We don't expect this scenario to happen + // often. + base::UmaHistogramCounts1000(histogram_name, it.second); + } + } +} + } // namespace apps
diff --git a/chrome/browser/apps/app_service/app_platform_metrics.h b/chrome/browser/apps/app_service/app_platform_metrics.h index 6930d57..295965d 100644 --- a/chrome/browser/apps/app_service/app_platform_metrics.h +++ b/chrome/browser/apps/app_service/app_platform_metrics.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_APPS_APP_SERVICE_APP_PLATFORM_METRICS_H_ #define CHROME_BROWSER_APPS_APP_SERVICE_APP_PLATFORM_METRICS_H_ +#include "components/services/app_service/public/cpp/app_registry_cache.h" #include "components/services/app_service/public/mojom/types.mojom.h" class Profile; @@ -13,12 +14,67 @@ class AppUpdate; +// This is used for logging, so do not remove or reorder existing entries. +enum class AppTypeName { + kUnknown = 0, + kArc = 1, + kBuiltIn = 2, + kCrostini = 3, + kChromeApp = 4, + kWeb = 5, + kMacOs = 6, + kPluginVm = 7, + kStandaloneBrowser = 8, + kRemote = 9, + kBorealis = 10, + kSystemWeb = 11, + kChromeBrowser = 12, + + // Add any new values above this one, and update kMaxValue to the highest + // enumerator value. + kMaxValue = kChromeBrowser, +}; + // Records metrics when launching apps. void RecordAppLaunchMetrics(Profile* profile, const apps::AppUpdate& update, apps::mojom::LaunchSource launch_source, apps::mojom::LaunchContainer container); +class AppPlatformMetrics : public apps::AppRegistryCache::Observer { + public: + explicit AppPlatformMetrics(Profile* profile, + apps::AppRegistryCache& app_registry_cache); + AppPlatformMetrics(const AppPlatformMetrics&) = delete; + AppPlatformMetrics& operator=(const AppPlatformMetrics&) = delete; + ~AppPlatformMetrics() override; + + // UMA metrics for a snapshot count of recently used apps for a given family + // user. + static const char* GetAppsCountHistogramNameForTest( + AppTypeName app_type_name); + + void OnNewDay(); + + private: + // AppRegistryCache::Observer: + void OnAppTypeInitialized(apps::mojom::AppType app_type) override; + void OnAppRegistryCacheWillBeDestroyed( + apps::AppRegistryCache* cache) override; + void OnAppUpdate(const apps::AppUpdate& update) override; + + // Records the number of apps of the given `app_type` that the family user has + // recently used. + void RecordAppsCount(apps::mojom::AppType app_type); + + Profile* const profile_ = nullptr; + + apps::AppRegistryCache& app_registry_cache_; + + bool should_record_metrics_on_new_day_ = false; + bool first_report_on_current_device_ = false; +}; + } // namespace apps #endif // CHROME_BROWSER_APPS_APP_SERVICE_APP_PLATFORM_METRICS_H_
diff --git a/chrome/browser/apps/app_service/app_platform_metrics_service.cc b/chrome/browser/apps/app_service/app_platform_metrics_service.cc index e4a3f8f..e670760c 100644 --- a/chrome/browser/apps/app_service/app_platform_metrics_service.cc +++ b/chrome/browser/apps/app_service/app_platform_metrics_service.cc
@@ -31,7 +31,6 @@ } AppPlatformMetricsService::~AppPlatformMetricsService() { - observers_.Clear(); timer_.Stop(); } @@ -46,7 +45,11 @@ return GetDayId(time); } -void AppPlatformMetricsService::Start() { +void AppPlatformMetricsService::Start( + apps::AppRegistryCache& app_registry_cache) { + app_platform_app_metrics_ = + std::make_unique<AppPlatformMetrics>(profile_, app_registry_cache); + day_id_ = profile_->GetPrefs()->GetInteger(kAppPlatformMetricsDayId); CheckForNewDay(); @@ -55,14 +58,6 @@ &AppPlatformMetricsService::CheckForNewDay); } -void AppPlatformMetricsService::AddObserver(Observer* observer) { - observers_.AddObserver(observer); -} - -void AppPlatformMetricsService::RemoveObserver(Observer* observer) { - observers_.RemoveObserver(observer); -} - void AppPlatformMetricsService::CheckForNewDay() { base::Time now = base::Time::Now(); @@ -70,9 +65,7 @@ // time zone changes. if (day_id_ < GetDayId(now)) { day_id_ = GetDayId(now); - for (Observer& observer : observers_) { - observer.OnNewDay(); - } + app_platform_app_metrics_->OnNewDay(); profile_->GetPrefs()->SetInteger(kAppPlatformMetricsDayId, day_id_); } }
diff --git a/chrome/browser/apps/app_service/app_platform_metrics_service.h b/chrome/browser/apps/app_service/app_platform_metrics_service.h index aa7396a..af9da29 100644 --- a/chrome/browser/apps/app_service/app_platform_metrics_service.h +++ b/chrome/browser/apps/app_service/app_platform_metrics_service.h
@@ -5,27 +5,24 @@ #ifndef CHROME_BROWSER_APPS_APP_SERVICE_APP_PLATFORM_METRICS_SERVICE_H_ #define CHROME_BROWSER_APPS_APP_SERVICE_APP_PLATFORM_METRICS_SERVICE_H_ -#include "base/observer_list.h" +#include <utility> + #include "base/timer/timer.h" +#include "chrome/browser/apps/app_service/app_platform_metrics.h" #include "chrome/browser/profiles/profile.h" class PrefRegistrySimple; namespace apps { +class AppRegistryCache; + extern const char kAppPlatformMetricsDayId[]; // Service to initialize and control app platform metric recorders per day in // Chrome OS. class AppPlatformMetricsService { public: - // Interface for observing events on the AppPlatformMetricsService. - class Observer : public base::CheckedObserver { - public: - // Called when we detect a new day. - virtual void OnNewDay() {} - }; - explicit AppPlatformMetricsService(Profile* profile); AppPlatformMetricsService(const AppPlatformMetricsService&) = delete; AppPlatformMetricsService& operator=(const AppPlatformMetricsService&) = @@ -38,23 +35,20 @@ static int GetDayIdForTesting(base::Time time); // Start the timer and check if a new day has arrived. - void Start(); - - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); + void Start(apps::AppRegistryCache& app_registry_cache); private: // Helper function to check if a new day has arrived. void CheckForNewDay(); - Profile* profile_; + Profile* const profile_; int day_id_; // A periodic timer that checks if a new day has arrived. base::RepeatingTimer timer_; - base::ObserverList<Observer> observers_; + std::unique_ptr<AppPlatformMetrics> app_platform_app_metrics_; }; } // namespace apps
diff --git a/chrome/browser/apps/app_service/app_platform_metrics_service_unittest.cc b/chrome/browser/apps/app_service/app_platform_metrics_service_unittest.cc index ff3b3f9e4..7237d7c1 100644 --- a/chrome/browser/apps/app_service/app_platform_metrics_service_unittest.cc +++ b/chrome/browser/apps/app_service/app_platform_metrics_service_unittest.cc
@@ -5,12 +5,19 @@ #include "chrome/browser/apps/app_service/app_platform_metrics_service.h" #include <memory> +#include <utility> +#include "base/test/metrics/histogram_tester.h" +#include "base/test/task_environment.h" #include "base/time/time.h" +#include "chrome/browser/apps/app_service/app_platform_metrics.h" +#include "chrome/browser/apps/app_service/app_service_proxy.h" +#include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power_manager/idle.pb.h" #include "chromeos/dbus/power_manager/suspend.pb.h" +#include "components/services/app_service/public/cpp/app_registry_cache.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" @@ -34,13 +41,14 @@ power_manager::SuspendImminent_Reason_OTHER); } -} // namespace +apps::mojom::AppPtr MakeApp(const char* app_id, apps::mojom::AppType app_type) { + apps::mojom::AppPtr app = apps::mojom::App::New(); + app->app_id = app_id; + app->app_type = app_type; + return app; +} -class AppPlatformMetricsServiceTestObserver - : public AppPlatformMetricsService::Observer { - public: - MOCK_METHOD(void, OnNewDay, (), (override)); -}; +} // namespace // Tests for family user metrics service. class AppPlatformMetricsServiceTest : public testing::Test { @@ -56,8 +64,11 @@ app_platform_metrics_service_ = std::make_unique<AppPlatformMetricsService>(&testing_profile_); - app_platform_metrics_service_->AddObserver(&mock_observer_); - app_platform_metrics_service_->Start(); + app_platform_metrics_service_->Start( + apps::AppServiceProxyFactory::GetForProfile(&testing_profile_) + ->AppRegistryCache()); + + InstallApps(); } void TearDown() override { @@ -65,6 +76,85 @@ chromeos::PowerManagerClient::Shutdown(); } + void InstallApps() { + auto* proxy = + apps::AppServiceProxyFactory::GetForProfile(&testing_profile_); + std::vector<apps::mojom::AppPtr> deltas; + apps::AppRegistryCache& cache = proxy->AppRegistryCache(); + deltas.push_back(MakeApp(/*app_id=*/"u", apps::mojom::AppType::kUnknown)); + deltas.push_back(MakeApp(/*app_id=*/"a", apps::mojom::AppType::kArc)); + deltas.push_back(MakeApp(/*app_id=*/"bu", apps::mojom::AppType::kBuiltIn)); + deltas.push_back(MakeApp(/*app_id=*/"c", apps::mojom::AppType::kCrostini)); + deltas.push_back(MakeApp(/*app_id=*/"w", apps::mojom::AppType::kWeb)); + deltas.push_back(MakeApp( + /*app_id=*/"m", apps::mojom::AppType::kMacOs)); + deltas.push_back(MakeApp( + /*app_id=*/"p", apps::mojom::AppType::kPluginVm)); + deltas.push_back(MakeApp( + /*app_id=*/"l", apps::mojom::AppType::kStandaloneBrowser)); + deltas.push_back(MakeApp( + /*app_id=*/"r", apps::mojom::AppType::kRemote)); + deltas.push_back(MakeApp(/*app_id=*/"bo", apps::mojom::AppType::kBorealis)); + deltas.push_back(MakeApp(/*app_id=*/"s", apps::mojom::AppType::kSystemWeb)); + cache.OnApps(std::move(deltas), apps::mojom::AppType::kUnknown, + false /* should_notify_initialized */); + } + + void InstallOneApp() { + auto* proxy = + apps::AppServiceProxyFactory::GetForProfile(&testing_profile_); + std::vector<apps::mojom::AppPtr> deltas; + apps::AppRegistryCache& cache = proxy->AppRegistryCache(); + deltas.push_back(MakeApp(/*app_id=*/"aa", apps::mojom::AppType::kArc)); + cache.OnApps(std::move(deltas), apps::mojom::AppType::kUnknown, + false /* should_notify_initialized */); + } + + void VerifyMetrics() { + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest(AppTypeName::kArc), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kBuiltIn), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kCrostini), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kChromeApp), + /*expected_count=*/0); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest(AppTypeName::kWeb), + /*expected_count=*/0); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kMacOs), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kPluginVm), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kStandaloneBrowser), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kRemote), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kBorealis), + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest( + AppTypeName::kSystemWeb), + /*expected_count=*/1); + } + protected: sync_preferences::TestingPrefServiceSyncable* GetPrefService() { return testing_profile_.GetTestingPrefService(); @@ -74,37 +164,40 @@ return GetPrefService()->GetInteger(kAppPlatformMetricsDayId); } + base::HistogramTester& histogram_tester() { return histogram_tester_; } + content::BrowserTaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - AppPlatformMetricsServiceTestObserver mock_observer_; - private: TestingProfile testing_profile_; + base::HistogramTester histogram_tester_; std::unique_ptr<AppPlatformMetricsService> app_platform_metrics_service_; }; // Tests OnNewDay() is called after more than one day passes. TEST_F(AppPlatformMetricsServiceTest, MoreThanOneDay) { - EXPECT_CALL(mock_observer_, OnNewDay()).Times(1); task_environment_.FastForwardBy(base::TimeDelta::FromDays(1) + base::TimeDelta::FromHours(1)); + VerifyMetrics(); EXPECT_EQ(AppPlatformMetricsService::GetDayIdForTesting(base::Time::Now()), GetDayIdPref()); } // Tests OnNewDay() is called at midnight. TEST_F(AppPlatformMetricsServiceTest, UntilMidnight) { - EXPECT_CALL(mock_observer_, OnNewDay()).Times(1); task_environment_.FastForwardBy(base::TimeDelta::FromHours(3)); + VerifyMetrics(); EXPECT_EQ(AppPlatformMetricsService::GetDayIdForTesting(base::Time::Now()), GetDayIdPref()); } // Tests OnNewDay() is not called before midnight. TEST_F(AppPlatformMetricsServiceTest, LessThanOneDay) { - EXPECT_CALL(mock_observer_, OnNewDay()).Times(0); task_environment_.FastForwardBy(base::TimeDelta::FromHours(1)); + histogram_tester().ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest(AppTypeName::kArc), + /*expected_count=*/0); EXPECT_EQ(AppPlatformMetricsService::GetDayIdForTesting(base::Time::Now()), GetDayIdPref()); } @@ -112,12 +205,24 @@ // Tests OnNewDay() is called after one day passes, even when the device is // idle. TEST_F(AppPlatformMetricsServiceTest, MoreThanOneDayDeviceIdle) { - EXPECT_CALL(mock_observer_, OnNewDay()).Times(1); SetScreenOff(true); SetSuspendImminent(); task_environment_.FastForwardBy(base::TimeDelta::FromDays(1)); + VerifyMetrics(); EXPECT_EQ(AppPlatformMetricsService::GetDayIdForTesting(base::Time::Now()), GetDayIdPref()); } +// Tests the UMA metrics that count the number of installed apps. +TEST_F(AppPlatformMetricsServiceTest, InstallApps) { + task_environment_.FastForwardBy(base::TimeDelta::FromHours(3)); + VerifyMetrics(); + + InstallOneApp(); + task_environment_.FastForwardBy(base::TimeDelta::FromDays(1)); + histogram_tester().ExpectTotalCount( + AppPlatformMetrics::GetAppsCountHistogramNameForTest(AppTypeName::kArc), + /*expected_count=*/2); +} + } // namespace apps
diff --git a/chrome/browser/apps/app_service/app_service_proxy_chromeos.cc b/chrome/browser/apps/app_service/app_service_proxy_chromeos.cc index d97bc0f8..614c31f 100644 --- a/chrome/browser/apps/app_service/app_service_proxy_chromeos.cc +++ b/chrome/browser/apps/app_service/app_service_proxy_chromeos.cc
@@ -454,7 +454,7 @@ void AppServiceProxyChromeOs::InitAppPlatformMetrics() { if (app_platform_metrics_service_) { - app_platform_metrics_service_->Start(); + app_platform_metrics_service_->Start(app_registry_cache_); } }
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_chromeos.cc b/chrome/browser/apps/app_service/publishers/web_apps_chromeos.cc index c06eaac..0cf42c8 100644 --- a/chrome/browser/apps/app_service/publishers/web_apps_chromeos.cc +++ b/chrome/browser/apps/app_service/publishers/web_apps_chromeos.cc
@@ -13,10 +13,10 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/apps/app_service/app_launch_params.h" #include "chrome/browser/apps/app_service/app_service_metrics.h"
diff --git a/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc b/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc index 7aeff93..996e174e 100644 --- a/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc +++ b/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc
@@ -28,6 +28,11 @@ return instance.get(); } +// static +void SodaInstaller::RegisterLocalStatePrefs(PrefRegistrySimple* registry) { + registry->RegisterTimePref(prefs::kSodaScheduledDeletionTime, base::Time()); +} + SodaInstallerImplChromeOS::SodaInstallerImplChromeOS() = default; SodaInstallerImplChromeOS::~SodaInstallerImplChromeOS() = default;
diff --git a/chrome/browser/ash/borealis/borealis_app_launcher.cc b/chrome/browser/ash/borealis/borealis_app_launcher.cc index bbf971f95..9efe752d 100644 --- a/chrome/browser/ash/borealis/borealis_app_launcher.cc +++ b/chrome/browser/ash/borealis/borealis_app_launcher.cc
@@ -14,8 +14,8 @@ #include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" #include "chromeos/dbus/cicerone/cicerone_service.pb.h" -#include "chromeos/dbus/cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" namespace borealis {
diff --git a/chrome/browser/ash/borealis/borealis_app_launcher_unittest.cc b/chrome/browser/ash/borealis/borealis_app_launcher_unittest.cc index ccc4f047..0b05d93 100644 --- a/chrome/browser/ash/borealis/borealis_app_launcher_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_app_launcher_unittest.cc
@@ -13,8 +13,8 @@ #include "chrome/browser/ash/guest_os/guest_os_registry_service.h" #include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/vm_applications/apps.pb.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/ash/borealis/borealis_context_unittest.cc b/chrome/browser/ash/borealis/borealis_context_unittest.cc index 57de964..ccb46a1 100644 --- a/chrome/browser/ash/borealis/borealis_context_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_context_unittest.cc
@@ -15,9 +15,9 @@ #include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" #include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/fake_chunneld_client.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/fake_seneschal_client.h" #include "content/public/test/browser_task_environment.h"
diff --git a/chrome/browser/ash/borealis/borealis_launch_watcher.h b/chrome/browser/ash/borealis/borealis_launch_watcher.h index acf5f356..3304a6d 100644 --- a/chrome/browser/ash/borealis/borealis_launch_watcher.h +++ b/chrome/browser/ash/borealis/borealis_launch_watcher.h
@@ -8,7 +8,7 @@ #include "base/callback.h" #include "base/containers/queue.h" #include "base/memory/weak_ptr.h" -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" class Profile;
diff --git a/chrome/browser/ash/borealis/borealis_launch_watcher_unittest.cc b/chrome/browser/ash/borealis/borealis_launch_watcher_unittest.cc index f45a65d..7a812ce 100644 --- a/chrome/browser/ash/borealis/borealis_launch_watcher_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_launch_watcher_unittest.cc
@@ -8,8 +8,8 @@ #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/ash/borealis/borealis_task_unittest.cc b/chrome/browser/ash/borealis/borealis_task_unittest.cc index 232fe79..3a4d59ab 100644 --- a/chrome/browser/ash/borealis/borealis_task_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_task_unittest.cc
@@ -11,9 +11,9 @@ #include "chrome/browser/ash/borealis/borealis_metrics.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dlcservice/fake_dlcservice_client.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/ash/certificate_provider/certificate_provider_service_unittest.cc b/chrome/browser/ash/certificate_provider/certificate_provider_service_unittest.cc index 924bc8dc8..4796f6e 100644 --- a/chrome/browser/ash/certificate_provider/certificate_provider_service_unittest.cc +++ b/chrome/browser/ash/certificate_provider/certificate_provider_service_unittest.cc
@@ -14,6 +14,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/stl_util.h" +#include "base/strings/string_piece.h" #include "base/test/test_mock_time_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/ash/certificate_provider/certificate_provider.h" @@ -567,7 +568,7 @@ net::x509_util::CryptoBufferAsStringPiece( cert_info1_.certificate->cert_buffer()), &client1_spki_piece)); - std::string client1_spki = client1_spki_piece.as_string(); + std::string client1_spki(client1_spki_piece); std::unique_ptr<net::ClientCertIdentity> cert(ProvideDefaultCert()); ASSERT_TRUE(cert);
diff --git a/chrome/browser/ash/certificate_provider/test_certificate_provider_extension.cc b/chrome/browser/ash/certificate_provider/test_certificate_provider_extension.cc index 1002256..0eba316 100644 --- a/chrome/browser/ash/certificate_provider/test_certificate_provider_extension.cc +++ b/chrome/browser/ash/certificate_provider/test_certificate_provider_extension.cc
@@ -182,7 +182,7 @@ &spki_bytes)) { return {}; } - return spki_bytes.as_string(); + return std::string(spki_bytes); } TestCertificateProviderExtension::TestCertificateProviderExtension(
diff --git a/chrome/browser/ash/certificate_provider/thread_safe_certificate_map.cc b/chrome/browser/ash/certificate_provider/thread_safe_certificate_map.cc index c1f63d8..d4eda1ef 100644 --- a/chrome/browser/ash/certificate_provider/thread_safe_certificate_map.cc +++ b/chrome/browser/ash/certificate_provider/thread_safe_certificate_map.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/containers/flat_map.h" +#include "base/strings/string_piece.h" #include "base/synchronization/lock.h" #include "chrome/browser/ash/certificate_provider/certificate_info.h" #include "net/base/hash_value.h" @@ -26,7 +27,7 @@ &spki_bytes)) { return {}; } - return spki_bytes.as_string(); + return std::string(spki_bytes); } } // namespace
diff --git a/chrome/browser/ash/child_accounts/family_user_app_metrics.cc b/chrome/browser/ash/child_accounts/family_user_app_metrics.cc index a7c3c256..1a17ff4 100644 --- a/chrome/browser/ash/child_accounts/family_user_app_metrics.cc +++ b/chrome/browser/ash/child_accounts/family_user_app_metrics.cc
@@ -7,8 +7,8 @@ #include <memory> #include "base/check.h" +#include "base/containers/contains.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" #include "base/time/time.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
diff --git a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc index 60f964e..a1d4b5d 100644 --- a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc +++ b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
@@ -27,9 +27,9 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dlcservice/dlcservice_client.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/fake_seneschal_client.h" #include "chromeos/dbus/seneschal/seneschal_service.pb.h"
diff --git a/chrome/browser/ash/guest_os/guest_os_stability_monitor.h b/chrome/browser/ash/guest_os/guest_os_stability_monitor.h index 25d8b2a..7a0954a 100644 --- a/chrome/browser/ash/guest_os/guest_os_stability_monitor.h +++ b/chrome/browser/ash/guest_os/guest_os_stability_monitor.h
@@ -8,7 +8,7 @@ #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "chromeos/dbus/chunneld_client.h" -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" #include "chromeos/dbus/concierge_client.h" #include "chromeos/dbus/seneschal_client.h"
diff --git a/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc b/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc index daf9b67..771b15d0 100644 --- a/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc +++ b/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc
@@ -14,9 +14,9 @@ #include "chrome/browser/chromeos/crostini/crostini_test_helper.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/fake_chunneld_client.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/fake_seneschal_client.h" #include "content/public/test/browser_task_environment.h"
diff --git a/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc b/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc index c9b3f7b1..12068905 100644 --- a/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc +++ b/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc
@@ -26,6 +26,7 @@ #include "base/run_loop.h" #include "base/scoped_observation.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" @@ -2638,7 +2639,7 @@ KioskVirtualKeyboardTestSoundsManagerTestImpl() {} bool Initialize(SoundKey key, const base::StringPiece& data) override { - sound_data_[key] = data.as_string(); + sound_data_[key] = std::string(data); return true; }
diff --git a/chrome/browser/ash/login/arc_terms_of_service_browsertest.cc b/chrome/browser/ash/login/arc_terms_of_service_browsertest.cc index c116f41..c8220c2 100644 --- a/chrome/browser/ash/login/arc_terms_of_service_browsertest.cc +++ b/chrome/browser/ash/login/arc_terms_of_service_browsertest.cc
@@ -249,10 +249,9 @@ // The string will have the format "http://127.0.0.1:${PORT_NUMBER}" where // PORT_NUMBER is a randomly assigned port number. std::string TestServerBaseUrl() { - return base::TrimString( - embedded_test_server()->base_url().GetOrigin().spec(), "/", - base::TrimPositions::TRIM_TRAILING) - .as_string(); + return std::string( + base::TrimString(embedded_test_server()->base_url().GetOrigin().spec(), + "/", base::TrimPositions::TRIM_TRAILING)); } // Handles both Terms of Service and Privacy policy requests.
diff --git a/chrome/browser/ash/login/login_client_cert_usage_observer.cc b/chrome/browser/ash/login/login_client_cert_usage_observer.cc index f9bab65..930949a 100644 --- a/chrome/browser/ash/login/login_client_cert_usage_observer.cc +++ b/chrome/browser/ash/login/login_client_cert_usage_observer.cc
@@ -42,7 +42,7 @@ std::vector<uint16_t> ssl_algorithms; std::string extension_id; if (!certificate_provider_service->LookUpSpki( - spki.as_string(), &ssl_algorithms, &extension_id)) { + std::string(spki), &ssl_algorithms, &extension_id)) { return false; } signature_algorithms->clear();
diff --git a/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc b/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc index f618ff9e..449a9a2 100644 --- a/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/terms_of_service_screen_browsertest.cc
@@ -153,10 +153,9 @@ } std::string TestServerBaseUrl() { - return base::TrimString( - embedded_test_server()->base_url().GetOrigin().spec(), "/", - base::TrimPositions::TRIM_TRAILING) - .as_string(); + return std::string( + base::TrimString(embedded_test_server()->base_url().GetOrigin().spec(), + "/", base::TrimPositions::TRIM_TRAILING)); } std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_files.cc b/chrome/browser/ash/plugin_vm/plugin_vm_files.cc index a86b1c4..6b715f6 100644 --- a/chrome/browser/ash/plugin_vm/plugin_vm_files.cc +++ b/chrome/browser/ash/plugin_vm/plugin_vm_files.cc
@@ -26,8 +26,8 @@ #include "chrome/browser/ui/ash/launcher/app_window_base.h" #include "chrome/browser/ui/ash/launcher/app_window_shelf_item_controller.h" #include "chrome/browser/ui/ash/launcher/chrome_shelf_controller.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" #include "chromeos/dbus/cicerone/cicerone_service.pb.h" -#include "chromeos/dbus/cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc b/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc index e5abfb6..f8d698dac 100644 --- a/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc +++ b/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc
@@ -22,8 +22,8 @@ #include "chrome/browser/ui/ash/launcher/chrome_shelf_controller.h" #include "chrome/browser/ui/ash/launcher/shelf_controller_helper.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/vm_applications/apps.pb.h" #include "content/public/test/browser_task_environment.h" #include "storage/browser/file_system/external_mount_points.h"
diff --git a/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc b/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc index 86e88e2..b1235dd6 100644 --- a/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc +++ b/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc
@@ -14,6 +14,7 @@ #include "base/logging.h" #include "base/optional.h" #include "base/sequence_checker.h" +#include "base/strings/string_piece.h" #include "base/strings/string_piece_forward.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -54,7 +55,7 @@ const base::StringPiece key = key_value.substr(0, equal_pos); const base::StringPiece value = key_value.substr(equal_pos + 1); if (key == "rs") - rs_ = value.as_string(); + rs_ = std::string(value); } } ParsedMetadata(const ParsedMetadata&) = delete;
diff --git a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc index 846ca114..d850f24 100644 --- a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc +++ b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_bridge.cc
@@ -337,7 +337,7 @@ } DeliverWilcoDtcSupportdUiMessageToExtensions( - json_message_string.as_string(), + std::string(json_message_string), base::BindOnce( [](SendWilcoDtcMessageToUiCallback callback, const std::string& response) {
diff --git a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc index 7c059b67..c5aa18fd 100644 --- a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc +++ b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc
@@ -189,7 +189,7 @@ return; } - client_->PostMessageFromNativeHost(response_json_string.as_string()); + client_->PostMessageFromNativeHost(std::string(response_json_string)); DisposeSelf(std::string() /* error_message */); }
diff --git a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc index 5a4039a..8ff83da7 100644 --- a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc +++ b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc
@@ -11,6 +11,7 @@ #include "base/check.h" #include "base/memory/shared_memory_mapping.h" #include "base/run_loop.h" +#include "base/strings/string_piece.h" #include "base/test/task_environment.h" #include "chrome/browser/ash/wilco_dtc_supportd/mojo_utils.h" #include "chrome/browser/ash/wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h" @@ -53,9 +54,8 @@ if (!handle) return std::string(); base::ReadOnlySharedMemoryMapping shared_memory; - std::string contents = - MojoUtils::GetStringPieceFromMojoHandle(std::move(handle), &shared_memory) - .as_string(); + std::string contents(MojoUtils::GetStringPieceFromMojoHandle( + std::move(handle), &shared_memory)); CHECK(!contents.empty()); return contents; }
diff --git a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_browsertest.cc b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_browsertest.cc index fd8b4fe..2cdf7a35 100644 --- a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_browsertest.cc +++ b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_browsertest.cc
@@ -90,9 +90,8 @@ std::string response_body_release() { DCHECK(request_performed_); base::ReadOnlySharedMemoryMapping response_shared_memory; - return MojoUtils::GetStringPieceFromMojoHandle(std::move(response_handle_), - &response_shared_memory) - .as_string(); + return std::string(MojoUtils::GetStringPieceFromMojoHandle( + std::move(response_handle_), &response_shared_memory)); } private:
diff --git a/chrome/browser/autofill/automated_tests/cache_replayer.cc b/chrome/browser/autofill/automated_tests/cache_replayer.cc index 62340d2..c5eb0bd 100644 --- a/chrome/browser/autofill/automated_tests/cache_replayer.cc +++ b/chrome/browser/autofill/automated_tests/cache_replayer.cc
@@ -18,6 +18,7 @@ #include "base/numerics/safe_conversions.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" @@ -561,7 +562,7 @@ "could not cache query node content"; if (fail_on_error) { return ServerCacheReplayer::Status{ - ServerCacheReplayer::StatusCode::kBadNode, status_msg.as_string()}; + ServerCacheReplayer::StatusCode::kBadNode, std::string(status_msg)}; } else { // Keep a trace when not set to fail on bad node. VLOG(1) << status_msg;
diff --git a/chrome/browser/browser_switcher/alternative_browser_driver_unittest.cc b/chrome/browser/browser_switcher/alternative_browser_driver_unittest.cc index 29cfaaf..0d050ae 100644 --- a/chrome/browser/browser_switcher/alternative_browser_driver_unittest.cc +++ b/chrome/browser/browser_switcher/alternative_browser_driver_unittest.cc
@@ -8,6 +8,7 @@ #include <memory> #include <vector> +#include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/browser_switcher/browser_switcher_prefs.h" @@ -32,7 +33,7 @@ #if defined(OS_WIN) return base::UTF8ToWide(src); #elif defined(OS_POSIX) - return src.as_string(); + return std::string(src); #else #error "Invalid platform for browser_switcher" #endif
diff --git a/chrome/browser/browser_switcher/browser_switcher_sitelist.cc b/chrome/browser/browser_switcher/browser_switcher_sitelist.cc index cf930db5..8891a89 100644 --- a/chrome/browser/browser_switcher/browser_switcher_sitelist.cc +++ b/chrome/browser/browser_switcher/browser_switcher_sitelist.cc
@@ -14,6 +14,7 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/values.h" #include "chrome/browser/browser_switcher/browser_switcher_prefs.h" @@ -186,7 +187,7 @@ base::CompareCase::INSENSITIVE_ASCII)) spec = spec.substr(strlen(placeholder_scheme)); - *pattern = base::StrCat({prefix, spec.as_string()}); + *pattern = base::StrCat({prefix, spec}); } Decision::Decision(Action action_,
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 5e200fe..8735ce0 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -840,14 +840,14 @@ } #if !defined(OS_ANDROID) -// Check if the current url is whitelisted based on a list of whitelisted urls. -bool IsURLWhitelisted(const GURL& current_url, - base::Value::ConstListView whitelisted_urls) { +// Check if the current url is allowlisted based on a list of allowlisted urls. +bool IsURLAllowlisted(const GURL& current_url, + base::Value::ConstListView allowlisted_urls) { // Only check on HTTP and HTTPS pages. if (!current_url.SchemeIsHTTPOrHTTPS()) return false; - for (auto const& value : whitelisted_urls) { + for (auto const& value : allowlisted_urls) { ContentSettingsPattern pattern = ContentSettingsPattern::FromString(value.GetString()); if (pattern == ContentSettingsPattern::Wildcard() || !pattern.IsValid()) @@ -873,12 +873,12 @@ if (!contents) return false; - // Check if the current URL matches a URL pattern on the whitelist. - const base::ListValue* autoplay_whitelist = + // Check if the current URL matches a URL pattern on the allowlist. + const base::ListValue* autoplay_allowlist = prefs->GetList(prefs::kAutoplayWhitelist); - return autoplay_whitelist && + return autoplay_allowlist && prefs->IsManagedPreference(prefs::kAutoplayWhitelist) && - IsURLWhitelisted(contents->GetURL(), autoplay_whitelist->GetList()); + IsURLAllowlisted(contents->GetURL(), autoplay_allowlist->GetList()); } #endif @@ -1129,21 +1129,21 @@ protocol_handler_registry->IsHandledProtocol(url.scheme())) return; - bool is_whitelisted = false; + bool is_allowlisted = false; PolicyBlocklistService* service = PolicyBlocklistFactory::GetForBrowserContext( web_contents->GetBrowserContext()); if (ShouldHonorPolicies() && service) { const policy::URLBlocklist::URLBlocklistState url_state = service->GetURLBlocklistState(url); - is_whitelisted = + is_allowlisted = url_state == policy::URLBlocklist::URLBlocklistState::URL_IN_ALLOWLIST; } - // If the URL is in whitelist, we launch it without asking the user and - // without any additional security checks. Since the URL is whitelisted, + // If the URL is in allowlist, we launch it without asking the user and + // without any additional security checks. Since the URL is allowlisted, // we assume it can be executed. - if (is_whitelisted) { + if (is_allowlisted) { ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url, web_contents); } else { ExternalProtocolHandler::LaunchUrl( @@ -4468,9 +4468,9 @@ static_cast<ChromeNavigationUIData*>(navigation_ui_data); #if BUILDFLAG(SAFE_BROWSING_AVAILABLE) - bool matches_enterprise_whitelist = safe_browsing::IsURLAllowlistedByPolicy( + bool matches_enterprise_allowlist = safe_browsing::IsURLAllowlistedByPolicy( request.url, *profile->GetPrefs()); - if (!matches_enterprise_whitelist) { + if (!matches_enterprise_allowlist) { #if BUILDFLAG(SAFE_BROWSING_DB_LOCAL) auto* connectors_service = enterprise_connectors::ConnectorsServiceFactory::GetForBrowserContext(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 8eaefcc..429d728 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -4108,6 +4108,8 @@ "policy/dlp/dlp_rules_manager_test_utils.h", "policy/dlp/mock_dlp_content_manager.cc", "policy/dlp/mock_dlp_content_manager.h", + "policy/dlp/mock_dlp_rules_manager.cc", + "policy/dlp/mock_dlp_rules_manager.h", "policy/dm_token_storage_unittest.cc", "policy/extension_cache_unittest.cc", "policy/extension_install_event_log_collector_unittest.cc",
diff --git a/chrome/browser/chromeos/crostini/ansible/ansible_management_test_helper.h b/chrome/browser/chromeos/crostini/ansible/ansible_management_test_helper.h index 866b512..029c1f6 100644 --- a/chrome/browser/chromeos/crostini/ansible/ansible_management_test_helper.h +++ b/chrome/browser/chromeos/crostini/ansible/ansible_management_test_helper.h
@@ -7,7 +7,7 @@ #include "base/test/scoped_feature_list.h" #include "chromeos/dbus/cicerone/cicerone_service.pb.h" -#include "chromeos/dbus/fake_cicerone_client.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" class Profile;
diff --git a/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc b/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc index c05e984..a7711c5 100644 --- a/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc +++ b/chrome/browser/chromeos/crostini/crostini_export_import_unittest.cc
@@ -15,8 +15,8 @@ #include "chrome/browser/notifications/notification_display_service_factory.h" #include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_seneschal_client.h" #include "chromeos/dbus/seneschal/seneschal_service.pb.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_low_disk_notification.h b/chrome/browser/chromeos/crostini/crostini_low_disk_notification.h index d6107da..9928de16 100644 --- a/chrome/browser/chromeos/crostini/crostini_low_disk_notification.h +++ b/chrome/browser/chromeos/crostini/crostini_low_disk_notification.h
@@ -13,7 +13,7 @@ #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" namespace message_center { class Notification;
diff --git a/chrome/browser/chromeos/crostini/crostini_low_disk_notification_unittest.cc b/chrome/browser/chromeos/crostini/crostini_low_disk_notification_unittest.cc index 7aeb1ab..0223976 100644 --- a/chrome/browser/chromeos/crostini/crostini_low_disk_notification_unittest.cc +++ b/chrome/browser/chromeos/crostini/crostini_low_disk_notification_unittest.cc
@@ -18,8 +18,8 @@ #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile_manager.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/settings/cros_settings_names.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h index 304851cf..dc64498 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.h +++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -27,8 +27,8 @@ #include "chrome/browser/ui/browser.h" #include "chromeos/dbus/anomaly_detector/anomaly_detector.pb.h" #include "chromeos/dbus/anomaly_detector_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" #include "chromeos/dbus/cicerone/cicerone_service.pb.h" -#include "chromeos/dbus/cicerone_client.h" #include "chromeos/dbus/concierge/concierge_service.pb.h" #include "chromeos/dbus/concierge_client.h" #include "chromeos/dbus/power/power_manager_client.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc b/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc index 2d1569e2..d839061 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc +++ b/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc
@@ -35,11 +35,11 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/cicerone/cicerone_service.pb.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/concierge/concierge_service.pb.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dlcservice/dlcservice_client.h" #include "chromeos/dbus/fake_anomaly_detector_client.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/session_manager/fake_session_manager_client.h" #include "chromeos/dbus/userdataauth/fake_cryptohome_misc_client.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc b/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc index 8e8c9690..2dad4d54 100644 --- a/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc +++ b/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc
@@ -22,9 +22,9 @@ #include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/cros_disks_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/fake_seneschal_client.h" #include "chromeos/dbus/vm_applications/apps.pb.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_shelf_utils.cc b/chrome/browser/chromeos/crostini/crostini_shelf_utils.cc index 2f021fb..be4b382 100644 --- a/chrome/browser/chromeos/crostini/crostini_shelf_utils.cc +++ b/chrome/browser/chromeos/crostini/crostini_shelf_utils.cc
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "base/no_destructor.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "chrome/browser/ash/guest_os/guest_os_pref_names.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" @@ -39,7 +40,7 @@ kWMClassToNname({{"Octave-gui", "GNU Octave"}, {"MuseScore2", "MuseScore 2"}, {"XnViewMP", "XnView Multi Platform"}}); - const auto it = kWMClassToNname->find(wmclass.as_string()); + const auto it = kWMClassToNname->find(std::string(wmclass)); if (it == kWMClassToNname->end()) return nullptr; return &it->second; @@ -90,14 +91,14 @@ if (!value) continue; if (value->type() == base::Value::Type::STRING) { - if (!MatchingString(search_value.as_string(), value->GetString(), + if (!MatchingString(std::string(search_value), value->GetString(), ignore_space)) { continue; } } else if (value->type() == base::Value::Type::DICTIONARY) { // Look at the unlocalized name to see if that matches. value = value->FindKeyOfType("", base::Value::Type::STRING); - if (!value || !MatchingString(search_value.as_string(), + if (!value || !MatchingString(std::string(search_value), value->GetString(), ignore_space)) { continue; }
diff --git a/chrome/browser/chromeos/crostini/crostini_sshfs_unittest.cc b/chrome/browser/chromeos/crostini/crostini_sshfs_unittest.cc index ff32181..e044988c 100644 --- a/chrome/browser/chromeos/crostini/crostini_sshfs_unittest.cc +++ b/chrome/browser/chromeos/crostini/crostini_sshfs_unittest.cc
@@ -23,9 +23,9 @@ #include "chrome/browser/chromeos/file_manager/volume_manager.h" #include "chrome/browser/chromeos/file_manager/volume_manager_factory.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/cros_disks_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/vm_applications/apps.pb.h" #include "chromeos/disks/disk_mount_manager.h"
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index f0a9fc8..0e6272e 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -91,11 +91,6 @@ return *this; } - TestCase& EnableSmbfs() { - options.smbfs = true; - return *this; - } - TestCase& DontMountVolumes() { options.mount_volumes = false; return *this; @@ -553,7 +548,7 @@ TestCase("openQuickViewMhtml"), TestCase("openQuickViewBackgroundColorHtml"), TestCase("openQuickViewDrive"), - TestCase("openQuickViewSmbfs").EnableSmbfs(), + TestCase("openQuickViewSmbfs"), TestCase("openQuickViewAndroid"), TestCase("openQuickViewDocumentsProvider") .EnableGenericDocumentsProvider(), @@ -963,7 +958,7 @@ // Disabled until Drive quota can be properly displayed. // crbug.com/1177203 // TestCase("showAvailableStorageDrive"), - TestCase("showAvailableStorageSmbfs").EnableSmbfs(), + TestCase("showAvailableStorageSmbfs"), TestCase("showAvailableStorageDocProvider") .EnableGenericDocumentsProvider()));
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc index 25a7b03..a494084f 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -473,7 +473,7 @@ // Maps |value| to base::Time. Returns true on success. static bool MapStringToTime(base::StringPiece value, base::Time* time) { - return base::Time::FromString(value.as_string().c_str(), time); + return base::Time::FromString(std::string(value).c_str(), time); } }; }; @@ -742,7 +742,6 @@ PRINT_IF_NOT_DEFAULT(offline) PRINT_IF_NOT_DEFAULT(photos_documents_provider) PRINT_IF_NOT_DEFAULT(single_partition_format) - PRINT_IF_NOT_DEFAULT(smbfs) PRINT_IF_NOT_DEFAULT(tablet_mode) PRINT_IF_NOT_DEFAULT(zip) PRINT_IF_NOT_DEFAULT(zip_no_nacl) @@ -1684,10 +1683,6 @@ arc::SetArcAvailableCommandLineForTesting(command_line); } - if (options.smbfs) { - enabled_features.push_back(features::kSmbFs); - } - if (options.zip_no_nacl) { enabled_features.push_back(chromeos::features::kFilesZipMount); enabled_features.push_back(chromeos::features::kFilesZipPack); @@ -1884,9 +1879,7 @@ } } - if (options.smbfs) { - smbfs_volume_ = std::make_unique<SmbfsTestVolume>(); - } + smbfs_volume_ = std::make_unique<SmbfsTestVolume>(); display_service_ = std::make_unique<NotificationDisplayServiceTester>(profile());
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h index b8440d2..b817dff 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
@@ -94,9 +94,6 @@ // Whether test needs a native SMB file system provider. bool native_smb = true; - // Whether test needs smbfs for native SMB integration. - bool smbfs = false; - // Whether FilesApp should start with volumes mounted. bool mount_volumes = true;
diff --git a/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc b/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc index fc3533b..0052bae 100644 --- a/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc +++ b/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc
@@ -16,8 +16,8 @@ #include "chrome/browser/chromeos/file_manager/path_util.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/cicerone/cicerone_service.pb.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/input_method/assistive_suggester.cc b/chrome/browser/chromeos/input_method/assistive_suggester.cc index b0995d13..62fc2c2 100644 --- a/chrome/browser/chromeos/input_method/assistive_suggester.cc +++ b/chrome/browser/chromeos/input_method/assistive_suggester.cc
@@ -323,12 +323,14 @@ context_id_ = context_id; personal_info_suggester_.OnFocus(context_id_); emoji_suggester_.OnFocus(context_id_); + multi_word_suggester_.OnFocus(context_id_); } void AssistiveSuggester::OnBlur() { context_id_ = -1; personal_info_suggester_.OnBlur(); emoji_suggester_.OnBlur(); + multi_word_suggester_.OnBlur(); } bool AssistiveSuggester::OnKeyEvent(const ui::KeyEvent& event) {
diff --git a/chrome/browser/chromeos/input_method/component_extension_ime_manager_delegate_impl.cc b/chrome/browser/chromeos/input_method/component_extension_ime_manager_delegate_impl.cc index 39afba3..7cbaac5c 100644 --- a/chrome/browser/chromeos/input_method/component_extension_ime_manager_delegate_impl.cc +++ b/chrome/browser/chromeos/input_method/component_extension_ime_manager_delegate_impl.cc
@@ -15,6 +15,7 @@ #include "base/logging.h" #include "base/path_service.h" #include "base/stl_util.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/system/sys_info.h" #include "base/task/post_task.h" @@ -356,7 +357,7 @@ ComponentExtensionIME component_ime; ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); component_ime.manifest = - rb.GetRawDataResource(extension.manifest_resource_id).as_string(); + std::string(rb.GetRawDataResource(extension.manifest_resource_id)); if (component_ime.manifest.empty()) { LOG(ERROR) << "Couldn't get manifest from resource_id("
diff --git a/chrome/browser/chromeos/input_method/fake_suggestion_handler.cc b/chrome/browser/chromeos/input_method/fake_suggestion_handler.cc index 0ca2750..783a574 100644 --- a/chrome/browser/chromeos/input_method/fake_suggestion_handler.cc +++ b/chrome/browser/chromeos/input_method/fake_suggestion_handler.cc
@@ -28,7 +28,11 @@ bool FakeSuggestionHandler::AcceptSuggestion(int context_id, std::string* error) { - return false; + showing_suggestion_ = false; + accepted_suggestion_ = true; + suggestion_text_ = u""; + confirmed_length_ = 0; + return true; } void FakeSuggestionHandler::OnSuggestionsChanged(
diff --git a/chrome/browser/chromeos/input_method/fake_suggestion_handler.h b/chrome/browser/chromeos/input_method/fake_suggestion_handler.h index c6735d17..2912dc72 100644 --- a/chrome/browser/chromeos/input_method/fake_suggestion_handler.h +++ b/chrome/browser/chromeos/input_method/fake_suggestion_handler.h
@@ -47,6 +47,7 @@ std::u16string GetSuggestionText() { return suggestion_text_; } size_t GetConfirmedLength() { return confirmed_length_; } bool GetShowingSuggestion() { return showing_suggestion_; } + bool GetAcceptedSuggestion() { return accepted_suggestion_; } bool GetDismissedSuggestion() { return dismissed_suggestion_; } private: @@ -54,6 +55,7 @@ std::u16string suggestion_text_; size_t confirmed_length_ = 0; bool showing_suggestion_ = false; + bool accepted_suggestion_ = false; bool dismissed_suggestion_ = false; };
diff --git a/chrome/browser/chromeos/input_method/multi_word_suggester.cc b/chrome/browser/chromeos/input_method/multi_word_suggester.cc index 3d3f3bc8..265c113 100644 --- a/chrome/browser/chromeos/input_method/multi_word_suggester.cc +++ b/chrome/browser/chromeos/input_method/multi_word_suggester.cc
@@ -8,6 +8,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/chromeos/input_method/ui/suggestion_details.h" #include "chromeos/services/ime/public/cpp/suggestions.h" +#include "ui/events/keycodes/dom/dom_code.h" namespace chromeos { namespace { @@ -52,12 +53,17 @@ } SuggestionStatus MultiWordSuggester::HandleKeyEvent(const ui::KeyEvent& event) { - if (suggestion_shown_) { - DismissSuggestion(); - return SuggestionStatus::kDismiss; - } + if (!suggestion_shown_) + return SuggestionStatus::kNotHandled; - return SuggestionStatus::kNotHandled; + switch (event.code()) { + case ui::DomCode::TAB: + AcceptSuggestion(); + return SuggestionStatus::kAccept; + default: + DismissSuggestion(); + return SuggestionStatus::kDismiss; + } } bool MultiWordSuggester::Suggest(const std::u16string& text) { @@ -65,7 +71,15 @@ } bool MultiWordSuggester::AcceptSuggestion(size_t index) { - return false; + std::string error; + suggestion_handler_->AcceptSuggestion(focused_context_id_, &error); + if (!error.empty()) { + LOG(ERROR) << "suggest: failed to accept suggestion - " << error; + return false; + } + + suggestion_shown_ = false; + return true; } void MultiWordSuggester::DismissSuggestion() {
diff --git a/chrome/browser/chromeos/input_method/multi_word_suggester_unittest.cc b/chrome/browser/chromeos/input_method/multi_word_suggester_unittest.cc index 0f1aa80..43e3ef05 100644 --- a/chrome/browser/chromeos/input_method/multi_word_suggester_unittest.cc +++ b/chrome/browser/chromeos/input_method/multi_word_suggester_unittest.cc
@@ -76,7 +76,7 @@ EXPECT_EQ(suggestion_handler.GetSuggestionText(), u"hello there!"); } -TEST(MultiWordSuggesterTest, ImmediatelyDismissesSuggestionOnKeyEvent) { +TEST(MultiWordSuggesterTest, AcceptsSuggestionOnTabPress) { FakeSuggestionHandler suggestion_handler; MultiWordSuggester suggester(&suggestion_handler); int focused_context_id = 5; @@ -92,7 +92,29 @@ SendKeyEvent(&suggester, ui::DomCode::TAB); EXPECT_FALSE(suggestion_handler.GetShowingSuggestion()); + EXPECT_FALSE(suggestion_handler.GetDismissedSuggestion()); + EXPECT_TRUE(suggestion_handler.GetAcceptedSuggestion()); + EXPECT_EQ(suggestion_handler.GetSuggestionText(), u""); +} + +TEST(MultiWordSuggesterTest, DismissesSuggestionOnNonTabKeypress) { + FakeSuggestionHandler suggestion_handler; + MultiWordSuggester suggester(&suggestion_handler); + int focused_context_id = 5; + + std::vector<TextSuggestion> suggestions = { + TextSuggestion{.mode = TextSuggestionMode::kPrediction, + .type = TextSuggestionType::kMultiWord, + .text = "hi there!"}, + }; + + suggester.OnFocus(focused_context_id); + suggester.OnExternalSuggestionsUpdated(suggestions); + SendKeyEvent(&suggester, ui::DomCode::ARROW_DOWN); + + EXPECT_FALSE(suggestion_handler.GetShowingSuggestion()); EXPECT_TRUE(suggestion_handler.GetDismissedSuggestion()); + EXPECT_FALSE(suggestion_handler.GetAcceptedSuggestion()); EXPECT_EQ(suggestion_handler.GetSuggestionText(), u""); }
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc b/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc index 6ab54fa9..c762e22 100644 --- a/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc +++ b/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/optional.h" #include "chrome/browser/chromeos/platform_keys/platform_keys_service.h" #include <cert.h> @@ -27,7 +26,9 @@ #include "base/logging.h" #include "base/macros.h" #include "base/metrics/histogram_macros.h" +#include "base/optional.h" #include "base/single_thread_task_runner.h" +#include "base/strings/string_piece.h" #include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/browser_process.h" @@ -1639,7 +1640,7 @@ net::x509_util::CryptoBufferAsStringPiece(certificate->cert_buffer()), &spki_bytes)) return {}; - return spki_bytes.as_string(); + return std::string(spki_bytes); } // Extracts the public exponent out of an EVP_PKEY and verifies if it is equal
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc index 930e71d4..fd08a1ac 100644 --- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc +++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -673,6 +673,15 @@ settings_proto.system_proxy_settings(), policies); } } + + if (policy.has_device_debug_packet_capture_allowed() && + policy.device_debug_packet_capture_allowed().has_allowed()) { + policies->Set( + key::kDeviceDebugPacketCaptureAllowed, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, + base::Value(policy.device_debug_packet_capture_allowed().allowed()), + nullptr); + } } void DecodeReportingPolicies(const em::ChromeDeviceSettingsProto& policy, @@ -1943,15 +1952,6 @@ POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(allowlist), nullptr); } - - if (policy.has_device_debug_packet_capture_allowed() && - policy.device_debug_packet_capture_allowed().has_allowed()) { - policies->Set( - key::kDeviceDebugPacketCaptureAllowed, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, - base::Value(policy.device_debug_packet_capture_allowed().allowed()), - nullptr); - } } } // namespace
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc index b4c9b6f..cb9a437 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_unittest.cc
@@ -11,7 +11,7 @@ #include "base/test/mock_callback.h" #include "chrome/browser/chromeos/policy/dlp/dlp_histogram_helper.h" #include "chrome/browser/chromeos/policy/dlp/dlp_reporting_manager.h" -#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h" +#include "chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/chrome_constants.h" #include "chrome/test/base/testing_browser_process.h" @@ -32,34 +32,6 @@ constexpr char kExample1Url[] = "https://www.example1.com"; constexpr char kExample2Url[] = "https://www.example2.com"; -class MockDlpRulesManager : public DlpRulesManager { - public: - MockDlpRulesManager() = default; - ~MockDlpRulesManager() override = default; - - MOCK_CONST_METHOD2(IsRestricted, - Level(const GURL& source, Restriction restriction)); - - MOCK_CONST_METHOD3(IsRestrictedDestination, - Level(const GURL& source, - const GURL& destination, - Restriction restriction)); - - MOCK_CONST_METHOD3(IsRestrictedComponent, - Level(const GURL& source, - const Component& destination, - Restriction restriction)); - - MOCK_CONST_METHOD3(IsRestrictedAnyOfComponents, - Level(const GURL& source, - const std::vector<Component>& destinations, - Restriction restriction)); - - MOCK_CONST_METHOD0(IsReportingEnabled, bool()); - - MOCK_CONST_METHOD0(GetReportingManager, DlpReportingManager*()); -}; - class MockDlpController : public DataTransferDlpController { public: explicit MockDlpController(const DlpRulesManager& dlp_rules_manager)
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc index c6129ea..3eb31e6 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc +++ b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc
@@ -93,16 +93,38 @@ : level_2; } -// Inserts a mapping between URLs conditions IDs range to `rule_id` in `map`. -void InsertUrlsRulesMapping( - DlpRulesManagerImpl::UrlConditionId url_condition_id_start, - DlpRulesManagerImpl::UrlConditionId url_condition_id_end, - DlpRulesManagerImpl::RuleId rule_id, - std::map<DlpRulesManagerImpl::UrlConditionId, DlpRulesManagerImpl::RuleId>& - map) { - for (auto url_condition_id = url_condition_id_start; - url_condition_id <= url_condition_id_end; ++url_condition_id) { - map[url_condition_id] = rule_id; +// Creates `urls` conditions, saves patterns strings mapping in +// `patterns_mapping`, and saves conditions ids to rules ids mapping in `map`. +void AddUrlConditions(url_matcher::URLMatcher* matcher, + DlpRulesManagerImpl::UrlConditionId& condition_id, + const base::Value* urls, + url_matcher::URLMatcherConditionSet::Vector& conditions, + std::map<DlpRulesManagerImpl::UrlConditionId, + std::string>& patterns_mapping, + DlpRulesManagerImpl::RuleId rule_id, + std::map<DlpRulesManagerImpl::UrlConditionId, + DlpRulesManagerImpl::RuleId>& map) { + DCHECK(urls); + std::string scheme; + std::string host; + uint16_t port = 0; + std::string path; + std::string query; + bool match_subdomains = true; + for (const auto& list_entry : urls->GetList()) { + std::string url = list_entry.GetString(); + if (!url_util::FilterToComponents(url, &scheme, &host, &match_subdomains, + &port, &path, &query)) { + LOG(ERROR) << "Invalid pattern " << url; + continue; + } + auto condition_set = url_util::CreateConditionSet( + matcher, ++condition_id, scheme, host, match_subdomains, port, path, + query, /*allow=*/true); + + conditions.push_back(std::move(condition_set)); + map[condition_id] = rule_id; + patterns_mapping[condition_id] = url; } } @@ -238,6 +260,10 @@ dst_url_rules_mapping_.clear(); src_url_matcher_ = std::make_unique<url_matcher::URLMatcher>(); dst_url_matcher_ = std::make_unique<url_matcher::URLMatcher>(); + src_pattterns_mapping_.clear(); + dst_pattterns_mapping_.clear(); + src_conditions_.clear(); + dst_conditions_.clear(); if (!base::FeatureList::IsEnabled(features::kDataLeakPreventionPolicy)) { return; @@ -268,24 +294,18 @@ DCHECK(sources_urls); // This DCHECK should be removed when other types are // supported as sources. - UrlConditionId prev_src_url_condition_id = src_url_condition_id; - url_util::AddFilters(src_url_matcher_.get(), /* allowed= */ true, - &src_url_condition_id, - &base::Value::AsListValue(*sources_urls)); - InsertUrlsRulesMapping(prev_src_url_condition_id + 1, src_url_condition_id, - rules_counter, src_url_rules_mapping_); + AddUrlConditions(src_url_matcher_.get(), src_url_condition_id, sources_urls, + src_conditions_, src_pattterns_mapping_, rules_counter, + src_url_rules_mapping_); const auto* destinations = rule.FindDictKey("destinations"); const auto* destinations_urls = destinations ? destinations->FindListKey("urls") : nullptr; if (destinations_urls) { - UrlConditionId prev_dst_url_condition_id = dst_url_condition_id; - url_util::AddFilters(dst_url_matcher_.get(), /* allowed= */ true, - &dst_url_condition_id, - &base::Value::AsListValue(*destinations_urls)); - InsertUrlsRulesMapping(prev_dst_url_condition_id + 1, - dst_url_condition_id, rules_counter, - dst_url_rules_mapping_); + AddUrlConditions(dst_url_matcher_.get(), dst_url_condition_id, + destinations_urls, dst_conditions_, + dst_pattterns_mapping_, rules_counter, + dst_url_rules_mapping_); } const auto* destinations_components = destinations ? destinations->FindListKey("components") : nullptr; @@ -335,6 +355,9 @@ ++rules_counter; } + src_url_matcher_->AddConditionSets(src_conditions_); + dst_url_matcher_->AddConditionSets(dst_conditions_); + if (base::Contains(restrictions_map_, Restriction::kClipboard)) { DataTransferDlpController::Init(*this); } else {
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.h b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.h index 2141cae..7cc809f7 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.h +++ b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.h
@@ -67,18 +67,24 @@ // Used to track kDlpRulesList local state pref. PrefChangeRegistrar pref_change_registrar_; - // Used to match the URLs of the sources. - std::unique_ptr<url_matcher::URLMatcher> src_url_matcher_; - - // Used to match the URLs of the destinations. - std::unique_ptr<url_matcher::URLMatcher> dst_url_matcher_; - // Map from the components to their configured rules IDs. std::map<Component, std::set<RuleId>> components_rules_; // Map from the restrictions to their configured rules IDs and levels. std::map<Restriction, std::map<RuleId, Level>> restrictions_map_; + // Vector of source urls conditions. + url_matcher::URLMatcherConditionSet::Vector src_conditions_; + + // Vector of destination urls conditions. + url_matcher::URLMatcherConditionSet::Vector dst_conditions_; + + // Used to match the URLs of the sources. + std::unique_ptr<url_matcher::URLMatcher> src_url_matcher_; + + // Used to match the URLs of the destinations. + std::unique_ptr<url_matcher::URLMatcher> dst_url_matcher_; + // Map from the URL matching conditions IDs of the sources to their configured // rules IDs. std::map<UrlConditionId, RuleId> src_url_rules_mapping_; @@ -87,6 +93,14 @@ // configured rules IDs. std::map<UrlConditionId, RuleId> dst_url_rules_mapping_; + // Map from the URL matching conditions IDs of the sources to their string + // patterns. + std::map<UrlConditionId, std::string> src_pattterns_mapping_; + + // Map from the URL matching conditions IDs of the destinations to their + // string patterns. + std::map<UrlConditionId, std::string> dst_pattterns_mapping_; + std::unique_ptr<DlpReportingManager> reporting_manager_; };
diff --git a/chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc b/chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc new file mode 100644 index 0000000..9f19eef --- /dev/null +++ b/chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.cc
@@ -0,0 +1,13 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h" + +namespace policy { + +MockDlpRulesManager::MockDlpRulesManager() = default; + +MockDlpRulesManager::~MockDlpRulesManager() = default; + +} // namespace policy
diff --git a/chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h b/chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h new file mode 100644 index 0000000..29f7ca4 --- /dev/null +++ b/chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h
@@ -0,0 +1,43 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DLP_MOCK_DLP_RULES_MANAGER_H_ +#define CHROME_BROWSER_CHROMEOS_POLICY_DLP_MOCK_DLP_RULES_MANAGER_H_ + +#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace policy { +class MockDlpRulesManager : public DlpRulesManager { + public: + MockDlpRulesManager(); + ~MockDlpRulesManager() override; + + MOCK_CONST_METHOD2(IsRestricted, + Level(const GURL& source, Restriction restriction)); + + MOCK_CONST_METHOD3(IsRestrictedDestination, + Level(const GURL& source, + const GURL& destination, + Restriction restriction)); + + MOCK_CONST_METHOD3(IsRestrictedComponent, + Level(const GURL& source, + const Component& destination, + Restriction restriction)); + + MOCK_CONST_METHOD3(IsRestrictedAnyOfComponents, + Level(const GURL& source, + const std::vector<Component>& destinations, + Restriction restriction)); + + MOCK_CONST_METHOD0(IsReportingEnabled, bool()); + + MOCK_CONST_METHOD0(GetReportingManager, DlpReportingManager*()); +}; + +} // namespace policy + +#endif // CHROME_BROWSER_CHROMEOS_POLICY_DLP_MOCK_DLP_RULES_MANAGER_H_
diff --git a/chrome/browser/chromeos/printing/specifics_translation.cc b/chrome/browser/chromeos/printing/specifics_translation.cc index 77d266fb..2403cdc4 100644 --- a/chrome/browser/chromeos/printing/specifics_translation.cc +++ b/chrome/browser/chromeos/printing/specifics_translation.cc
@@ -131,7 +131,7 @@ } std::string MakeAndModel(base::StringPiece make, base::StringPiece model) { - return base::StartsWith(model, make) ? model.as_string() + return base::StartsWith(model, make) ? std::string(model) : base::JoinString({make, model}, " "); }
diff --git a/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc b/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc index 2750993..3f66200 100644 --- a/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc +++ b/chrome/browser/chromeos/printing/zeroconf_printer_detector.cc
@@ -10,6 +10,7 @@ #include "base/containers/contains.h" #include "base/hash/md5.h" #include "base/stl_util.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -81,24 +82,24 @@ base::StringPiece value(m.data() + equal_pos + 1, m.length() - (equal_pos + 1)); if (key == "note") { - note = value.as_string(); + note = std::string(value); } else if (key == "pdl") { - pdl = value.as_string(); + pdl = std::string(value); } else if (key == "product") { // Strip parens; ignore anything not enclosed in parens as malformed. if (base::StartsWith(value, "(") && base::EndsWith(value, ")")) { - product = value.substr(1, value.size() - 2).as_string(); + product = std::string(value.substr(1, value.size() - 2)); } } else if (key == "rp") { - rp = value.as_string(); + rp = std::string(value); } else if (key == "ty") { - ty = value.as_string(); + ty = std::string(value); } else if (key == "usb_MDL") { - usb_MDL = value.as_string(); + usb_MDL = std::string(value); } else if (key == "usb_MFG") { - usb_MFG = value.as_string(); + usb_MFG = std::string(value); } else if (key == "UUID") { - UUID = value.as_string(); + UUID = std::string(value); } } }
diff --git a/chrome/browser/chromeos/smb_client/smb_service.cc b/chrome/browser/chromeos/smb_client/smb_service.cc index a0268b2..c8489576 100644 --- a/chrome/browser/chromeos/smb_client/smb_service.cc +++ b/chrome/browser/chromeos/smb_client/smb_service.cc
@@ -83,8 +83,10 @@ return std::make_unique<NetBiosClient>(network_context); } +// TODO(crbug.com/1203884): Remove this method and any code conditional on it +// being false. bool IsSmbFsEnabled() { - return base::FeatureList::IsEnabled(features::kSmbFs); + return true; } // Metric recording functions.
diff --git a/chrome/browser/chromeos/smb_client/smb_service.h b/chrome/browser/chromeos/smb_client/smb_service.h index e4bfaa0..a55b8db 100644 --- a/chrome/browser/chromeos/smb_client/smb_service.h +++ b/chrome/browser/chromeos/smb_client/smb_service.h
@@ -131,8 +131,6 @@ void SuspendDone(base::TimeDelta sleep_duration) override; private: - friend class SmbServiceTest; - using MountInternalCallback = base::OnceCallback<void(SmbMountResult result, const base::FilePath& mount_path)>;
diff --git a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc index cce8895..9b1b3f1 100644 --- a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc +++ b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
@@ -64,8 +64,6 @@ namespace { -const file_system_provider::ProviderId kProviderId = - file_system_provider::ProviderId::CreateFromNativeId("smb"); constexpr char kTestUser[] = "foobar"; constexpr char kTestPassword[] = "my_secret_password"; constexpr char kTestDomain[] = "EXAMPLE.COM"; @@ -84,25 +82,6 @@ *out = result; } -class MockSmbProviderClient : public chromeos::FakeSmbProviderClient { - public: - MockSmbProviderClient() - : FakeSmbProviderClient(true /* should_run_synchronously */) {} - - MOCK_METHOD(void, - Mount, - (const base::FilePath& share_path, - const MountOptions& options, - base::ScopedFD password_fd, - SmbProviderClient::MountCallback callback), - (override)); - MOCK_METHOD(void, - SetupKerberos, - (const std::string& account_id, - SmbProviderClient::SetupKerberosCallback callback), - (override)); -}; - class MockSmbFsMounter : public smbfs::SmbFsMounter { public: MOCK_METHOD(void, @@ -137,23 +116,6 @@ mojo::Receiver<smbfs::mojom::SmbFs> receiver_; }; -// Gets a password from |password_fd|. The data has to be in the format of -// "{password_length}{password}". -std::string GetPassword(const base::ScopedFD& password_fd) { - size_t password_length = 0; - - // Read sizeof(password_length) bytes from the file to get the length. - EXPECT_TRUE(base::ReadFromFD(password_fd.get(), - reinterpret_cast<char*>(&password_length), - sizeof(password_length))); - - // Read the password into the buffer. - std::string password(password_length, 'a'); - EXPECT_TRUE( - base::ReadFromFD(password_fd.get(), &password[0], password_length)); - return password; -} - // Creates a new VolumeManager for tests. // By default, VolumeManager KeyedService is null for testing. std::unique_ptr<KeyedService> BuildVolumeManager( @@ -169,434 +131,6 @@ } // namespace -class SmbServiceTest : public testing::Test { - protected: - SmbServiceTest() - : task_environment_(content::BrowserTaskEnvironment::REAL_IO_THREAD) { - scoped_feature_list_.InitWithFeatures({}, {features::kSmbFs}); - - profile_manager_ = std::make_unique<TestingProfileManager>( - TestingBrowserProcess::GetGlobal()); - EXPECT_TRUE(profile_manager_->SetUp()); - - std::unique_ptr<FakeChromeUserManager> user_manager_temp = - std::make_unique<FakeChromeUserManager>(); - - profile_ = profile_manager_->CreateTestingProfile("test-user@example.com"); - user_manager_temp->AddUser( - AccountId::FromUserEmail(profile_->GetProfileUserName())); - - ad_user_email_ = base::StrCat({kTestADUser, "@", kTestADDomain}); - ad_profile_ = profile_manager_->CreateTestingProfile(ad_user_email_); - user_manager_temp->AddUserWithAffiliationAndTypeAndProfile( - AccountId::AdFromUserEmailObjGuid(ad_profile_->GetProfileUserName(), - kTestADGuid), - false, user_manager::UserType::USER_TYPE_ACTIVE_DIRECTORY, ad_profile_); - - // Run pending async tasks resulting from profile construction to ensure - // these are complete before the test begins. - base::RunLoop().RunUntilIdle(); - - user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(user_manager_temp)); - - mock_client_ = new MockSmbProviderClient; - // The mock needs to be marked as leaked because ownership is passed to - // DBusThreadManager. - testing::Mock::AllowLeak(mock_client_); - chromeos::DBusThreadManager::GetSetterForTesting()->SetSmbProviderClient( - base::WrapUnique(mock_client_)); - - mount_options_.display_name = kDisplayName; - } - - ~SmbServiceTest() override {} - - void CreateFspRegistry(TestingProfile* profile) { - // Create FSP service. - registry_ = new file_system_provider::FakeRegistry; - file_system_provider::Service::Get(profile)->SetRegistryForTesting( - base::WrapUnique(registry_)); - } - - void CreateService(TestingProfile* profile) { - SmbService::DisableShareDiscoveryForTesting(); - - // Create smb service. - smb_service_ = std::make_unique<SmbService>( - profile, std::make_unique<base::SimpleTestTickClock>()); - } - - void ExpectInvalidUrl(const std::string& url) { - SmbMountResult result = SmbMountResult::kSuccess; - smb_service_->Mount({} /* options */, base::FilePath(url), - "" /* username */, "" /* password */, - false /* use_chromad_kerberos */, - false /* should_open_file_manager_after_mount */, - false /* save_credentials */, - base::BindOnce(&SaveMountResult, &result)); - EXPECT_EQ(result, SmbMountResult::kInvalidUrl); - } - - void ExpectInvalidSsoUrl(const std::string& url) { - SmbMountResult result = SmbMountResult::kSuccess; - smb_service_->Mount({} /* options */, base::FilePath(url), - "" /* username */, "" /* password */, - true /* use_chromad_kerberos */, - false /* should_open_file_manager_after_mount */, - false /* save_credentials */, - base::BindOnce(&SaveMountResult, &result)); - EXPECT_EQ(result, SmbMountResult::kInvalidSsoUrl); - } - - void WaitForSetupComplete() { - { - base::RunLoop run_loop; - smb_service_->OnSetupCompleteForTesting(run_loop.QuitClosure()); - run_loop.Run(); - } - { - // Share gathering needs to complete at least once before a share can be - // mounted. - base::RunLoop run_loop; - smb_service_->GatherSharesInNetwork( - base::DoNothing(), - base::BindLambdaForTesting( - [&run_loop](const std::vector<SmbUrl>& shares_gathered, - bool done) { - if (done) { - run_loop.Quit(); - } - })); - run_loop.Run(); - } - } - - content::BrowserTaskEnvironment - task_environment_; // Included so tests magically don't crash. - base::test::ScopedFeatureList scoped_feature_list_; - TestingProfile* profile_ = nullptr; // Not owned. - std::string ad_user_email_; - TestingProfile* ad_profile_ = nullptr; // Not owned. - std::unique_ptr<TestingProfileManager> profile_manager_; - std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; - MockSmbProviderClient* mock_client_; // Owned by DBusThreadManager. - std::unique_ptr<SmbService> smb_service_; - - // Owned by file_system_provider::Service. - file_system_provider::FakeRegistry* registry_; - - chromeos::file_system_provider::MountOptions mount_options_; -}; - -TEST_F(SmbServiceTest, InvalidUrls) { - CreateService(profile_); - - ExpectInvalidUrl(""); - ExpectInvalidUrl("foo"); - ExpectInvalidUrl("\\foo"); - ExpectInvalidUrl("\\\\foo"); - ExpectInvalidUrl("\\\\foo\\"); - ExpectInvalidUrl("file://foo/bar"); - ExpectInvalidUrl("smb://foo"); - ExpectInvalidUrl("smb://user@password:foo"); - ExpectInvalidUrl("smb:\\\\foo\\bar"); - ExpectInvalidUrl("//foo/bar"); -} - -TEST_F(SmbServiceTest, InvalidSsoUrls) { - CreateService(profile_); - - ExpectInvalidSsoUrl("\\\\192.168.1.1\\foo"); - ExpectInvalidSsoUrl("\\\\[0:0:0:0:0:0:0:1]\\foo"); - ExpectInvalidSsoUrl("\\\\[::1]\\foo"); - ExpectInvalidSsoUrl("smb://192.168.1.1/foo"); - ExpectInvalidSsoUrl("smb://[0:0:0:0:0:0:0:1]/foo"); - ExpectInvalidSsoUrl("smb://[::1]/foo"); -} - -TEST_F(SmbServiceTest, Mount) { - CreateFspRegistry(profile_); - CreateService(profile_); - WaitForSetupComplete(); - - base::RunLoop run_loop; - EXPECT_CALL( - *mock_client_, - Mount( - base::FilePath(kShareUrl), - AllOf(Field(&SmbProviderClient::MountOptions::username, kTestUser), - Field(&SmbProviderClient::MountOptions::workgroup, ""), - Field(&SmbProviderClient::MountOptions::ntlm_enabled, true), - Field(&SmbProviderClient::MountOptions::skip_connect, false), - Field(&SmbProviderClient::MountOptions::save_password, false)), - _, _)) - .WillOnce( - WithArgs<2, 3>(Invoke([](base::ScopedFD password_fd, - SmbProviderClient::MountCallback callback) { - EXPECT_EQ(kTestPassword, GetPassword(password_fd)); - std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); - }))); - - smb_service_->Mount( - mount_options_, base::FilePath(kSharePath), kTestUser, kTestPassword, - false /* use_chromad_kerberos */, - false /* should_open_file_manager_after_mount */, - false /* save_credentials */, - base::BindLambdaForTesting([&run_loop](SmbMountResult result) { - EXPECT_EQ(SmbMountResult::kSuccess, result); - run_loop.Quit(); - })); - run_loop.Run(); - - // If |save_credentials| is false, then the username should not be saved in - // the file system id. - const std::string file_system_id = - registry_->file_system_info()->file_system_id(); - EXPECT_FALSE(IsKerberosChromadFileSystemId(file_system_id)); - EXPECT_FALSE(GetUserFromFileSystemId(file_system_id)); - - // Because the mock is potentially leaked, expectations needs to be manually - // verified. - EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); -} - -TEST_F(SmbServiceTest, MountSaveCredentials) { - CreateFspRegistry(profile_); - CreateService(profile_); - WaitForSetupComplete(); - - base::RunLoop run_loop; - EXPECT_CALL( - *mock_client_, - Mount( - base::FilePath(kShareUrl), - AllOf(Field(&SmbProviderClient::MountOptions::username, kTestUser), - Field(&SmbProviderClient::MountOptions::workgroup, ""), - Field(&SmbProviderClient::MountOptions::ntlm_enabled, true), - Field(&SmbProviderClient::MountOptions::skip_connect, false), - Field(&SmbProviderClient::MountOptions::save_password, true), - Field(&SmbProviderClient::MountOptions::account_hash, Ne(""))), - _, _)) - .WillOnce( - WithArgs<2, 3>(Invoke([](base::ScopedFD password_fd, - SmbProviderClient::MountCallback callback) { - EXPECT_EQ(kTestPassword, GetPassword(password_fd)); - std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); - }))); - - smb_service_->Mount( - mount_options_, base::FilePath(kSharePath), kTestUser, kTestPassword, - false /* use_chromad_kerberos */, - false /* should_open_file_manager_after_mount */, - true /* save_credentials */, - base::BindLambdaForTesting([&run_loop](SmbMountResult result) { - EXPECT_EQ(SmbMountResult::kSuccess, result); - run_loop.Quit(); - })); - run_loop.Run(); - - const std::string file_system_id = - registry_->file_system_info()->file_system_id(); - EXPECT_FALSE(IsKerberosChromadFileSystemId(file_system_id)); - base::Optional<std::string> saved_user = - GetUserFromFileSystemId(file_system_id); - ASSERT_TRUE(saved_user); - EXPECT_EQ(*saved_user, kTestUser); - - // Because the mock is potentially leaked, expectations needs to be manually - // verified. - EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); -} - -TEST_F(SmbServiceTest, Remount) { - file_system_provider::MountOptions mount_options( - CreateFileSystemId(base::FilePath(kSharePath), - false /* is_kerberos_chromad */), - "Foo"); - ProvidedFileSystemInfo file_system_info( - kProviderId, mount_options, base::FilePath(kSharePath), - false /* configurable */, false /* watchable */, - extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet()); - CreateFspRegistry(profile_); - registry_->RememberFileSystem(file_system_info, {}); - - base::RunLoop run_loop; - EXPECT_CALL( - *mock_client_, - Mount(base::FilePath(kShareUrl), - AllOf(Field(&SmbProviderClient::MountOptions::skip_connect, true), - Field(&SmbProviderClient::MountOptions::restore_password, - false)), - _, _)) - .WillOnce(WithArgs<2, 3>( - Invoke([&run_loop](base::ScopedFD password_fd, - SmbProviderClient::MountCallback callback) { - // Should have a valid password_fd containing an empty password. - EXPECT_EQ("", GetPassword(password_fd)); - std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); - run_loop.Quit(); - }))); - - CreateService(profile_); - run_loop.Run(); - - // Because the mock is potentially leaked, expectations needs to be manually - // verified. - EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); -} - -TEST_F(SmbServiceTest, Remount_ActiveDirectory) { - file_system_provider::MountOptions mount_options( - CreateFileSystemId(base::FilePath(kSharePath), - true /* is_kerberos_chromad */), - "Foo"); - ProvidedFileSystemInfo file_system_info( - kProviderId, mount_options, base::FilePath(kSharePath), - false /* configurable */, false /* watchable */, - extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet()); - CreateFspRegistry(ad_profile_); - registry_->RememberFileSystem(file_system_info, {}); - - base::RunLoop run_loop; - - EXPECT_CALL(*mock_client_, SetupKerberos(kTestADGuid, _)) - .WillOnce(WithArg<1>( - Invoke([](SmbProviderClient::SetupKerberosCallback callback) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), true)); - }))); - EXPECT_CALL( - *mock_client_, - Mount( - base::FilePath(kShareUrl), - AllOf( - Field(&SmbProviderClient::MountOptions::username, kTestADUser), - Field(&SmbProviderClient::MountOptions::workgroup, - base::ToUpperASCII(kTestADDomain)), - Field(&SmbProviderClient::MountOptions::skip_connect, true), - Field(&SmbProviderClient::MountOptions::restore_password, false)), - _, _)) - .WillOnce(WithArg<3>( - Invoke([&run_loop](SmbProviderClient::MountCallback callback) { - std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); - run_loop.Quit(); - }))); - - CreateService(ad_profile_); - run_loop.Run(); - - // Because the mock is potentially leaked, expectations needs to be manually - // verified. - EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); -} - -TEST_F(SmbServiceTest, Remount_SavedUser) { - file_system_provider::MountOptions mount_options( - CreateFileSystemIdForUser(base::FilePath(kSharePath), - base::StrCat({kTestUser, "@", kTestDomain})), - "Foo"); - ProvidedFileSystemInfo file_system_info( - kProviderId, mount_options, base::FilePath(kSharePath), - false /* configurable */, false /* watchable */, - extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet()); - CreateFspRegistry(profile_); - registry_->RememberFileSystem(file_system_info, {}); - - base::RunLoop run_loop; - EXPECT_CALL( - *mock_client_, - Mount( - base::FilePath(kShareUrl), - AllOf(Field(&SmbProviderClient::MountOptions::username, kTestUser), - Field(&SmbProviderClient::MountOptions::workgroup, kTestDomain), - Field(&SmbProviderClient::MountOptions::skip_connect, true), - Field(&SmbProviderClient::MountOptions::restore_password, true), - Field(&SmbProviderClient::MountOptions::account_hash, Ne(""))), - _, _)) - .WillOnce(WithArg<3>( - Invoke([&run_loop](SmbProviderClient::MountCallback callback) { - std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); - run_loop.Quit(); - }))); - - CreateService(profile_); - run_loop.Run(); - - // Because the mock is potentially leaked, expectations needs to be manually - // verified. - EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); -} - -TEST_F(SmbServiceTest, Remount_SavedInvalidUser) { - file_system_provider::MountOptions mount_options( - CreateFileSystemIdForUser( - base::FilePath(kSharePath), - base::StrCat({kTestUser, "@", kTestDomain, "@", kTestDomain})), - "Foo"); - ProvidedFileSystemInfo file_system_info( - kProviderId, mount_options, base::FilePath(kSharePath), - false /* configurable */, false /* watchable */, - extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet()); - CreateFspRegistry(profile_); - registry_->RememberFileSystem(file_system_info, {}); - - base::RunLoop run_loop; - EXPECT_CALL( - *mock_client_, - Mount(base::FilePath(kShareUrl), - AllOf(Field(&SmbProviderClient::MountOptions::username, ""), - Field(&SmbProviderClient::MountOptions::workgroup, ""), - Field(&SmbProviderClient::MountOptions::skip_connect, true), - Field(&SmbProviderClient::MountOptions::restore_password, - false)), - _, _)) - .WillOnce(WithArg<3>( - Invoke([&run_loop](SmbProviderClient::MountCallback callback) { - std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); - run_loop.Quit(); - }))); - - CreateService(profile_); - run_loop.Run(); - - // Because the mock is potentially leaked, expectations needs to be manually - // verified. - EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); -} - -TEST_F(SmbServiceTest, Premount) { - const char kPremountPath[] = "smb://server/foobar"; - const char kPreconfiguredShares[] = - "[{\"mode\":\"pre_mount\",\"share_url\":\"\\\\\\\\server\\\\foobar\"}]"; - auto parsed_shares = base::JSONReader::Read(kPreconfiguredShares); - ASSERT_TRUE(parsed_shares); - profile_->GetPrefs()->Set(prefs::kNetworkFileSharesPreconfiguredShares, - *parsed_shares); - - base::RunLoop run_loop; - EXPECT_CALL( - *mock_client_, - Mount(base::FilePath(kPremountPath), - AllOf(Field(&SmbProviderClient::MountOptions::username, ""), - Field(&SmbProviderClient::MountOptions::workgroup, ""), - Field(&SmbProviderClient::MountOptions::skip_connect, true)), - _, _)) - .WillOnce(WithArg<3>( - Invoke([&run_loop](SmbProviderClient::MountCallback callback) { - std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7); - run_loop.Quit(); - }))); - - CreateFspRegistry(profile_); - CreateService(profile_); - run_loop.Run(); - - // Because the mock is potentially leaked, expectations needs to be manually - // verified. - EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_)); -} - class SmbServiceWithSmbfsTest : public testing::Test { protected: // Mojo endpoints owned by the smbfs instance. @@ -610,8 +144,6 @@ }; SmbServiceWithSmbfsTest() { - scoped_feature_list_.InitWithFeatures({features::kSmbFs}, {}); - profile_manager_ = std::make_unique<TestingProfileManager>( TestingBrowserProcess::GetGlobal()); EXPECT_TRUE(profile_manager_->SetUp()); @@ -660,6 +192,28 @@ profile, std::make_unique<base::SimpleTestTickClock>()); } + void ExpectInvalidUrl(const std::string& url) { + SmbMountResult result = SmbMountResult::kSuccess; + smb_service_->Mount({} /* options */, base::FilePath(url), + "" /* username */, "" /* password */, + false /* use_chromad_kerberos */, + false /* should_open_file_manager_after_mount */, + false /* save_credentials */, + base::BindOnce(&SaveMountResult, &result)); + EXPECT_EQ(result, SmbMountResult::kInvalidUrl); + } + + void ExpectInvalidSsoUrl(const std::string& url) { + SmbMountResult result = SmbMountResult::kSuccess; + smb_service_->Mount({} /* options */, base::FilePath(url), + "" /* username */, "" /* password */, + true /* use_chromad_kerberos */, + false /* should_open_file_manager_after_mount */, + false /* save_credentials */, + base::BindOnce(&SaveMountResult, &result)); + EXPECT_EQ(result, SmbMountResult::kInvalidSsoUrl); + } + void WaitForSetupComplete() { { base::RunLoop run_loop; @@ -761,6 +315,32 @@ chromeos::file_system_provider::MountOptions mount_options_; }; +TEST_F(SmbServiceWithSmbfsTest, InvalidUrls) { + CreateService(profile_); + + ExpectInvalidUrl(""); + ExpectInvalidUrl("foo"); + ExpectInvalidUrl("\\foo"); + ExpectInvalidUrl("\\\\foo"); + ExpectInvalidUrl("\\\\foo\\"); + ExpectInvalidUrl("file://foo/bar"); + ExpectInvalidUrl("smb://foo"); + ExpectInvalidUrl("smb://user@password:foo"); + ExpectInvalidUrl("smb:\\\\foo\\bar"); + ExpectInvalidUrl("//foo/bar"); +} + +TEST_F(SmbServiceWithSmbfsTest, InvalidSsoUrls) { + CreateService(profile_); + + ExpectInvalidSsoUrl("\\\\192.168.1.1\\foo"); + ExpectInvalidSsoUrl("\\\\[0:0:0:0:0:0:0:1]\\foo"); + ExpectInvalidSsoUrl("\\\\[::1]\\foo"); + ExpectInvalidSsoUrl("smb://192.168.1.1/foo"); + ExpectInvalidSsoUrl("smb://[0:0:0:0:0:0:0:1]/foo"); + ExpectInvalidSsoUrl("smb://[::1]/foo"); +} + TEST_F(SmbServiceWithSmbfsTest, Mount) { CreateService(profile_); WaitForSetupComplete();
diff --git a/chrome/browser/chromeos/smb_client/smb_url.cc b/chrome/browser/chromeos/smb_client/smb_url.cc index 99a08b84..743a59d 100644 --- a/chrome/browser/chromeos/smb_client/smb_url.cc +++ b/chrome/browser/chromeos/smb_client/smb_url.cc
@@ -167,7 +167,7 @@ path_str, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); if (split_path.size() >= 2) { DCHECK_EQ(split_path[0], ""); - share_ = split_path[1].as_string(); + share_ = std::string(split_path[1]); } }
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc b/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc index 7aafa1e5..a945481 100644 --- a/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc +++ b/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc
@@ -27,9 +27,9 @@ #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile_manager.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/cros_disks_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/fake_vm_plugin_dispatcher_client.h" #include "chromeos/disks/disk.h"
diff --git a/chrome/browser/component_updater/component_updater_prefs.cc b/chrome/browser/component_updater/component_updater_prefs.cc index e22295b..cd81a4f8 100644 --- a/chrome/browser/component_updater/component_updater_prefs.cc +++ b/chrome/browser/component_updater/component_updater_prefs.cc
@@ -18,12 +18,6 @@ void RegisterPrefs(PrefRegistrySimple* registry) { RegisterPrefsForChromeComponentUpdaterConfigurator(registry); RegisterPrefsForRecoveryComponent(registry); - -#if !defined(OS_ANDROID) - // TODO(crbug.com/1055150): Move this to SodaInstaller. - RegisterPrefsForSodaComponent(registry); -#endif - AutofillStatesComponentInstallerPolicy::RegisterPrefs(registry); }
diff --git a/chrome/browser/component_updater/soda_component_installer.cc b/chrome/browser/component_updater/soda_component_installer.cc index e9c55f5c..8c583457 100644 --- a/chrome/browser/component_updater/soda_component_installer.cc +++ b/chrome/browser/component_updater/soda_component_installer.cc
@@ -213,17 +213,6 @@ #endif } -void RegisterPrefsForSodaComponent(PrefRegistrySimple* registry) { - registry->RegisterTimePref(prefs::kSodaScheduledDeletionTime, base::Time()); - registry->RegisterFilePathPref(prefs::kSodaBinaryPath, base::FilePath()); - - // Register language pack config path preferences. - for (const speech::SodaLanguagePackComponentConfig& config : - speech::kLanguageComponentConfigs) { - registry->RegisterFilePathPref(config.config_path_pref, base::FilePath()); - } -} - void RegisterSodaComponent(ComponentUpdateService* cus, PrefService* global_prefs, base::OnceClosure on_ready_callback,
diff --git a/chrome/browser/component_updater/soda_component_installer.h b/chrome/browser/component_updater/soda_component_installer.h index 5cea7d9..8ca3018 100644 --- a/chrome/browser/component_updater/soda_component_installer.h +++ b/chrome/browser/component_updater/soda_component_installer.h
@@ -61,10 +61,6 @@ OnSodaComponentReadyCallback on_ready_callback_; }; -// Registers user preferences related to the Speech On-Device API (SODA) -// component. -void RegisterPrefsForSodaComponent(PrefRegistrySimple* registry); - // Call once during startup to make the component update service aware of // the File Type Policies component. Should only be called by SodaInstaller. void RegisterSodaComponent(ComponentUpdateService* cus,
diff --git a/chrome/browser/component_updater/subresource_filter_component_installer.cc b/chrome/browser/component_updater/subresource_filter_component_installer.cc index 8cc36d6..5b5511a46 100644 --- a/chrome/browser/component_updater/subresource_filter_component_installer.cc +++ b/chrome/browser/component_updater/subresource_filter_component_installer.cc
@@ -10,6 +10,7 @@ #include "base/files/file_util.h" #include "base/memory/ref_counted.h" #include "base/path_service.h" +#include "base/strings/string_piece.h" #include "base/version.h" #include "chrome/browser/browser_process.h" #include "components/component_updater/component_updater_paths.h" @@ -114,10 +115,9 @@ // static std::string SubresourceFilterComponentInstallerPolicy::GetInstallerTag() { - const std::string ruleset_flavor = + const std::string ruleset_flavor( subresource_filter::GetEnabledConfigurations() - ->lexicographically_greatest_ruleset_flavor() - .as_string(); + ->lexicographically_greatest_ruleset_flavor()); // Allow the empty, and 4 non-empty ruleset flavor identifiers: a, b, c, d. if (ruleset_flavor.empty())
diff --git a/chrome/browser/devtools/device/adb/adb_device_provider.cc b/chrome/browser/devtools/device/adb/adb_device_provider.cc index 5488234..690e577 100644 --- a/chrome/browser/devtools/device/adb/adb_device_provider.cc +++ b/chrome/browser/devtools/device/adb/adb_device_provider.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/devtools/device/adb/adb_device_provider.h" #include "base/bind.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" #include "chrome/browser/devtools/device/adb/adb_client_socket.h" @@ -39,7 +40,7 @@ std::vector<base::StringPiece> tokens = base::SplitStringPiece(line, "\t ", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - result.push_back(tokens[0].as_string()); + result.push_back(std::string(tokens[0])); } std::move(callback).Run(std::move(result)); }
diff --git a/chrome/browser/devtools/device/android_device_info_query.cc b/chrome/browser/devtools/device/android_device_info_query.cc index 9b6f190..75e0a5a9 100644 --- a/chrome/browser/devtools/device/android_device_info_query.cc +++ b/chrome/browser/devtools/device/android_device_info_query.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -230,9 +231,9 @@ size_t first_pos = fields.find_first_of(":"); size_t last_pos = fields.find_last_of(":"); if (first_pos != std::string::npos && last_pos != std::string::npos) { - std::string id = fields.substr(0, first_pos).as_string(); - std::string name = fields.substr(first_pos + 1, - last_pos - first_pos - 1).as_string(); + std::string id(fields.substr(0, first_pos)); + std::string name( + fields.substr(first_pos + 1, last_pos - first_pos - 1)); id_to_username[id] = name; } }
diff --git a/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc b/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc index 743ad2e1..1aa56fc 100644 --- a/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc +++ b/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc
@@ -17,6 +17,7 @@ #include "base/files/file.h" #include "base/files/file_util.h" #include "base/nix/xdg_util.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -44,8 +45,8 @@ return v.first == "VERSION_ID"; }); if (version_id != values.end()) { - return base::TrimString(version_id->second, "\"", base::TRIM_ALL) - .as_string(); + return std::string( + base::TrimString(version_id->second, "\"", base::TRIM_ALL)); } } return base::SysInfo::OperatingSystemVersion();
diff --git a/chrome/browser/extensions/api/commands/command_service.cc b/chrome/browser/extensions/api/commands/command_service.cc index 65e8eb1..74dcb19 100644 --- a/chrome/browser/extensions/api/commands/command_service.cc +++ b/chrome/browser/extensions/api/commands/command_service.cc
@@ -9,6 +9,7 @@ #include <vector> #include "base/lazy_instance.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -319,7 +320,7 @@ shortcut, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); CHECK(tokens.size() >= 2); - return Command(command_name, std::u16string(), tokens[1].as_string(), + return Command(command_name, std::u16string(), std::string(tokens[1]), global); }
diff --git a/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc b/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc index 4246f31..82fa40c9 100644 --- a/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc +++ b/chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.cc
@@ -5,8 +5,8 @@ #include "chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h" #include "base/bind.h" +#include "base/containers/contains.h" #include "base/macros.h" -#include "base/stl_util.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc index c2cd0f9..3a8b4c4 100644 --- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc +++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -14,6 +14,7 @@ #include "base/containers/contains.h" #include "base/containers/flat_set.h" +#include "base/feature_list.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -66,6 +67,9 @@ using chromeos::input_method::InputMethodManager; using chromeos::input_method::InputMethodUtil; +// Number of IMEs that are needed to automatically enable the IME menu option. +const size_t NUM_IMES_TO_AUTO_ENABLE_IME_MENU = 2; + // Returns the set of IDs of all enabled IMEs. std::unordered_set<std::string> GetEnabledIMEs( scoped_refptr<InputMethodManager::State> ime_state) { @@ -850,6 +854,26 @@ std::string input_methods = base::JoinString(input_method_list, ","); prefs->SetString(pref_name, input_methods); + + // In LSV2 Update 2, we want to automatically enable "Show input options in + // shelf" when the user has multiple input methods. + // We don't want to repeatedly enable it every time the user adds an input + // method, as a user may want to intentionally turn it off - so we only enable + // it once the user reaches two input methods. + if (base::FeatureList::IsEnabled(ash::features::kLanguageSettingsUpdate2)) { + // As pref_name and input_method_set only refer to the preference related to + // the list of IMEs for which this newly-added IME is in, we need the other + // IME list to calculate the total number of IMEs. + const char* other_ime_list_pref_name = is_component_extension_ime + ? prefs::kLanguageEnabledImes + : prefs::kLanguagePreloadEngines; + std::unordered_set<std::string> other_input_method_set( + GetIMEsFromPref(prefs, other_ime_list_pref_name)); + if (input_method_set.size() + other_input_method_set.size() == + NUM_IMES_TO_AUTO_ENABLE_IME_MENU) { + prefs->SetBoolean(prefs::kLanguageImeMenuActivated, true); + } + } #endif return RespondNow(NoArguments()); }
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc index 4d88955..c2b008c 100644 --- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc +++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
@@ -25,12 +25,14 @@ #include "chrome/test/base/testing_profile.h" #include "components/crx_file/id_util.h" #include "components/language/core/browser/pref_names.h" +#include "components/prefs/pref_member.h" #include "components/spellcheck/common/spellcheck_features.h" #include "components/translate/core/browser/translate_download_manager.h" #include "extensions/browser/event_router_factory.h" #include "extensions/browser/extension_prefs.h" #if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/constants/ash_features.h" #include "ui/base/ime/chromeos/component_extension_ime_manager.h" #include "ui/base/ime/chromeos/extension_ime_util.h" #include "ui/base/ime/chromeos/fake_input_method_delegate.h" @@ -113,6 +115,9 @@ // Force Windows hybrid spellcheck to be enabled. feature_list_.InitAndEnableFeature(spellcheck::kWinUseBrowserSpellChecker); #endif // defined(OS_WIN) +#if BUILDFLAG(IS_CHROMEOS_ASH) + feature_list_.InitAndEnableFeature(ash::features::kLanguageSettingsUpdate2); +#endif } #if defined(OS_WIN) @@ -567,8 +572,12 @@ enabled_imes.Init(prefs::kLanguageEnabledImes, profile()->GetPrefs()); StringPrefMember preload_engines; preload_engines.Init(prefs::kLanguagePreloadEngines, profile()->GetPrefs()); + BooleanPrefMember language_menu_enabled; + language_menu_enabled.Init(prefs::kLanguageImeMenuActivated, + profile()->GetPrefs()); enabled_imes.SetValue(std::string()); preload_engines.SetValue(std::string()); + language_menu_enabled.SetValue(false); { // Add an extension IME. kLanguageEnabledImes should be updated. @@ -579,10 +588,12 @@ EXPECT_EQ(GetExtensionImeId(), enabled_imes.GetValue()); EXPECT_TRUE(preload_engines.GetValue().empty()); + EXPECT_FALSE(language_menu_enabled.GetValue()); } enabled_imes.SetValue(std::string()); preload_engines.SetValue(std::string()); + language_menu_enabled.SetValue(false); { // Add a component extension IME. kLanguagePreloadEngines should be // updated. @@ -594,10 +605,12 @@ EXPECT_TRUE(enabled_imes.GetValue().empty()); EXPECT_EQ(GetComponentExtensionImeId(), preload_engines.GetValue()); + EXPECT_FALSE(language_menu_enabled.GetValue()); } enabled_imes.SetValue(std::string()); preload_engines.SetValue(std::string()); + language_menu_enabled.SetValue(false); { // Add an ARC IME. kLanguageEnabledImes should be updated. auto function = @@ -607,6 +620,28 @@ EXPECT_EQ(GetArcImeId(), enabled_imes.GetValue()); EXPECT_TRUE(preload_engines.GetValue().empty()); + EXPECT_FALSE(language_menu_enabled.GetValue()); + } + + enabled_imes.SetValue(std::string()); + preload_engines.SetValue(std::string()); + language_menu_enabled.SetValue(false); + { + // Add an extension IME and a component extension IME. Both should be + // updated, and the language menu should be enabled. + auto function = + base::MakeRefCounted<LanguageSettingsPrivateAddInputMethodFunction>(); + api_test_utils::RunFunctionAndReturnSingleResult( + function.get(), "[\"" + GetExtensionImeId() + "\"]", profile()); + function = + base::MakeRefCounted<LanguageSettingsPrivateAddInputMethodFunction>(); + api_test_utils::RunFunctionAndReturnSingleResult( + function.get(), "[\"" + GetComponentExtensionImeId() + "\"]", + profile()); + + EXPECT_EQ(GetExtensionImeId(), enabled_imes.GetValue()); + EXPECT_EQ(GetComponentExtensionImeId(), preload_engines.GetValue()); + EXPECT_TRUE(language_menu_enabled.GetValue()); } TestInputMethodManager::Shutdown();
diff --git a/chrome/browser/extensions/api/notifications/extension_notification_handler.cc b/chrome/browser/extensions/api/notifications/extension_notification_handler.cc index f4f4142..64458ee 100644 --- a/chrome/browser/extensions/api/notifications/extension_notification_handler.cc +++ b/chrome/browser/extensions/api/notifications/extension_notification_handler.cc
@@ -52,7 +52,7 @@ std::string ExtensionNotificationHandler::GetExtensionId(const GURL& url) { if (!url.is_valid() || !url.SchemeIs(extensions::kExtensionScheme)) return ""; - return url.GetOrigin().host_piece().as_string(); + return std::string(url.GetOrigin().host_piece()); } void ExtensionNotificationHandler::OnClose(
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc index 038f10cc..f99897e0 100644 --- a/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc +++ b/chrome/browser/extensions/api/tab_capture/tab_capture_performance_test_base.cc
@@ -14,6 +14,7 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/path_service.h" +#include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/unpacked_installer.h" @@ -243,7 +244,7 @@ base::StringPiece event_name, trace_analyzer::TraceEventVector* events) { const trace_analyzer::Query kQuery = - trace_analyzer::Query::EventNameIs(event_name.as_string()) && + trace_analyzer::Query::EventNameIs(std::string(event_name)) && (trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_BEGIN) || trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_ASYNC_BEGIN) || trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_FLOW_BEGIN) ||
diff --git a/chrome/browser/extensions/extension_user_script_loader_unittest.cc b/chrome/browser/extensions/extension_user_script_loader_unittest.cc index 07caeef..b599e82 100644 --- a/chrome/browser/extensions/extension_user_script_loader_unittest.cc +++ b/chrome/browser/extensions/extension_user_script_loader_unittest.cc
@@ -18,6 +18,7 @@ #include "base/optional.h" #include "base/path_service.h" #include "base/run_loop.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/test/bind.h" #include "base/test/values_test_util.h" @@ -287,7 +288,7 @@ user_scripts = loader.LoadScriptsForTest(std::move(user_scripts)); EXPECT_EQ(content.substr(3), - (*user_scripts)[0]->js_scripts()[0]->GetContent().as_string()); + std::string((*user_scripts)[0]->js_scripts()[0]->GetContent())); } TEST_F(ExtensionUserScriptLoaderTest, LeaveBOMNotAtTheBeginning) { @@ -311,7 +312,7 @@ user_scripts = loader.LoadScriptsForTest(std::move(user_scripts)); EXPECT_EQ(content, - (*user_scripts)[0]->js_scripts()[0]->GetContent().as_string()); + std::string((*user_scripts)[0]->js_scripts()[0]->GetContent())); } TEST_F(ExtensionUserScriptLoaderTest, ComponentExtensionContentScriptIsLoaded) {
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc index 5b932100..ca7e90b 100644 --- a/chrome/browser/extensions/external_provider_impl.cc +++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -370,8 +370,8 @@ extension->FindStringPath(kWebAppMigrationFlag); bool is_migrating_to_web_app = web_app_migration_flag && - web_app::IsPreinstalledAppInstallFeatureEnabled( - *web_app_migration_flag); + web_app::IsPreinstalledAppInstallFeatureEnabled(*web_app_migration_flag, + *profile_); bool keep_if_present = extension->FindBoolPath(kKeepIfPresent).value_or(false); if (keep_if_present || is_migrating_to_web_app) {
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc index 969497a..16bbac069 100644 --- a/chrome/browser/extensions/policy_handlers.cc +++ b/chrome/browser/extensions/policy_handlers.cc
@@ -10,6 +10,7 @@ #include "base/check.h" #include "base/notreached.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "build/build_config.h" @@ -42,7 +43,7 @@ if (ids.size() == 0) return false; for (const auto& id : ids) { - if (!crx_file::id_util::IdIsValid(id.as_string())) + if (!crx_file::id_util::IdIsValid(std::string(id))) return false; } return true;
diff --git a/chrome/browser/extensions/preinstalled_apps.cc b/chrome/browser/extensions/preinstalled_apps.cc index 4e03dc8f..3294fe5 100644 --- a/chrome/browser/extensions/preinstalled_apps.cc +++ b/chrome/browser/extensions/preinstalled_apps.cc
@@ -188,7 +188,8 @@ pref.FindStringPath(kWebAppMigrationFlag); if (!web_app_flag) return false; // Isn't migrating. - if (web_app::IsPreinstalledAppInstallFeatureEnabled(*web_app_flag)) { + if (web_app::IsPreinstalledAppInstallFeatureEnabled(*web_app_flag, + *profile)) { // The feature is still enabled; it's responsible for the behavior. return false; }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index e45f162..f9d3bd23 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -3387,6 +3387,11 @@ "expiry_milestone": 130 }, { + "name": "launcher-query-highlighting", + "owners": ["wrong", "tby", "thanhdng"], + "expiry_milestone": 95 + }, + { "name": "launcher-search-normalization", "owners": ["adafang", "wrong", "tby"], "expiry_milestone": 92 @@ -4869,11 +4874,6 @@ "expiry_milestone": 93 }, { - "name": "smbfs-file-shares", - "owners": [ "simmonsjosh@google.com", "dats" ], - "expiry_milestone": 90 - }, - { "name": "smooth-scrolling", "owners": [ "bokan", "input-dev" ], // This needs to continue to be extended until the UI contains a proper
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 40440572..087ef56 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -4637,6 +4637,11 @@ "first restart can take some time to setup lacros-chrome. Please DO NOT " "attempt to turn off the device during the restart."; +const char kLauncherQueryHighlightingName[] = "Launcher query highlighting"; +const char kLauncherQueryHighlightingDescription[] = + "Enables highlighting occurrences of the search query in launcher search " + "result titles."; + const char kLimitAltTabToActiveDeskName[] = "Limit Alt-Tab windows to active desk"; const char kLimitAltTabToActiveDeskDescription[] = @@ -4808,10 +4813,6 @@ "Ctrl-Alt-I shows a heads-up display view in the top-left corner. Helps " "debug hardware issues that generate spurious touch events."; -const char kSmbfsFileSharesName[] = "Smbfs file shares"; -const char kSmbfsFileSharesDescription[] = - "Use smbfs for accessing network file shares."; - const char kSpectreVariant2MitigationName[] = "Spectre variant 2 mitigation"; const char kSpectreVariant2MitigationDescription[] = "Controls whether Spectre variant 2 mitigation is enabled when "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index c737a3c4..db14b30a 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2696,6 +2696,9 @@ extern const char kLacrosSupportName[]; extern const char kLacrosSupportDescription[]; +extern const char kLauncherQueryHighlightingName[]; +extern const char kLauncherQueryHighlightingDescription[]; + extern const char kLimitAltTabToActiveDeskName[]; extern const char kLimitAltTabToActiveDeskDescription[]; @@ -2806,9 +2809,6 @@ extern const char kShowTouchHudName[]; extern const char kShowTouchHudDescription[]; -extern const char kSmbfsFileSharesName[]; -extern const char kSmbfsFileSharesDescription[]; - extern const char kSpectreVariant2MitigationName[]; extern const char kSpectreVariant2MitigationDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 84e403b..28b8602 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -297,7 +297,6 @@ &password_manager::features::kRecoverFromNeverSaveAndroid, &performance_hints::features::kContextMenuPerformanceInfo, &performance_hints::features::kPageInfoPerformanceHints, - &photo_picker::features::kPhotoPickerVideoSupport, &query_tiles::features::kQueryTilesGeoFilter, &query_tiles::features::kQueryTiles, &query_tiles::features::kQueryTilesInNTP,
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 121c010..c455ddd 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
@@ -408,7 +408,6 @@ public static final String PAINT_PREVIEW_SHOW_ON_STARTUP = "PaintPreviewShowOnStartup"; public static final String PASSWORD_SCRIPTS_FETCHING = "PasswordScriptsFetching"; public static final String PERMISSION_DELEGATION = "PermissionDelegation"; - public static final String PHOTO_PICKER_VIDEO_SUPPORT = "PhotoPickerVideoSupport"; public static final String PORTALS = "Portals"; public static final String PORTALS_CROSS_ORIGIN = "PortalsCrossOrigin"; public static final String PREEMPTIVE_LINK_TO_TEXT_GENERATION =
diff --git a/chrome/browser/media/cast_mirroring_performance_browsertest.cc b/chrome/browser/media/cast_mirroring_performance_browsertest.cc index 78b0bb8..661df1d 100644 --- a/chrome/browser/media/cast_mirroring_performance_browsertest.cc +++ b/chrome/browser/media/cast_mirroring_performance_browsertest.cc
@@ -19,6 +19,7 @@ #include "base/files/file_util.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "base/test/trace_event_analyzer.h" @@ -226,7 +227,7 @@ base::StringPiece event_name, trace_analyzer::TraceEventVector* events) { const trace_analyzer::Query kQuery = - trace_analyzer::Query::EventNameIs(event_name.as_string()) && + trace_analyzer::Query::EventNameIs(std::string(event_name)) && (trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_BEGIN) || trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_ASYNC_BEGIN) || trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_FLOW_BEGIN) ||
diff --git a/chrome/browser/media/router/mojo/media_sink_service_status.cc b/chrome/browser/media/router/mojo/media_sink_service_status.cc index 68f371ff..3b28060 100644 --- a/chrome/browser/media/router/mojo/media_sink_service_status.cc +++ b/chrome/browser/media/router/mojo/media_sink_service_status.cc
@@ -48,7 +48,7 @@ // Returns the last four characters of UUID. UUID is extracted from |sink_id|. std::string TruncateSinkId(const std::string& sink_id) { - std::string uuid = ExtractUUID(sink_id).as_string(); + std::string uuid(ExtractUUID(sink_id)); return uuid.length() <= 4 ? uuid : uuid.substr(uuid.length() - 4); }
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc index 0fdd8c3f..6e56fae 100644 --- a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc +++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
@@ -113,7 +113,7 @@ std::string CastInternalMessageTypeToString(CastInternalMessage::Type type) { auto found = cast_util::EnumToString(type); DCHECK(found); - return found.value_or(base::StringPiece()).as_string(); + return std::string(found.value_or(base::StringPiece())); } // Possible types in a receiver_action message.
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 06f24ed05..eea42875 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -1100,7 +1100,7 @@ if (!registry) continue; const extensions::Extension* extension = registry->GetExtensionById( - id.as_string(), extensions::ExtensionRegistry::ENABLED); + std::string(id), extensions::ExtensionRegistry::ENABLED); if (!extension) continue; if (!extension->from_webstore())
diff --git a/chrome/browser/metrics/thread_watcher.cc b/chrome/browser/metrics/thread_watcher.cc index 26fe541..494a63e 100644 --- a/chrome/browser/metrics/thread_watcher.cc +++ b/chrome/browser/metrics/thread_watcher.cc
@@ -15,6 +15,7 @@ #include "base/metrics/histogram.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_tokenizer.h" #include "base/strings/stringprintf.h" @@ -627,7 +628,7 @@ // unresponsive before considering it as hung. CHECK_LE(values.size(), 2U); - std::string thread_name = values[0].as_string(); + std::string thread_name(values[0]); uint32_t crash_seconds = default_crash_seconds; if (values.size() >= 2 &&
diff --git a/chrome/browser/metrics/thread_watcher_unittest.cc b/chrome/browser/metrics/thread_watcher_unittest.cc index 3bfaf83..f8ddbb6 100644 --- a/chrome/browser/metrics/thread_watcher_unittest.cc +++ b/chrome/browser/metrics/thread_watcher_unittest.cc
@@ -17,6 +17,7 @@ #include "base/single_thread_task_runner.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_tokenizer.h" #include "base/synchronization/condition_variable.h" @@ -500,7 +501,7 @@ while (tokens.GetNext()) { std::vector<base::StringPiece> values = base::SplitStringPiece( tokens.token_piece(), ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - std::string thread_name = values[0].as_string(); + std::string thread_name(values[0]); auto it = crash_on_hang_threads.find(thread_name); bool crash_on_hang = (it != crash_on_hang_threads.end()); @@ -529,7 +530,7 @@ while (tokens.GetNext()) { std::vector<base::StringPiece> values = base::SplitStringPiece( tokens.token_piece(), ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - std::string thread_name = values[0].as_string(); + std::string thread_name(values[0]); auto it = crash_on_hang_threads.find(thread_name);
diff --git a/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc b/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc index 9bed517..7348271 100644 --- a/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc +++ b/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/nearby_sharing/instantmessaging/stream_parser.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_piece.h" #include "chrome/browser/nearby_sharing/instantmessaging/proto/instantmessaging.pb.h" #include "chrome/browser/nearby_sharing/logging/logging.h"
diff --git a/chrome/browser/net/cookie_policy_browsertest.cc b/chrome/browser/net/cookie_policy_browsertest.cc index c2e8eba..57f80ae3 100644 --- a/chrome/browser/net/cookie_policy_browsertest.cc +++ b/chrome/browser/net/cookie_policy_browsertest.cc
@@ -102,7 +102,7 @@ content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); content::TestNavigationObserver load_observer(web_contents); - ASSERT_TRUE(ExecuteScript( + ASSERT_TRUE(content::ExecJs( GetFrame(), base::StringPrintf("document.body.querySelector('iframe').src = '%s';", url.spec().c_str())));
diff --git a/chrome/browser/net/dns_probe_browsertest.cc b/chrome/browser/net/dns_probe_browsertest.cc index 4d9f894..61c46ca3 100644 --- a/chrome/browser/net/dns_probe_browsertest.cc +++ b/chrome/browser/net/dns_probe_browsertest.cc
@@ -307,25 +307,17 @@ WebContents* contents = active_browser_->tab_strip_model()->GetActiveWebContents(); - bool rv = content::ExecuteScriptAndExtractString( - contents, "domAutomationController.send(document.title);", &title); - if (!rv) - return ""; - - return title; + return content::EvalJs(contents, "document.title;").ExtractString(); } // Check text by roundtripping to renderer, to make sure any probe results // sent before this have been applied. bool DnsProbeBrowserTest::PageContains(const std::string& expected) { - std::string text_content; - - bool rv = content::ExecuteScriptAndExtractString( - active_browser_->tab_strip_model()->GetActiveWebContents(), - "domAutomationController.send(document.body.textContent);", - &text_content); - if (!rv) - return false; + std::string text_content = + content::EvalJs( + active_browser_->tab_strip_model()->GetActiveWebContents(), + "document.body.textContent;") + .ExtractString(); return text_content.find(expected) != std::string::npos; }
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc index daa04098..199fad4 100644 --- a/chrome/browser/net/errorpage_browsertest.cc +++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -118,13 +118,10 @@ } var node = document.evaluate("//*[contains(text(),'%s')]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - domAutomationController.send(isNodeVisible(node)); + isNodeVisible(node); )", text.c_str()); // clang-format on - bool result = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool(render_frame_host, command, - &result)); - return result; + return content::EvalJs(render_frame_host, command).ExtractBool(); } bool WARN_UNUSED_RESULT IsDisplayingText(Browser* browser, @@ -135,20 +132,19 @@ // Expands the more box on the currently displayed error page. void ToggleHelpBox(Browser* browser) { - EXPECT_TRUE(content::ExecuteScript( - browser->tab_strip_model()->GetActiveWebContents(), - "document.getElementById('details-button').click();")); + EXPECT_TRUE( + content::ExecJs(browser->tab_strip_model()->GetActiveWebContents(), + "document.getElementById('details-button').click();")); } // Returns true if the diagnostics link suggestion is displayed. bool WARN_UNUSED_RESULT IsDisplayingDiagnosticsLink(Browser* browser) { std::string command = base::StringPrintf( "var diagnose_link = document.getElementById('diagnose-link');" - "domAutomationController.send(diagnose_link != null);"); - bool result = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - browser->tab_strip_model()->GetActiveWebContents(), command, &result)); - return result; + "diagnose_link != null;"); + return content::EvalJs(browser->tab_strip_model()->GetActiveWebContents(), + command) + .ExtractBool(); } // Checks that the error page is being displayed with the specified error @@ -613,19 +609,14 @@ // Check for no disabled message container. std::string command = base::StringPrintf( "var hasDisableContainer = document.querySelectorAll('.snackbar').length;" - "domAutomationController.send(hasDisableContainer);"); - int32_t result; - EXPECT_TRUE(content::ExecuteScriptAndExtractInt( - web_contents, command, &result)); - EXPECT_EQ(0, result); + "hasDisableContainer;"); + EXPECT_EQ(0, content::EvalJs(web_contents, command)); // Presence of the canvas container. command = base::StringPrintf( - "var runnerCanvas = document.querySelectorAll('.runner-canvas').length;" - "domAutomationController.send(runnerCanvas);"); - EXPECT_TRUE(content::ExecuteScriptAndExtractInt( - web_contents, command, &result)); - EXPECT_EQ(1, result); + "var runnerCanvas = document.querySelectorAll('.runner-canvas').length;" + "runnerCanvas;"); + EXPECT_EQ(1, content::EvalJs(web_contents, command)); } // Test error page in incognito mode. The only difference is that no network @@ -885,13 +876,9 @@ std::string command = base::StringPrintf( "var hasText = document.querySelector('.snackbar');" - "domAutomationController.send(hasText ? hasText.innerText : '');"); + "hasText ? hasText.innerText : '';"); - std::string result; - EXPECT_TRUE( - content::ExecuteScriptAndExtractString(web_contents, command, &result)); - - return result; + return content::EvalJs(web_contents, command).ExtractString(); } // Whether to set AllowDinosaurEasterEgg policy
diff --git a/chrome/browser/net/ftp_browsertest.cc b/chrome/browser/net/ftp_browsertest.cc index 3ad8820..c9a9f7e7 100644 --- a/chrome/browser/net/ftp_browsertest.cc +++ b/chrome/browser/net/ftp_browsertest.cc
@@ -184,7 +184,7 @@ ftp_server_.GetURLWithUserAndPassword("", "chrome", "chrome")); // Navigate to directory dir1/ without needing to re-authenticate - EXPECT_TRUE(content::ExecuteScript( + EXPECT_TRUE(content::ExecJs( browser()->tab_strip_model()->GetActiveWebContents(), "(function() {" " function navigate() {" @@ -209,7 +209,7 @@ content::BrowserContext::GetDownloadManager(browser()->profile()), 1, content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE); - EXPECT_TRUE(content::ExecuteScript( + EXPECT_TRUE(content::ExecJs( browser()->tab_strip_model()->GetActiveWebContents(), "(function() {" " function navigate() {"
diff --git a/chrome/browser/net/load_timing_browsertest.cc b/chrome/browser/net/load_timing_browsertest.cc index 15c2e409..de35ba3 100644 --- a/chrome/browser/net/load_timing_browsertest.cc +++ b/chrome/browser/net/load_timing_browsertest.cc
@@ -74,12 +74,10 @@ // Unlike the above times, secureConnectionStart will be zero when not // applicable. In that case, leave ssl_start as null. - bool ssl_start_zero = false; - ASSERT_TRUE(content::ExecuteScriptAndExtractBool( - browser()->tab_strip_model()->GetActiveWebContents(), - "window.domAutomationController.send(" - "performance.timing.secureConnectionStart == 0);", - &ssl_start_zero)); + bool ssl_start_zero = + content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + "performance.timing.secureConnectionStart == 0;") + .ExtractBool(); if (!ssl_start_zero) navigation_deltas->ssl_start = GetResultDelta("secureConnectionStart"); else @@ -100,15 +98,13 @@ // Returns the time between performance.timing.fetchStart and the time with // the specified name. This time must be non-negative. int GetResultDelta(const std::string& name) { - int time_ms = 0; std::string command(base::StringPrintf( - "window.domAutomationController.send(" - "performance.timing.%s - performance.timing.fetchStart);", + "performance.timing.%s - performance.timing.fetchStart;", name.c_str())); - EXPECT_TRUE(content::ExecuteScriptAndExtractInt( - browser()->tab_strip_model()->GetActiveWebContents(), - command.c_str(), - &time_ms)); + int time_ms = + content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + command.c_str()) + .ExtractInt(); // Basic sanity check. EXPECT_GE(time_ms, 0); return time_ms;
diff --git a/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc b/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc index 35cf929..8b45c94 100644 --- a/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc +++ b/chrome/browser/net/netinfo_network_quality_estimator_holdback_browsertest.cc
@@ -161,24 +161,21 @@ } std::string RunScriptExtractString(const std::string& script) { - std::string data; - EXPECT_TRUE(content::ExecuteScriptAndExtractString( - browser()->tab_strip_model()->GetActiveWebContents(), script, &data)); - return data; + return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractString(); } double RunScriptExtractDouble(const std::string& script) { - double data = 0.0; - EXPECT_TRUE(ExecuteScriptAndExtractDouble( - browser()->tab_strip_model()->GetActiveWebContents(), script, &data)); - return data; + return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractDouble(); } int RunScriptExtractInt(const std::string& script) { - int data = 0; - EXPECT_TRUE(ExecuteScriptAndExtractInt( - browser()->tab_strip_model()->GetActiveWebContents(), script, &data)); - return data; + return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractInt(); } net::EmbeddedTestServer test_server_;
diff --git a/chrome/browser/net/network_quality_netinfo_browsertest.cc b/chrome/browser/net/network_quality_netinfo_browsertest.cc index e78d136..0ce5514 100644 --- a/chrome/browser/net/network_quality_netinfo_browsertest.cc +++ b/chrome/browser/net/network_quality_netinfo_browsertest.cc
@@ -96,26 +96,22 @@ } } - double RunScriptExtractDouble(const std::string& script) { - double data = 0.0; - EXPECT_TRUE(ExecuteScriptAndExtractDouble( - browser()->tab_strip_model()->GetActiveWebContents(), script, &data)); - return data; + std::string RunScriptExtractString(const std::string& script) { + return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractString(); } - private: - std::string RunScriptExtractString(const std::string& script) { - std::string data; - EXPECT_TRUE(ExecuteScriptAndExtractString( - browser()->tab_strip_model()->GetActiveWebContents(), script, &data)); - return data; + double RunScriptExtractDouble(const std::string& script) { + return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractDouble(); } int RunScriptExtractInt(const std::string& script) { - int data = 0; - EXPECT_TRUE(ExecuteScriptAndExtractInt( - browser()->tab_strip_model()->GetActiveWebContents(), script, &data)); - return data; + return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(), + script, content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractInt(); } };
diff --git a/chrome/browser/net/proxy_browsertest.cc b/chrome/browser/net/proxy_browsertest.cc index 520868cd..21ec08bc 100644 --- a/chrome/browser/net/proxy_browsertest.cc +++ b/chrome/browser/net/proxy_browsertest.cc
@@ -54,14 +54,12 @@ ui_test_utils::NavigateToURL(browser, GURL("http://google.com")); // Verify we get the ERR_PROXY_CONNECTION_FAILED screen. - bool result = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - browser->tab_strip_model()->GetActiveWebContents(), - "var textContent = document.body.textContent;" - "var hasError = textContent.indexOf('ERR_PROXY_CONNECTION_FAILED') >= 0;" - "domAutomationController.send(hasError);", - &result)); - EXPECT_TRUE(result); + EXPECT_EQ(true, content::EvalJs( + browser->tab_strip_model()->GetActiveWebContents(), + "var textContent = document.body.textContent;" + "var hasError = " + "textContent.indexOf('ERR_PROXY_CONNECTION_FAILED') >= 0;" + "hasError;")); } // This class observes chrome::NOTIFICATION_AUTH_NEEDED and supplies
diff --git a/chrome/browser/net/secure_dns_policy_handler.cc b/chrome/browser/net/secure_dns_policy_handler.cc index cb94aec7..627f470a 100644 --- a/chrome/browser/net/secure_dns_policy_handler.cc +++ b/chrome/browser/net/secure_dns_policy_handler.cc
@@ -93,7 +93,7 @@ if (mode && mode->is_string()) { mode_str = mode->GetString(); if (SecureDnsConfig::ParseMode(mode_str)) { - prefs->SetString(prefs::kDnsOverHttpsMode, mode_str.as_string()); + prefs->SetString(prefs::kDnsOverHttpsMode, std::string(mode_str)); } else { // Default to "off". prefs->SetString(prefs::kDnsOverHttpsMode, SecureDnsConfig::kModeOff);
diff --git a/chrome/browser/net/storage_test_utils.cc b/chrome/browser/net/storage_test_utils.cc index 7323637..1f9d29a 100644 --- a/chrome/browser/net/storage_test_utils.cc +++ b/chrome/browser/net/storage_test_utils.cc
@@ -37,11 +37,7 @@ void ExpectFrameContent(content::RenderFrameHost* frame, const std::string& expected) { - std::string content; - ASSERT_TRUE(ExecuteScriptAndExtractString( - frame, "window.domAutomationController.send(document.body.textContent)", - &content)); - EXPECT_EQ(expected, content); + EXPECT_EQ(expected, content::EvalJs(frame, "document.body.textContent")); } void ExpectCookiesOnHost(content::BrowserContext* context, @@ -52,45 +48,45 @@ void SetStorageForFrame(content::RenderFrameHost* frame) { for (const auto& data_type : kStorageTypesForFrame) { - bool data = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - frame, "set" + data_type + "()", &data)); + bool data = content::EvalJs(frame, "set" + data_type + "()", + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_TRUE(data) << "SetStorageForFrame for " << data_type; } } void SetStorageForWorker(content::RenderFrameHost* frame) { for (const auto& data_type : kStorageTypesForWorker) { - bool data = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - frame, "set" + data_type + "()", &data)); + bool data = content::EvalJs(frame, "set" + data_type + "()", + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_TRUE(data) << "SetStorageForWorker for " << data_type; } } void ExpectStorageForFrame(content::RenderFrameHost* frame, bool expected) { for (const auto& data_type : kStorageTypesForFrame) { - bool data = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - frame, "has" + data_type + "();", &data)); + bool data = content::EvalJs(frame, "has" + data_type + "();", + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_EQ(expected, data) << "ExpectStorageForFrame for " << data_type; } } void ExpectStorageForWorker(content::RenderFrameHost* frame, bool expected) { for (const auto& data_type : kStorageTypesForWorker) { - bool data = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - frame, "has" + data_type + "();", &data)); + bool data = content::EvalJs(frame, "has" + data_type + "();", + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_EQ(expected, data) << "ExpectStorageForWorker for " << data_type; } } void SetCrossTabInfoForFrame(content::RenderFrameHost* frame) { for (const auto& data_type : kCrossTabCommunicationTypes) { - bool data = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - frame, "set" + data_type + "()", &data)); + bool data = content::EvalJs(frame, "set" + data_type + "()", + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_TRUE(data) << data_type; } } @@ -98,26 +94,26 @@ void ExpectCrossTabInfoForFrame(content::RenderFrameHost* frame, bool expected) { for (const auto& data_type : kCrossTabCommunicationTypes) { - bool data = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - frame, "has" + data_type + "();", &data)); + bool data = content::EvalJs(frame, "has" + data_type + "();", + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_EQ(expected, data) << data_type; } } void RequestStorageAccessForFrame(content::RenderFrameHost* frame, bool should_resolve) { - bool data = false; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool(frame, kRequestStorageAccess, - &data)); + bool data = content::EvalJs(frame, kRequestStorageAccess, + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_EQ(should_resolve, data) << "document.requestStorageAccess()"; } void CheckStorageAccessForFrame(content::RenderFrameHost* frame, bool access_expected) { - bool data = false; - EXPECT_TRUE( - content::ExecuteScriptAndExtractBool(frame, kHasStorageAccess, &data)); + bool data = content::EvalJs(frame, kHasStorageAccess, + content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + .ExtractBool(); EXPECT_EQ(access_expected, data) << "document.hasStorageAccess()"; }
diff --git a/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc b/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc index e528fa2a..3dbf3cba2 100644 --- a/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc +++ b/chrome/browser/notifications/scheduler/internal/notification_scheduler.cc
@@ -10,10 +10,10 @@ #include <vector> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/logging.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/notifications/scheduler/internal/background_task_coordinator.h" #include "chrome/browser/notifications/scheduler/internal/display_decider.h"
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc index 99a57853..43341c3 100644 --- a/chrome/browser/pdf/pdf_extension_test.cc +++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -20,6 +20,7 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/strings/pattern.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -3054,7 +3055,7 @@ << "Our back pointer points to something unexpected."; if (!line.empty()) lines.push_back(line); - line = trimmed_name.as_string(); + line = std::string(trimmed_name); } previous_node_id = node->id();
diff --git a/chrome/browser/pdf/pdf_extension_util.cc b/chrome/browser/pdf/pdf_extension_util.cc index cbdd07c..67a71404 100644 --- a/chrome/browser/pdf/pdf_extension_util.cc +++ b/chrome/browser/pdf/pdf_extension_util.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/pdf/pdf_extension_util.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/values.h" #include "build/chromeos_buildflags.h" @@ -162,9 +163,9 @@ } // namespace std::string GetManifest() { - std::string manifest_contents = ui::ResourceBundle::GetSharedInstance() - .GetRawDataResource(IDR_PDF_MANIFEST) - .as_string(); + std::string manifest_contents( + ui::ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_PDF_MANIFEST)); DCHECK(manifest_contents.find(kNameTag) != std::string::npos); base::ReplaceFirstSubstringAfterOffset( &manifest_contents, 0, kNameTag,
diff --git a/chrome/browser/policy/browser_dm_token_storage_linux.cc b/chrome/browser/policy/browser_dm_token_storage_linux.cc index bbc1e958..be88da2 100644 --- a/chrome/browser/policy/browser_dm_token_storage_linux.cc +++ b/chrome/browser/policy/browser_dm_token_storage_linux.cc
@@ -16,6 +16,7 @@ #include "base/logging.h" #include "base/no_destructor.h" #include "base/path_service.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/syslog_logging.h" @@ -120,8 +121,8 @@ if (!base::ReadFileToString(token_file_path, &enrollment_token)) return std::string(); - return base::TrimWhitespaceASCII(enrollment_token, base::TRIM_ALL) - .as_string(); + return std::string( + base::TrimWhitespaceASCII(enrollment_token, base::TRIM_ALL)); } std::string BrowserDMTokenStorageLinux::InitDMToken() { @@ -133,7 +134,7 @@ if (!base::ReadFileToString(token_file_path, &token)) return std::string(); - return base::TrimWhitespaceASCII(token, base::TRIM_ALL).as_string(); + return std::string(base::TrimWhitespaceASCII(token, base::TRIM_ALL)); } bool BrowserDMTokenStorageLinux::InitEnrollmentErrorOption() { @@ -151,7 +152,7 @@ if (!base::ReadFileToString(options_file_path, &options)) return false; - return base::TrimWhitespaceASCII(options, base::TRIM_ALL).as_string() == + return base::TrimWhitespaceASCII(options, base::TRIM_ALL) == kEnrollmentMandatoryOption; }
diff --git a/chrome/browser/policy/browser_dm_token_storage_win.cc b/chrome/browser/policy/browser_dm_token_storage_win.cc index 7d7ecb6..d3c1adad 100644 --- a/chrome/browser/policy/browser_dm_token_storage_win.cc +++ b/chrome/browser/policy/browser_dm_token_storage_win.cc
@@ -191,9 +191,8 @@ continue; DCHECK_LE(size, installer::kMaxDMTokenLength); - return base::TrimWhitespaceASCII(base::StringPiece(raw_value.data(), size), - base::TRIM_ALL) - .as_string(); + return std::string(base::TrimWhitespaceASCII( + base::StringPiece(raw_value.data(), size), base::TRIM_ALL)); } DVLOG(1) << "Failed to get DMToken from Registry.";
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 2bc65a0..e2d3347 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -769,6 +769,7 @@ media_router::RegisterLocalStatePrefs(registry); metrics::TabStatsTracker::RegisterPrefs(registry); RegisterBrowserPrefs(registry); + speech::SodaInstaller::RegisterLocalStatePrefs(registry); StartupBrowserCreator::RegisterLocalStatePrefs(registry); task_manager::TaskManagerInterface::RegisterPrefs(registry); UpgradeDetector::RegisterPrefs(registry);
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html index 7ec97be9..a2eb61d 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_button.html
@@ -25,6 +25,7 @@ #emoji-button:focus, #emoji-button:active { --emoji-background: rgba(var(--cr-hairline-rgb), 0.1); + border-radius: 50%; outline-color: var(--cr-toggle-color); outline-width: 2px; }
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html index 27841cc..432350a 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.html
@@ -143,11 +143,13 @@ </div> <div id="message" class="sr-only" aria-live="polite"></div> -<div class="side-padding"> - <emoji-search id$="search-container" emoji-data="[[emojiData]]" - search="{{search}}"> + <emoji-search + class="side-padding" + id$="search-container" + emoji-data="[[emojiData]]" + search="{{search}}" + on-scroll="onSearchScroll"> </emoji-search> -</div> <div id="list-container"> <div class="sr-only" role="heading" aria-level="1">Emoji Group Buttons</div>
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html index 3458d8fc..8ec382fa 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.html
@@ -2,8 +2,7 @@ :host { display: flex; flex-direction: column; - height: 100%; - width: 100%; + overflow-y: scroll; } cr-search-field { --cr-search-field-clear-icon-margin-end: 14px; @@ -31,11 +30,6 @@ border: 2px solid var(--cr-focus-outline-color); } - #container { - flex-grow: 1; - overflow-y: scroll; - } - .result { border: 2px solid transparent; display: flex; @@ -75,11 +69,14 @@ top: 50%; transform: translate(-50%, -50%); } - #search-shadow { + background-color: var(--cr-card-background-color); + margin-inline-end: calc(0px - var(--emoji-picker-side-padding)); margin-inline-start: calc(0px - var(--emoji-picker-side-padding)); padding-inline-end: var(--emoji-picker-side-padding); padding-inline-start: var(--emoji-picker-side-padding); + position: sticky; + top:0; width: calc(var(--emoji-picker-width) - 2*var(--emoji-picker-side-padding)); } </style> @@ -88,29 +85,25 @@ <cr-search-field id="search" label="Search" autofocus="true"></cr-search-field> </div> -<div id="container" on-scroll="onContainerScroll"> +<template is="dom-if" if="[[search]]"> - <template is="dom-if" if="[[search]]"> - - <div class="sr-only" role="heading" aria-level="1"> - Emoji Search Results + <div class="sr-only" role="heading" aria-level="1"> + Emoji Search Results + </div> + <template is="dom-repeat" items="[[results]]"> + <div class="result" tabindex="0" on-click="onResultClick"> + <emoji-button tabindex="-1" + emoji="[[item.item.base.string]]" + variants="[[item.item.alternates]]"> + </emoji-button> + <div class="name">[[item.item.base.name]]</div> </div> - <template is="dom-repeat" items="[[results]]"> - <div class="result" tabindex="0" on-click="onResultClick"> - <emoji-button tabindex="-1" - emoji="[[item.item.base.string]]" - variants="[[item.item.alternates]]"> - </emoji-button> - <div class="name">[[item.item.base.name]]</div> + </template> + <template is="dom-if" if="[[!results.length]]"> + <div class="no-result"> + <img src="no_results.svg"> + No emoji found </div> - </template> - <template is="dom-if" if="[[!results.length]]"> - <div class="no-result"> - <img src="no_results.svg"> - No emoji found - </div> - </template> - </template> -</div> \ No newline at end of file +</template>
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js index 80cfb14..f64785d 100644 --- a/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js +++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_search.js
@@ -52,6 +52,9 @@ 'base.keywords', ] }); + this.addEventListener('scroll', () => { + this.onSearchScroll(); + }); } ready() { @@ -160,11 +163,9 @@ })).values()); } - onContainerScroll() { - this.shadowRoot.getElementById('search-shadow').style.boxShadow = - this.shadowRoot.getElementById('container').scrollTop > 0 ? - 'var(--cr-elevation-3)' : - 'none'; + onSearchScroll() { + this.$['search-shadow'].style.boxShadow = + this.scrollTop > 0 ? 'var(--cr-elevation-3)' : 'none'; } /**
diff --git a/chrome/browser/resources/management/icons.html b/chrome/browser/resources/management/icons.html index a17a0212..8043cba 100644 --- a/chrome/browser/resources/management/icons.html +++ b/chrome/browser/resources/management/icons.html
@@ -10,6 +10,7 @@ <g id="linux"><path d="M 6.9375 22.042969 C 3.867188 20.457031 1.886719 17.347656 1.824219 13.234375 C 1.527344 13.378906 1.1875 13.402344 0.800781 13.265625 C -0.3125 12.875 -0.0625 11.578125 0.34375 10.421875 C 0.683594 9.460938 1.835938 8.761719 2.402344 8.613281 C 3.71875 3.78125 6.804688 0 12 0 C 17.257812 0 20.367188 3.625 21.644531 8.628906 C 22.222656 8.796875 23.324219 9.484375 23.65625 10.421875 C 24.0625 11.578125 24.3125 12.875 23.199219 13.265625 C 22.8125 13.402344 22.472656 13.378906 22.175781 13.234375 C 22.117188 17.375 20.140625 20.472656 17.070312 22.046875 C 17.257812 22.191406 17.363281 22.375 17.363281 22.613281 C 17.363281 23.378906 17.75 24 14.898438 24 C 12.8125 24 12.457031 23.578125 12.417969 23.117188 C 12.28125 23.035156 12.140625 22.910156 12 22.910156 C 11.859375 22.910156 11.71875 23.042969 11.582031 23.128906 C 11.535156 23.582031 11.171875 24 9.101562 24 C 6.25 24 6.636719 23.378906 6.636719 22.613281 C 6.636719 22.371094 6.746094 22.183594 6.9375 22.042969 Z M 12 21.222656 C 17.929688 21.222656 20.070312 17.1875 20.070312 11.820312 C 20.070312 7.371094 18.125 3.28125 14.898438 2.597656 C 13.863281 2.378906 13.136719 4.761719 12 4.761719 C 10.863281 4.761719 10.035156 2.378906 9.101562 2.597656 C 5.863281 3.359375 3.929688 7.605469 3.929688 11.820312 C 3.929688 16.882812 6.070312 21.222656 12 21.222656 Z M 8.277344 9.324219 C 7.589844 9.324219 7.035156 8.789062 7.035156 8.132812 C 7.035156 7.476562 7.589844 6.941406 8.277344 6.941406 C 8.960938 6.941406 9.515625 7.476562 9.515625 8.132812 C 9.515625 8.789062 8.960938 9.324219 8.277344 9.324219 Z M 15.722656 9.324219 C 15.039062 9.324219 14.484375 8.789062 14.484375 8.132812 C 14.484375 7.476562 15.039062 6.941406 15.722656 6.941406 C 16.410156 6.941406 16.964844 7.476562 16.964844 8.132812 C 16.964844 8.789062 16.410156 9.324219 15.722656 9.324219 Z M 12.226562 9.964844 L 13.929688 10.683594 C 14.222656 10.804688 14.355469 11.132812 14.226562 11.414062 C 14.199219 11.46875 14.164062 11.519531 14.121094 11.5625 L 12.425781 13.308594 C 12.210938 13.535156 11.839844 13.546875 11.601562 13.339844 C 11.589844 13.332031 11.578125 13.320312 11.566406 13.308594 L 9.878906 11.558594 C 9.660156 11.332031 9.675781 10.980469 9.914062 10.773438 C 9.960938 10.734375 10.011719 10.703125 10.070312 10.679688 L 11.75 9.964844 C 11.898438 9.902344 12.074219 9.902344 12.226562 9.964844 Z M 12.226562 9.964844"></path></g> <g id="play-store"><path d="M20.18 10.88l-3.06-1.74L14.26 12l2.86 2.86 3.06-1.74c.55-.31.82-.71.82-1.12 0-.41-.27-.81-.82-1.12zM4.71 2.45l8.42 8.42 2.55-2.55-10.7-6.06c-.07-.04-.14-.07-.21-.1-.17-.07-.3.05-.15.21.03.02.06.05.09.08zm0 19.1l-.08.08c-.15.15-.02.28.15.21.07-.03.14-.06.21-.1l10.69-6.06-2.55-2.55s-7.2 7.21-8.42 8.42zM12 12L3.38 3.38c-.19-.19-.38-.07-.38.19v16.86c0 .26.19.38.38.19L12 12z"></path></g> <g id="crash"><path d="M23 12l-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68L23 12zm-4.51 2.11l.26 2.79-2.74.62-1.43 2.41L12 18.82l-2.58 1.11-1.43-2.41-2.74-.62.26-2.8L3.66 12l1.85-2.12-.26-2.78 2.74-.61 1.43-2.41L12 5.18l2.58-1.11 1.43 2.41 2.74.62-.26 2.79L20.34 12l-1.85 2.11zM11 15h2v2h-2zm0-8h2v6h-2z"></path></g> + <g id="policy"><path d="M21,5l-9-4L3,5v6c0,5.55,3.84,10.74,9,12c2.3-0.56,4.33-1.9,5.88-3.71l-3.12-3.12c-1.94,1.29-4.58,1.07-6.29-0.64 c-1.95-1.95-1.95-5.12,0-7.07c1.95-1.95,5.12-1.95,7.07,0c1.71,1.71,1.92,4.35,0.64,6.29l2.9,2.9C20.29,15.69,21,13.38,21,11V5z"></path><circle cx="12" cy="12" r="3"></circle></g> </if> <g id="account-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"></path><path d="M0 0h24v24H0z" fill="none"></path></g> <g id="public"><path d="M0 0h24v24H0z" fill="none"></path><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"></path></g>
diff --git a/chrome/browser/resources/management/management_browser_proxy.js b/chrome/browser/resources/management/management_browser_proxy.js index 65dee721..8233bfa5 100644 --- a/chrome/browser/resources/management/management_browser_proxy.js +++ b/chrome/browser/resources/management/management_browser_proxy.js
@@ -78,6 +78,7 @@ LOGS: 'logs', PRINT: 'print', PRINT_JOBS: 'print jobs', + DLP_EVENTS: 'dlp events', CROSTINI: 'crostini', USERNAME: 'username', EXTENSION: 'extension',
diff --git a/chrome/browser/resources/management/management_ui.js b/chrome/browser/resources/management/management_ui.js index 4928d55..489f91a 100644 --- a/chrome/browser/resources/management/management_ui.js +++ b/chrome/browser/resources/management/management_ui.js
@@ -279,6 +279,8 @@ return 'cr:print'; case DeviceReportingType.PRINT_JOBS: return 'cr:print'; + case DeviceReportingType.DLP_EVENTS: + return 'management:policy'; case DeviceReportingType.CROSTINI: return 'management:linux'; case DeviceReportingType.USERNAME:
diff --git a/chrome/browser/safe_xml_parser_browsertest.cc b/chrome/browser/safe_xml_parser_browsertest.cc index f0ebf5fc7c..1eacdaaa 100644 --- a/chrome/browser/safe_xml_parser_browsertest.cc +++ b/chrome/browser/safe_xml_parser_browsertest.cc
@@ -8,6 +8,7 @@ #include "base/callback_helpers.h" #include "base/json/json_reader.h" #include "base/macros.h" +#include "base/strings/string_piece.h" #include "base/token.h" #include "base/values.h" #include "chrome/test/base/in_process_browser_test.h" @@ -45,7 +46,7 @@ } data_decoder::DataDecoder::ParseXmlIsolated( - xml.as_string(), + std::string(xml), base::BindOnce(&SafeXmlParserTest::XmlParsingDone, base::Unretained(this), run_loop.QuitClosure(), std::move(expected_value)));
diff --git a/chrome/browser/shell_integration_linux_unittest.cc b/chrome/browser/shell_integration_linux_unittest.cc index 5828022..aee01817 100644 --- a/chrome/browser/shell_integration_linux_unittest.cc +++ b/chrome/browser/shell_integration_linux_unittest.cc
@@ -18,6 +18,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_path_override.h" @@ -43,12 +44,12 @@ MockEnvironment() {} void Set(base::StringPiece name, const std::string& value) { - variables_[name.as_string()] = value; + variables_[std::string(name)] = value; } bool GetVar(base::StringPiece variable_name, std::string* result) override { - if (base::Contains(variables_, variable_name.as_string())) { - *result = variables_[variable_name.as_string()]; + if (base::Contains(variables_, std::string(variable_name))) { + *result = variables_[std::string(variable_name)]; return true; }
diff --git a/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc b/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc index 1522654..dab5dbb 100644 --- a/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc +++ b/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc
@@ -8,6 +8,7 @@ #include <utility> #include <vector> +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/syslog_logging.h" #include "base/values.h" @@ -113,9 +114,8 @@ // Separate the valid languages from the unknown / unsupported languages and // the languages that also appear in the SpellcheckLanguage policy. for (const base::Value& language : value->GetList()) { - std::string candidate_language = - base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL) - .as_string(); + std::string candidate_language( + base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL)); std::string current_language = SpellcheckService::GetSupportedAcceptLanguageCode(candidate_language);
diff --git a/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc b/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc index f4072f31..9d7ca32b 100644 --- a/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc +++ b/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc
@@ -7,6 +7,7 @@ #include <utility> #include <vector> +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/syslog_logging.h" #include "base/values.h" @@ -87,9 +88,8 @@ // Separate the valid languages from the unknown / unsupported languages. for (const base::Value& language : value->GetList()) { - std::string candidate_language = - base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL) - .as_string(); + std::string candidate_language( + base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL)); std::string current_language = SpellcheckService::GetSupportedAcceptLanguageCode(candidate_language);
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc b/chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.cc similarity index 74% rename from chrome/browser/subresource_filter/chrome_subresource_filter_client.cc rename to chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.cc index 9053646a..54d79905 100644 --- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc +++ b/chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" +#include "chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/infobars/infobar_service.h" @@ -13,10 +13,6 @@ #include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" #include "components/subresource_filter/content/browser/ruleset_service.h" -#if defined(OS_ANDROID) -#include "chrome/browser/infobars/infobar_service.h" -#endif - namespace { // Returns a scoped refptr to the SafeBrowsingService's database manager, if @@ -31,18 +27,8 @@ } // namespace -ChromeSubresourceFilterClient::ChromeSubresourceFilterClient( - content::WebContents* web_contents) - : web_contents_(web_contents) { - DCHECK(web_contents_); -} - -ChromeSubresourceFilterClient::~ChromeSubresourceFilterClient() = default; - -// static -void ChromeSubresourceFilterClient:: - CreateThrottleManagerWithClientForWebContents( - content::WebContents* web_contents) { +void CreateSubresourceFilterThrottleManagerForWebContents( + content::WebContents* web_contents) { subresource_filter::RulesetService* ruleset_service = g_browser_process->subresource_filter_ruleset_service(); subresource_filter::VerifiedRulesetDealer::Handle* dealer = @@ -50,7 +36,6 @@ subresource_filter::ContentSubresourceFilterThrottleManager:: CreateForWebContents( web_contents, - std::make_unique<ChromeSubresourceFilterClient>(web_contents), SubresourceFilterProfileContextFactory::GetForProfile( Profile::FromBrowserContext(web_contents->GetBrowserContext())), InfoBarService::FromWebContents(web_contents),
diff --git a/chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.h b/chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.h new file mode 100644 index 0000000..7d9242e --- /dev/null +++ b/chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.h
@@ -0,0 +1,17 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SUBRESOURCE_FILTER_CHROME_CONTENT_SUBRESOURCE_FILTER_THROTTLE_MANAGER_FACTORY_H_ +#define CHROME_BROWSER_SUBRESOURCE_FILTER_CHROME_CONTENT_SUBRESOURCE_FILTER_THROTTLE_MANAGER_FACTORY_H_ + +namespace content { +class WebContents; +} // namespace content + +// Creates a ContentSubresourceFilterThrottleManager and attaches it to +// |web_contents|, passing it embedder-level state. +void CreateSubresourceFilterThrottleManagerForWebContents( + content::WebContents* web_contents); + +#endif // CHROME_BROWSER_SUBRESOURCE_FILTER_CHROME_CONTENT_SUBRESOURCE_FILTER_THROTTLE_MANAGER_FACTORY_H_
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.h b/chrome/browser/subresource_filter/chrome_subresource_filter_client.h deleted file mode 100644 index 5aeae20..0000000 --- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SUBRESOURCE_FILTER_CHROME_SUBRESOURCE_FILTER_CLIENT_H_ -#define CHROME_BROWSER_SUBRESOURCE_FILTER_CHROME_SUBRESOURCE_FILTER_CLIENT_H_ - -#include <memory> - -#include "base/macros.h" -#include "build/build_config.h" -#include "components/subresource_filter/content/browser/subresource_filter_client.h" - -namespace content { -class WebContents; -} // namespace content - -namespace subresource_filter { -class ContentSubresourceFilterThrottleManager; -} // namespace subresource_filter - -// Chrome implementation of SubresourceFilterClient. Instances are associated -// with and owned by ContentSubresourceFilterThrottleManager instances. -class ChromeSubresourceFilterClient - : public subresource_filter::SubresourceFilterClient { - public: - explicit ChromeSubresourceFilterClient(content::WebContents* web_contents); - ~ChromeSubresourceFilterClient() override; - - // Creates a ContentSubresourceFilterThrottleManager and attaches it to - // |web_contents|, passing it an instance of this client and other - // embedder-level state. - static void CreateThrottleManagerWithClientForWebContents( - content::WebContents* web_contents); - - // SubresourceFilterClient: - void OnNotificationShown() override {} - - private: - content::WebContents* web_contents_; - - std::unique_ptr<subresource_filter::ContentSubresourceFilterThrottleManager> - throttle_manager_; - - DISALLOW_COPY_AND_ASSIGN(ChromeSubresourceFilterClient); -}; - -#endif // CHROME_BROWSER_SUBRESOURCE_FILTER_CHROME_SUBRESOURCE_FILTER_CLIENT_H_
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index b9602700b..3eee024 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1863,6 +1863,8 @@ "app_list/search/search_result_ranker/recurrence_ranker_util.h", "app_list/search/search_result_ranker/search_result_ranker.cc", "app_list/search/search_result_ranker/search_result_ranker.h", + "app_list/search/search_tags_util.cc", + "app_list/search/search_tags_util.h", "ash/accessibility/accessibility_controller_client.cc", "ash/accessibility/accessibility_controller_client.h", "ash/ambient/ambient_client_impl.cc",
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc index 41eaed20..8ad7f99 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -18,6 +18,7 @@ #include "base/observer_list.h" #include "base/scoped_multi_source_observation.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" @@ -620,21 +621,20 @@ for (size_t i = 1; i < parts.size() - 1; ++i) { const size_t separator = parts[i].find('='); if (separator == std::string::npos) { - intent->AddExtraParam(parts[i].as_string()); + intent->AddExtraParam(std::string(parts[i])); continue; } const base::StringPiece key = parts[i].substr(0, separator); const base::StringPiece value = parts[i].substr(separator + 1); if (key == kAction) { - intent->set_action(value.as_string()); + intent->set_action(std::string(value)); } else if (key == kCategory) { - intent->set_category(value.as_string()); + intent->set_category(std::string(value)); } else if (key == kLaunchFlags) { uint32_t launch_flags; - const bool parsed = - base::HexStringToUInt(value.as_string(), &launch_flags); + const bool parsed = base::HexStringToUInt(value, &launch_flags); if (!parsed) { - DVLOG(1) << "Failed to parse launchFlags: " << value.as_string() << "."; + DVLOG(1) << "Failed to parse launchFlags: " << value << "."; return false; } intent->set_launch_flags(launch_flags); @@ -643,18 +643,18 @@ if (component_separator == std::string::npos) return false; intent->set_package_name( - value.substr(0, component_separator).as_string()); + std::string(value.substr(0, component_separator))); const base::StringPiece activity_compact_name = value.substr(component_separator + 1); if (!activity_compact_name.empty() && activity_compact_name[0] == '.') { - std::string activity = value.substr(0, component_separator).as_string(); - activity += activity_compact_name.as_string(); + std::string activity(value.substr(0, component_separator)); + activity += std::string(activity_compact_name); intent->set_activity(activity); } else { - intent->set_activity(activity_compact_name.as_string()); + intent->set_activity(std::string(activity_compact_name)); } } else { - intent->AddExtraParam(parts[i].as_string()); + intent->AddExtraParam(std::string(parts[i])); } }
diff --git a/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc b/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc index fd0681f57..0a5df4f 100644 --- a/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc +++ b/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc
@@ -73,31 +73,7 @@ // Metrics utilities //------------------ -// TODO(crbug.com/1034842): Add unit tests for histograms - -// Possible outcomes of a call to the ItemSuggest API. These values persist to -// logs. Entries should not be renumbered and numeric values should never be -// reused. -enum class Status { - kOk = 0, - kDisabledByExperiment = 1, - kDisabledByPolicy = 2, - kInvalidServerUrl = 3, - kNoIdentityManager = 4, - kGoogleAuthError = 5, - kNetError = 6, - kResponseTooLarge = 7, - k3xxStatus = 8, - k4xxStatus = 9, - k5xxStatus = 10, - kEmptyResponse = 11, - kNoResultsInResponse = 12, - kJsonParseFailure = 13, - kJsonConversionFailure = 14, - kMaxValue = kJsonConversionFailure, -}; - -void LogStatus(Status status) { +void LogStatus(ItemSuggestCache::Status status) { UMA_HISTOGRAM_ENUMERATION("Apps.AppList.ItemSuggestCache.Status", status); }
diff --git a/chrome/browser/ui/app_list/search/files/item_suggest_cache.h b/chrome/browser/ui/app_list/search/files/item_suggest_cache.h index 801a0fdd..1c2de97 100644 --- a/chrome/browser/ui/app_list/search/files/item_suggest_cache.h +++ b/chrome/browser/ui/app_list/search/files/item_suggest_cache.h
@@ -72,6 +72,28 @@ // Whether or not to override configuration of the cache with an experiment. static const base::Feature kExperiment; + // Possible outcomes of a call to the ItemSuggest API. These values persist to + // logs. Entries should not be renumbered and numeric values should never be + // reused. + enum class Status { + kOk = 0, + kDisabledByExperiment = 1, + kDisabledByPolicy = 2, + kInvalidServerUrl = 3, + kNoIdentityManager = 4, + kGoogleAuthError = 5, + kNetError = 6, + kResponseTooLarge = 7, + k3xxStatus = 8, + k4xxStatus = 9, + k5xxStatus = 10, + kEmptyResponse = 11, + kNoResultsInResponse = 12, + kJsonParseFailure = 13, + kJsonConversionFailure = 14, + kMaxValue = kJsonConversionFailure, + }; + private: // Whether or not the ItemSuggestCache is enabled. static constexpr base::FeatureParam<bool> kEnabled{&kExperiment, "enabled",
diff --git a/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc b/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc index b4c5a2d..0361467 100644 --- a/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc +++ b/chrome/browser/ui/app_list/search/files/item_suggest_cache_unittest.cc
@@ -7,17 +7,67 @@ #include <vector> #include "base/json/json_reader.h" -#include "chrome/browser/profiles/profile.h" +#include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/simple_test_clock.h" +#include "base/test/task_environment.h" +#include "chrome/browser/signin/chrome_signin_client_factory.h" +#include "chrome/browser/signin/chrome_signin_client_test_util.h" +#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "components/drive/drive_pref_names.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "content/public/test/browser_task_environment.h" +#include "google_apis/gaia/gaia_urls.h" +#include "net/http/http_util.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" +#include "services/network/test/test_url_loader_factory.h" +#include "services/network/test/test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +namespace { + +constexpr char kEmail[] = "test-user@example.com"; +constexpr char kRequestUrl[] = + "https://appsitemsuggest-pa.googleapis.com/v1/items"; +constexpr char kValidJsonResponse[] = R"( + { + "item": [ + { + "itemId": "item id 1", + "displayText": "display text 1" + }, + { + "itemId": "item id 2", + "displayText": "display text 2", + "predictionReason": "unused field" + }, + { + "itemId": "item id 3", + "displayText": "display text 3" + } + ], + "suggestionSessionId": "suggestion id 1" + })"; +constexpr char kStatusHistogramName[] = "Apps.AppList.ItemSuggestCache.Status"; +constexpr char kResponseSizeHistogramName[] = + "Apps.AppList.ItemSuggestCache.ResponseSize"; +} // namespace + namespace app_list { +using base::test::ScopedFeatureList; // TODO(crbug.com/1034842): Add test checking we make no requests when disabled // by experiment or policy. class ItemSuggestCacheTest : public testing::Test { - public: + protected: ItemSuggestCacheTest() = default; ~ItemSuggestCacheTest() override = default; @@ -44,29 +94,53 @@ ResultMatches(actual->results[i], results[i].first, results[i].second); } } + + void SetUp() override { + profile_manager_ = std::make_unique<TestingProfileManager>( + TestingBrowserProcess::GetGlobal()); + ASSERT_TRUE(profile_manager_->SetUp()); + TestingProfile::TestingFactories factories = + IdentityTestEnvironmentProfileAdaptor:: + GetIdentityTestEnvironmentFactories(); + factories.push_back( + {ChromeSigninClientFactory::GetInstance(), + base::BindRepeating(&BuildChromeSigninClientWithURLLoader, + &url_loader_factory_)}); + profile_ = profile_manager_->CreateTestingProfile( + kEmail, /*prefs=*/{}, base::UTF8ToUTF16(kEmail), + /*avatar_id=*/0, /*supervised_user_id=*/{}, factories); + + identity_test_env_adaptor_ = + std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_); + identity_test_env_ = identity_test_env_adaptor_->identity_test_env(); + identity_test_env_->SetTestURLLoaderFactory(&url_loader_factory_); + shared_url_loader_factory_ = + base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( + &url_loader_factory_); + } + + content::BrowserTaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + signin::IdentityTestEnvironment* identity_test_env_; + std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> + identity_test_env_adaptor_; + + std::unique_ptr<TestingProfileManager> profile_manager_; + TestingProfile* profile_; + + network::TestURLLoaderFactory url_loader_factory_; + data_decoder::test::InProcessDataDecoder in_process_data_decoder_; + scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_; + + ScopedFeatureList scoped_feature_list_; + base::Feature feature_ = ItemSuggestCache::kExperiment; + + const base::HistogramTester histogram_tester_; }; TEST_F(ItemSuggestCacheTest, ConvertJsonSuccess) { - const base::Value full = Parse(R"( - { - "item": [ - { - "itemId": "item id 1", - "displayText": "display text 1" - }, - { - "itemId": "item id 2", - "displayText": "display text 2", - "predictionReason": "unused field" - }, - { - "itemId": "item id 3", - "displayText": "display text 3" - } - ], - "suggestionSessionId": "the suggestion id" - })"); - ResultsMatch(ItemSuggestCache::ConvertJsonForTest(&full), "the suggestion id", + const base::Value full = Parse(kValidJsonResponse); + ResultsMatch(ItemSuggestCache::ConvertJsonForTest(&full), "suggestion id 1", {{"item id 1", "display text 1"}, {"item id 2", "display text 2"}, {"item id 3", "display text 3"}}); @@ -123,4 +197,298 @@ EXPECT_FALSE(ItemSuggestCache::ConvertJsonForTest(&no_items).has_value()); } +TEST_F(ItemSuggestCacheTest, UpdateCacheDisabledByExperiment) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + feature_, {{"enabled", "false"}}); + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + itemSuggestCache->UpdateCache(); + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kDisabledByExperiment, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheDisabledByPolicy) { + profile_->GetPrefs()->SetBoolean(drive::prefs::kDisableDrive, true); + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + itemSuggestCache->UpdateCache(); + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kDisabledByPolicy, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheServerUrlIsNotHttps) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + feature_, + {{"server_url", "http://appsitemsuggest-pa.googleapis.com/v1/items"}}); + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + itemSuggestCache->UpdateCache(); + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kInvalidServerUrl, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheServerUrlIsNotGoogleDomain) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + feature_, {{"server_url", "https://foo.com"}}); + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + itemSuggestCache->UpdateCache(); + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kInvalidServerUrl, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheServerNoAuthToken) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + itemSuggestCache->UpdateCache(); + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kGoogleAuthError, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheInsufficientResourcesError) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + + auto head = network::CreateURLResponseHead(net::HTTP_OK); + network::URLLoaderCompletionStatus status(net::ERR_INSUFFICIENT_RESOURCES); + url_loader_factory_.AddResponse(GURL(kRequestUrl), std::move(head), "content", + status); + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kResponseTooLarge, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheNetError) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + + auto head = network::CreateURLResponseHead(net::HTTP_OK); + network::URLLoaderCompletionStatus status(net::ERR_FAILED); + url_loader_factory_.AddResponse(GURL(kRequestUrl), std::move(head), "content", + status); + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kStatusHistogramName, + ItemSuggestCache::Status::kNetError, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCache5kkError) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + + auto head = network::mojom::URLResponseHead::New(); + std::string headers("HTTP/1.1 500 Owiee\nContent-type: application/json\n\n"); + head->headers = base::MakeRefCounted<net::HttpResponseHeaders>( + net::HttpUtil::AssembleRawHeaders(headers)); + + url_loader_factory_.AddResponse(GURL(kRequestUrl), std::move(head), + /* content= */ "", + network::URLLoaderCompletionStatus(net::OK)); + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kStatusHistogramName, + ItemSuggestCache::Status::k5xxStatus, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCache4kkError) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + + auto head = network::mojom::URLResponseHead::New(); + std::string headers("HTTP/1.1 400 Owiee\nContent-type: application/json\n\n"); + head->headers = base::MakeRefCounted<net::HttpResponseHeaders>( + net::HttpUtil::AssembleRawHeaders(headers)); + + url_loader_factory_.AddResponse(GURL(kRequestUrl), std::move(head), + /* content= */ "", + network::URLLoaderCompletionStatus(net::OK)); + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kStatusHistogramName, + ItemSuggestCache::Status::k4xxStatus, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCache3kkError) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + + auto head = network::mojom::URLResponseHead::New(); + std::string headers("HTTP/1.1 300 Owiee\nContent-type: application/json\n\n"); + head->headers = base::MakeRefCounted<net::HttpResponseHeaders>( + net::HttpUtil::AssembleRawHeaders(headers)); + + url_loader_factory_.AddResponse(GURL(kRequestUrl), std::move(head), + /* content= */ "", + network::URLLoaderCompletionStatus(net::OK)); + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kStatusHistogramName, + ItemSuggestCache::Status::k3xxStatus, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheEmptyResponse) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + url_loader_factory_.AddResponse(kRequestUrl, + /* content= */ "", net::HTTP_OK); + + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kEmptyResponse, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheInvalidResponse) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + url_loader_factory_.AddResponse(kRequestUrl, "invalid = json", net::HTTP_OK); + + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kResponseSizeHistogramName, + /* sample= */ 14, + /* expected_count= */ 1); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kJsonParseFailure, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheConversionFailure) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + url_loader_factory_.AddResponse(kRequestUrl, + R"( + { + "a": "" + } + )", + net::HTTP_OK); + + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kResponseSizeHistogramName, 45, 1); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kJsonConversionFailure, + 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheConversionEmptyResults) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + url_loader_factory_.AddResponse(kRequestUrl, + R"( + { + "item": [], + "suggestionSessionId": "the suggestion id" + })", + net::HTTP_OK); + + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kResponseSizeHistogramName, + /* sample= */ 79, + /* expected_count= */ 1); + histogram_tester_.ExpectUniqueSample( + kStatusHistogramName, ItemSuggestCache::Status::kNoResultsInResponse, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheSavesResults) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + url_loader_factory_.AddResponse(kRequestUrl, kValidJsonResponse, + net::HTTP_OK); + + itemSuggestCache->UpdateCache(); + + task_environment_.RunUntilIdle(); + histogram_tester_.ExpectUniqueSample(kResponseSizeHistogramName, + /* sample= */ 419, + /* expected_count= */ 1); + ResultsMatch(itemSuggestCache->GetResults(), "suggestion id 1", + {{"item id 1", "display text 1"}, + {"item id 2", "display text 2"}, + {"item id 3", "display text 3"}}); + histogram_tester_.ExpectUniqueSample(kStatusHistogramName, + ItemSuggestCache::Status::kOk, 1); +} + +TEST_F(ItemSuggestCacheTest, UpdateCacheSmallTimeBetweenUpdates) { + std::unique_ptr<ItemSuggestCache> itemSuggestCache = + std::make_unique<ItemSuggestCache>(profile_, shared_url_loader_factory_); + identity_test_env_->MakePrimaryAccountAvailable(kEmail); + identity_test_env_->SetAutomaticIssueOfAccessTokens(true); + url_loader_factory_.AddResponse(kRequestUrl, + R"( + { + "item": [ + { + "itemId": "item id 1", + "displayText": "display text 1" + } + ], + "suggestionSessionId": "suggestion id 1" + })", + net::HTTP_OK); + + itemSuggestCache->UpdateCache(); + task_environment_.RunUntilIdle(); + ResultsMatch(itemSuggestCache->GetResults(), "suggestion id 1", + {{"item id 1", "display text 1"}}); + + task_environment_.AdvanceClock(base::TimeDelta::FromMinutes(2)); + + url_loader_factory_.AddResponse(kRequestUrl, + R"( + { + "item": [ + { + "itemId": "item id 2", + "displayText": "display text 2" + } + ], + "suggestionSessionId": "suggestion id 2" + })", + net::HTTP_OK); + itemSuggestCache->UpdateCache(); + task_environment_.RunUntilIdle(); + // The first set of results are in the cache since the second update occurred + // before the minimum time between updates. + ResultsMatch(itemSuggestCache->GetResults(), "suggestion id 1", + {{"item id 1", "display text 1"}}); +} + } // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.cc b/chrome/browser/ui/app_list/search/omnibox_result.cc index 80715c8a..0ddad86 100644 --- a/chrome/browser/ui/app_list/search/omnibox_result.cc +++ b/chrome/browser/ui/app_list/search/omnibox_result.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" +#include "chrome/browser/ui/app_list/search/search_tags_util.h" #include "chrome/grit/generated_resources.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/omnibox/browser/autocomplete_controller.h" @@ -68,47 +69,6 @@ "publicly available image." })"); -int ACMatchStyleToTagStyle(int styles) { - int tag_styles = 0; - if (styles & ACMatchClassification::URL) - tag_styles |= ash::SearchResultTag::URL; - if (styles & ACMatchClassification::MATCH) - tag_styles |= ash::SearchResultTag::MATCH; - if (styles & ACMatchClassification::DIM) - tag_styles |= ash::SearchResultTag::DIM; - - return tag_styles; -} - -// Translates ACMatchClassifications into ChromeSearchResult tags. -void ACMatchClassificationsToTags(const std::u16string& text, - const ACMatchClassifications& text_classes, - ChromeSearchResult::Tags* tags) { - int tag_styles = ash::SearchResultTag::NONE; - size_t tag_start = 0; - - for (size_t i = 0; i < text_classes.size(); ++i) { - const ACMatchClassification& text_class = text_classes[i]; - - // Closes current tag. - if (tag_styles != ash::SearchResultTag::NONE) { - tags->push_back( - ash::SearchResultTag(tag_styles, tag_start, text_class.offset)); - tag_styles = ash::SearchResultTag::NONE; - } - - if (text_class.style == ACMatchClassification::NONE) - continue; - - tag_start = text_class.offset; - tag_styles = ACMatchStyleToTagStyle(text_class.style); - } - - if (tag_styles != ash::SearchResultTag::NONE) { - tags->push_back(ash::SearchResultTag(tag_styles, tag_start, text.length())); - } -} - // AutocompleteMatchType::Type to vector icon, used for app list. const gfx::VectorIcon& TypeToVectorIcon(AutocompleteMatchType::Type type) { switch (type) {
diff --git a/chrome/browser/ui/app_list/search/search_controller.cc b/chrome/browser/ui/app_list/search/search_controller.cc index ea0d8cc..289622d7 100644 --- a/chrome/browser/ui/app_list/search/search_controller.cc +++ b/chrome/browser/ui/app_list/search/search_controller.cc
@@ -15,6 +15,7 @@ #include "base/bind.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/metrics_hashes.h" +#include "base/sequence_token.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -32,6 +33,8 @@ #include "chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h" #include "components/metrics/structured/structured_events.h" #include "components/prefs/pref_service.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" namespace app_list { @@ -77,8 +80,10 @@ list_controller_(list_controller) { if (app_list_features::IsCategoricalSearchEnabled()) { ranker_ = std::make_unique<RankerDelegate>(profile, model_updater, this); + mixer_ = nullptr; } else { mixer_ = std::make_unique<Mixer>(model_updater); + ranker_ = nullptr; } } @@ -101,8 +106,9 @@ : last_query_.length() - query.length(); UMA_HISTOGRAM_BOOLEAN(kLauncherSearchQueryLengthJumped, length_diff > 1); } - for (const auto& provider : providers_) + for (const auto& provider : providers_) { provider->Start(query); + } dispatching_query_ = false; last_query_ = query; @@ -154,24 +160,49 @@ void SearchController::AddProvider(size_t group_id, std::unique_ptr<SearchProvider> provider) { - if (!ranker_) { + if (ranker_) { + provider->set_controller(this); + } else { mixer_->AddProviderToGroup(group_id, provider.get()); + provider->set_controller(this); + provider->set_result_changed_callback( + base::BindRepeating(&SearchController::OnResultsChangedWithType, + base::Unretained(this), provider->ResultType())); + } + providers_.emplace_back(std::move(provider)); +} + +void SearchController::SetResults( + const ash::AppListSearchResultType provider_type, + Results results) { + DCHECK(ranker_); + + auto ui_thread = content::GetUIThreadTaskRunner({}); + if (!ui_thread->RunsTasksInCurrentSequence()) { + ui_thread->PostTask( + FROM_HERE, + base::BindOnce(&SearchController::SetResults, base::Unretained(this), + provider_type, std::move(results))); + return; } - provider->set_result_changed_callback( - base::BindRepeating(&SearchController::OnResultsChangedWithType, - base::Unretained(this), provider->ResultType())); - providers_.emplace_back(std::move(provider)); + results_[provider_type] = std::move(results); } void SearchController::OnResultsChangedWithType( ash::AppListSearchResultType result_type) { + if (!mixer_) + return; + OnResultsChanged(); if (results_changed_callback_) results_changed_callback_.Run(result_type); } void SearchController::OnResultsChanged() { + if (!mixer_) + return; + if (dispatching_query_) return; @@ -179,11 +210,7 @@ query_for_recommendation_ ? ash::SharedAppListConfig::instance().num_start_page_tiles() : ash::SharedAppListConfig::instance().max_search_results(); - if (ranker_) { - // TODO(crbug.com/1199206): Implement. - } else { - mixer_->MixAndPublish(num_max_results, last_query_); - } + mixer_->MixAndPublish(num_max_results, last_query_); } ChromeSearchResult* SearchController::FindSearchResult( @@ -218,17 +245,31 @@ ChromeSearchResult* SearchController::GetResultByTitleForTest( const std::string& title) { std::u16string target_title = base::ASCIIToUTF16(title); - for (const auto& provider : providers_) { - for (const auto& result : provider->results()) { - if (result->title() == target_title && - result->result_type() == - ash::AppListSearchResultType::kInstalledApp && - !result->is_recommendation()) { - return result.get(); + if (ranker_) { + for (const auto& provider_results : results_) { + for (const auto& result : provider_results.second) { + if (result->title() == target_title && + result->result_type() == + ash::AppListSearchResultType::kInstalledApp && + !result->is_recommendation()) { + return result.get(); + } } } + return nullptr; + } else { + for (const auto& provider : providers_) { + for (const auto& result : provider->results()) { + if (result->title() == target_title && + result->result_type() == + ash::AppListSearchResultType::kInstalledApp && + !result->is_recommendation()) { + return result.get(); + } + } + } + return nullptr; } - return nullptr; } int SearchController::GetLastQueryLength() const {
diff --git a/chrome/browser/ui/app_list/search/search_controller.h b/chrome/browser/ui/app_list/search/search_controller.h index f9aae4e..7c60db2 100644 --- a/chrome/browser/ui/app_list/search/search_controller.h +++ b/chrome/browser/ui/app_list/search/search_controller.h
@@ -42,12 +42,21 @@ using ResultsChangedCallback = base::RepeatingCallback<void(ash::AppListSearchResultType)>; + using ProviderType = ash::AppListSearchResultType; + using ResultType = ash::AppListSearchResultType; + + using Results = std::vector<std::unique_ptr<ChromeSearchResult>>; + using ResultsMap = base::flat_map<ProviderType, Results>; + SearchController(AppListModelUpdater* model_updater, AppListControllerDelegate* list_controller, ash::AppListNotifier* notifier, Profile* profile); virtual ~SearchController(); + SearchController(const SearchController&) = delete; + SearchController& operator=(const SearchController&) = delete; + void InitializeRankers(); void Start(const std::u16string& query); @@ -62,6 +71,10 @@ // Takes ownership of |provider| and associates it with given mixer group. void AddProvider(size_t group_id, std::unique_ptr<SearchProvider> provider); + // Update the controller with the given results. Used only if the categorical + // search feature flag is enabled. + void SetResults(ash::AppListSearchResultType provider_type, Results results); + virtual ChromeSearchResult* FindSearchResult(const std::string& result_id); ChromeSearchResult* GetResultByTitleForTest(const std::string& title); @@ -118,13 +131,15 @@ // is enabled. std::unique_ptr<RankerDelegate> ranker_; + // Storage for all search results for the current query. Only used when + // categorical search is enabled. + ResultsMap results_; + std::unique_ptr<Mixer> mixer_; std::unique_ptr<SearchMetricsObserver> metrics_observer_; using Providers = std::vector<std::unique_ptr<SearchProvider>>; Providers providers_; AppListControllerDelegate* list_controller_; - - DISALLOW_COPY_AND_ASSIGN(SearchController); }; } // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_provider.cc b/chrome/browser/ui/app_list/search/search_provider.cc index c1ac34ee..4c219e5 100644 --- a/chrome/browser/ui/app_list/search/search_provider.cc +++ b/chrome/browser/ui/app_list/search/search_provider.cc
@@ -6,7 +6,9 @@ #include <utility> +#include "ash/public/cpp/app_list/app_list_features.h" #include "chrome/browser/ui/app_list/search/chrome_search_result.h" +#include "chrome/browser/ui/app_list/search/search_controller.h" namespace app_list { @@ -18,18 +20,33 @@ FireResultChanged(); } +// TODO(crbug.com/1199206): As part of the change to category-based search, +// the method of updating the search controller is being changed. Once +// categorical search is enabled, we should clean up the SearchProvider +// interface. + void SearchProvider::SwapResults(Results* new_results) { - results_.swap(*new_results); - FireResultChanged(); + if (app_list_features::IsCategoricalSearchEnabled()) { + Results results; + results.swap(*new_results); + search_controller_->SetResults(ResultType(), std::move(results)); + } else { + results_.swap(*new_results); + FireResultChanged(); + } } void SearchProvider::ClearResults() { - results_.clear(); - FireResultChanged(); + if (!app_list_features::IsCategoricalSearchEnabled()) { + results_.clear(); + FireResultChanged(); + } } void SearchProvider::ClearResultsSilently() { - results_.clear(); + if (!app_list_features::IsCategoricalSearchEnabled()) { + results_.clear(); + } } void SearchProvider::FireResultChanged() {
diff --git a/chrome/browser/ui/app_list/search/search_provider.h b/chrome/browser/ui/app_list/search/search_provider.h index d14ed0b1..a7a5bb2 100644 --- a/chrome/browser/ui/app_list/search/search_provider.h +++ b/chrome/browser/ui/app_list/search/search_provider.h
@@ -18,6 +18,7 @@ namespace app_list { enum class RankingItemType; +class SearchController; class SearchProvider { public: @@ -42,6 +43,10 @@ // Returns the main result type created by this provider. virtual ash::AppListSearchResultType ResultType() = 0; + void set_controller(SearchController* controller) { + search_controller_ = controller; + } + void set_result_changed_callback(ResultChangedCallback callback) { result_changed_callback_ = std::move(callback); } @@ -67,6 +72,7 @@ void FireResultChanged(); ResultChangedCallback result_changed_callback_; + SearchController* search_controller_; Results results_; DISALLOW_COPY_AND_ASSIGN(SearchProvider);
diff --git a/chrome/browser/ui/app_list/search/search_tags_util.cc b/chrome/browser/ui/app_list/search/search_tags_util.cc new file mode 100644 index 0000000..761619e1 --- /dev/null +++ b/chrome/browser/ui/app_list/search/search_tags_util.cc
@@ -0,0 +1,68 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/app_list/search/search_tags_util.h" + +#include "ash/public/cpp/app_list/app_list_types.h" +#include "components/omnibox/browser/autocomplete_match_classification.h" + +namespace app_list { +namespace { + +int ACMatchStyleToTagStyle(int styles) { + int tag_styles = 0; + if (styles & ACMatchClassification::URL) + tag_styles |= ash::SearchResultTag::URL; + if (styles & ACMatchClassification::MATCH) + tag_styles |= ash::SearchResultTag::MATCH; + if (styles & ACMatchClassification::DIM) + tag_styles |= ash::SearchResultTag::DIM; + + return tag_styles; +} + +} // namespace + +void ACMatchClassificationsToTags(const std::u16string& text, + const ACMatchClassifications& text_classes, + ChromeSearchResult::Tags* tags) { + int tag_styles = ash::SearchResultTag::NONE; + size_t tag_start = 0; + + for (size_t i = 0; i < text_classes.size(); ++i) { + const ACMatchClassification& text_class = text_classes[i]; + + // Closes current tag. + if (tag_styles != ash::SearchResultTag::NONE) { + tags->push_back( + ash::SearchResultTag(tag_styles, tag_start, text_class.offset)); + tag_styles = ash::SearchResultTag::NONE; + } + + if (text_class.style == ACMatchClassification::NONE) + continue; + + tag_start = text_class.offset; + tag_styles = ACMatchStyleToTagStyle(text_class.style); + } + + if (tag_styles != ash::SearchResultTag::NONE) { + tags->push_back(ash::SearchResultTag(tag_styles, tag_start, text.length())); + } +} + +ChromeSearchResult::Tags CalculateTags(const std::u16string& query, + const std::u16string& text) { + const auto matches = FindTermMatches(query, text); + const auto classes = + ClassifyTermMatches(matches, text.length(), + /*match_style=*/ACMatchClassification::MATCH, + /*non_match_style=*/ACMatchClassification::NONE); + + ChromeSearchResult::Tags tags; + ACMatchClassificationsToTags(text, classes, &tags); + return tags; +} + +} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_tags_util.h b/chrome/browser/ui/app_list/search/search_tags_util.h new file mode 100644 index 0000000..aa5b571 --- /dev/null +++ b/chrome/browser/ui/app_list/search/search_tags_util.h
@@ -0,0 +1,25 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_TAGS_UTIL_H_ +#define CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_TAGS_UTIL_H_ + +#include "chrome/browser/ui/app_list/search/chrome_search_result.h" +#include "components/omnibox/browser/autocomplete_match.h" + +namespace app_list { + +// Translates ACMatchClassifications into ChromeSearchResult tags. +void ACMatchClassificationsToTags(const std::u16string& text, + const ACMatchClassifications& text_classes, + ChromeSearchResult::Tags* tags); + +// Calculates ChromeSearchResult tags for highlighting occurrences of |query| in +// |text|. +ChromeSearchResult::Tags CalculateTags(const std::u16string& query, + const std::u16string& text); + +} // namespace app_list + +#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_TAGS_UTIL_H_
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc index 1c0f57789..3fa2987 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc
@@ -6,6 +6,8 @@ #include <vector> +#include "ash/public/cpp/ash_features.h" +#include "chrome/browser/chromeos/file_manager/path_util.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_context.h" @@ -35,6 +37,17 @@ } void HoldingSpaceDownloadsDelegate::Init() { + // ARC downloads. + if (features::IsTemporaryHoldingSpaceArcIntegrationEnabled()) { + // NOTE: The `arc_intent_helper_bridge` may be `nullptr` if the `profile()` + // is not allowed to use ARC, e.g. if the `profile()` is OTR. + auto* const arc_intent_helper_bridge = + arc::ArcIntentHelperBridge::GetForBrowserContext(profile()); + if (arc_intent_helper_bridge) + arc_intent_helper_observation_.Observe(arc_intent_helper_bridge); + } + + // Chrome downloads. download_manager_observation_.Observe( download_manager_for_testing ? download_manager_for_testing @@ -51,6 +64,33 @@ OnManagerInitialized(); } +void HoldingSpaceDownloadsDelegate::OnArcDownloadAdded( + const base::FilePath& relative_path, + const std::string& owner_package_name) { + DCHECK(features::IsTemporaryHoldingSpaceArcIntegrationEnabled()); + if (is_restoring_persistence()) + return; + + // It is expected that `owner_package_name` be non-empty. Media files from + // Chrome are synced to ARC via media scan and have `NULL` owning packages but + // are expected *not* to have generated `OnArcDownloadAdded()` events. + if (owner_package_name.empty()) { + NOTREACHED(); + return; + } + + // It is expected that `relative_path` always be contained within `Download/` + // which refers to the public downloads folder for the current `profile()`. + base::FilePath path( + file_manager::util::GetDownloadsFolderForProfile(profile())); + if (!base::FilePath("Download/").AppendRelativePath(relative_path, &path)) { + NOTREACHED(); + return; + } + + OnDownloadCompleted(HoldingSpaceItem::Type::kArcDownload, path); +} + void HoldingSpaceDownloadsDelegate::OnManagerInitialized() { if (is_restoring_persistence()) return; @@ -97,7 +137,8 @@ download::DownloadItem* item) { switch (item->GetState()) { case download::DownloadItem::COMPLETE: - OnDownloadCompleted(item->GetFullPath()); + OnDownloadCompleted(HoldingSpaceItem::Type::kDownload, + item->GetFullPath()); FALLTHROUGH; case download::DownloadItem::CANCELLED: case download::DownloadItem::INTERRUPTED: @@ -110,9 +151,11 @@ } void HoldingSpaceDownloadsDelegate::OnDownloadCompleted( + HoldingSpaceItem::Type type, const base::FilePath& file_path) { + DCHECK(HoldingSpaceItem::IsDownload(type)); if (!is_restoring_persistence()) - item_downloaded_callback_.Run(file_path); + item_downloaded_callback_.Run(type, file_path); } void HoldingSpaceDownloadsDelegate::RemoveObservers() {
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h b/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h index 279b61e3..3c30d28a 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.h
@@ -9,6 +9,8 @@ #include "base/scoped_multi_source_observation.h" #include "base/scoped_observation.h" #include "chrome/browser/ui/ash/holding_space/holding_space_keyed_service_delegate.h" +#include "components/arc/intent_helper/arc_intent_helper_bridge.h" +#include "components/arc/intent_helper/arc_intent_helper_observer.h" #include "components/download/public/common/download_item.h" #include "content/public/browser/download_manager.h" @@ -21,13 +23,16 @@ // A delegate of `HoldingSpaceKeyedService` tasked with monitoring the status of // of downloads and notifying a callback on download completion. class HoldingSpaceDownloadsDelegate : public HoldingSpaceKeyedServiceDelegate, + public arc::ArcIntentHelperObserver, public content::DownloadManager::Observer, public download::DownloadItem::Observer { public: - // Callback to be invoked when a download is completed. Note that this - // callback will only be invoked after holding space persistence is restored. + // Callback to be invoked when a download is completed. Note that the + // specified type must be a download type. Also note that this callback will + // only be invoked after holding space persistence is restored. using ItemDownloadedCallback = - base::RepeatingCallback<void(const base::FilePath&)>; + base::RepeatingCallback<void(HoldingSpaceItem::Type, + const base::FilePath&)>; HoldingSpaceDownloadsDelegate( Profile* profile, @@ -48,6 +53,10 @@ void Init() override; void OnPersistenceRestored() override; + // arc::ArcIntentHelperObserver: + void OnArcDownloadAdded(const base::FilePath& relative_path, + const std::string& owner_package_name) override; + // content::DownloadManager::Observer: void OnManagerInitialized() override; void ManagerGoingDown(content::DownloadManager* manager) override; @@ -57,8 +66,11 @@ // download::DownloadItem::Observer: void OnDownloadUpdated(download::DownloadItem* item) override; - // Invoked when the specified `file_path` has completed downloading. - void OnDownloadCompleted(const base::FilePath& file_path); + // Invoked when a download of the specified `type` at the specified + // `file_path` has completed downloading. Note that the specified `type` must + // be a download type. + void OnDownloadCompleted(HoldingSpaceItem::Type type, + const base::FilePath& file_path); // Removes all observers. void RemoveObservers(); @@ -66,6 +78,10 @@ // Callback to invoke when a download is completed. ItemDownloadedCallback item_downloaded_callback_; + base::ScopedObservation<arc::ArcIntentHelperBridge, + arc::ArcIntentHelperObserver> + arc_intent_helper_observation_{this}; + base::ScopedObservation<content::DownloadManager, content::DownloadManager::Observer> download_manager_observation_{this};
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc index 61050674..e6a0ff6 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.cc
@@ -232,7 +232,9 @@ } void HoldingSpaceKeyedService::AddDownload( + HoldingSpaceItem::Type type, const base::FilePath& download_file) { + DCHECK(HoldingSpaceItem::IsDownload(type)); const bool already_exists = holding_space_model_.ContainsItem( HoldingSpaceItem::Type::kDownload, download_file); if (already_exists) @@ -244,7 +246,7 @@ return; AddItem(HoldingSpaceItem::CreateFileBackedItem( - HoldingSpaceItem::Type::kDownload, download_file, file_system_url, + type, download_file, file_system_url, base::BindOnce(&holding_space_util::ResolveImage, &thumbnail_loader_))); }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h index 8f0088208..028ca98 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h
@@ -76,8 +76,10 @@ // manager app (otherwise, the item will be dropped silently). void AddScreenshot(const base::FilePath& screenshot_path); - // Adds a download item backed by the provided absolute file path. - void AddDownload(const base::FilePath& download_path); + // Adds a download item of the specified `type` backed by the provided + // absolute file path. Note that `type` must refer to a download type. + void AddDownload(HoldingSpaceItem::Type type, + const base::FilePath& download_path); // Adds a nearby share item backed by the provided absolute file path. void AddNearbyShare(const base::FilePath& nearby_share_path);
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_factory.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_factory.cc index 647fd99..49e0240 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_factory.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_factory.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/chromeos/fileapi/file_change_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/ash/holding_space/holding_space_keyed_service.h" +#include "components/arc/intent_helper/arc_intent_helper_bridge.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/user_manager/user.h" #include "components/user_manager/user_type.h" @@ -28,6 +29,8 @@ : BrowserContextKeyedServiceFactory( "HoldingSpaceService", BrowserContextDependencyManager::GetInstance()) { + if (features::IsTemporaryHoldingSpaceArcIntegrationEnabled()) + DependsOn(arc::ArcIntentHelperBridge::GetFactory()); DependsOn(chromeos::FileChangeServiceFactory::GetInstance()); DependsOn(drive::DriveIntegrationServiceFactory::GetInstance()); DependsOn(file_manager::VolumeManagerFactory::GetInstance());
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc index 336e853..04fd9b8 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -40,6 +40,8 @@ #include "chrome/test/base/testing_profile_manager.h" #include "chromeos/disks/disk_mount_manager.h" #include "components/account_id/account_id.h" +#include "components/arc/arc_service_manager.h" +#include "components/arc/intent_helper/arc_intent_helper_bridge.h" #include "components/download/public/common/mock_download_item.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/sync_preferences/pref_service_mock_factory.h" @@ -79,6 +81,14 @@ return types; } +std::unique_ptr<KeyedService> BuildArcIntentHelperBridge( + content::BrowserContext* context) { + EXPECT_TRUE(arc::ArcServiceManager::Get()); + EXPECT_TRUE(arc::ArcServiceManager::Get()->arc_bridge_service()); + return std::make_unique<arc::ArcIntentHelperBridge>( + context, arc::ArcServiceManager::Get()->arc_bridge_service()); +} + std::unique_ptr<KeyedService> BuildVolumeManager( content::BrowserContext* context) { return std::make_unique<file_manager::VolumeManager>( @@ -274,9 +284,7 @@ public: HoldingSpaceKeyedServiceTest() : fake_user_manager_(new FakeChromeUserManager), - user_manager_enabler_(base::WrapUnique(fake_user_manager_)), - download_manager_( - std::make_unique<testing::NiceMock<MockDownloadManager>>()) { + user_manager_enabler_(base::WrapUnique(fake_user_manager_)) { scoped_feature_list_.InitAndEnableFeature(features::kTemporaryHoldingSpace); HoldingSpaceImage::SetUseZeroInvalidationDelayForTesting(true); } @@ -302,6 +310,8 @@ return profile_manager()->CreateTestingProfile( kPrimaryProfileName, /*testing_factories=*/{ + {arc::ArcIntentHelperBridge::GetFactory(), + base::BindRepeating(&BuildArcIntentHelperBridge)}, {file_manager::VolumeManagerFactory::GetInstance(), base::BindRepeating(&BuildVolumeManager)}}); } @@ -316,7 +326,9 @@ kSecondaryProfileName, std::move(prefs), u"Test profile", 1 /*avatar_id*/, std::string() /*supervised_user_id*/, /*testing_factories=*/ - {{file_manager::VolumeManagerFactory::GetInstance(), + {{arc::ArcIntentHelperBridge::GetFactory(), + base::BindRepeating(&BuildArcIntentHelperBridge)}, + {file_manager::VolumeManagerFactory::GetInstance(), base::BindRepeating(&BuildVolumeManager)}}); } @@ -414,7 +426,7 @@ return item; } - MockDownloadManager* download_manager() { return download_manager_.get(); } + MockDownloadManager* download_manager() { return &download_manager_; } private: // BrowserWithTestWindowTest: @@ -447,7 +459,8 @@ FakeChromeUserManager* fake_user_manager_; user_manager::ScopedUserManager user_manager_enabler_; - std::unique_ptr<MockDownloadManager> download_manager_; + testing::NiceMock<MockDownloadManager> download_manager_; + arc::ArcServiceManager arc_service_manager_; base::test::ScopedFeatureList scoped_feature_list_; }; @@ -547,7 +560,9 @@ guest_profile_builder.SetGuestSession(); guest_profile_builder.SetProfileName("guest_profile"); guest_profile_builder.AddTestingFactories( - {{file_manager::VolumeManagerFactory::GetInstance(), + {{arc::ArcIntentHelperBridge::GetFactory(), + base::BindRepeating(&BuildArcIntentHelperBridge)}, + {file_manager::VolumeManagerFactory::GetInstance(), base::BindRepeating(&BuildVolumeManager)}}); std::unique_ptr<TestingProfile> guest_profile = guest_profile_builder.Build(); @@ -1468,10 +1483,12 @@ holding_space_service->AddScreenshot(file_path_1); const base::FilePath file_path_2 = test_mount_2->CreateArbitraryFile(); - holding_space_service->AddDownload(file_path_2); + holding_space_service->AddDownload(HoldingSpaceItem::Type::kDownload, + file_path_2); const base::FilePath file_path_3 = test_mount_1->CreateArbitraryFile(); - holding_space_service->AddDownload(file_path_3); + holding_space_service->AddDownload(HoldingSpaceItem::Type::kDownload, + file_path_3); EXPECT_EQ(3u, GetProfile() ->GetPrefs() @@ -1656,17 +1673,61 @@ downloads_mount->name())); } +class HoldingSpaceKeyedServiceArcIntegrationTest + : public HoldingSpaceKeyedServiceTest { + public: + HoldingSpaceKeyedServiceArcIntegrationTest() { + scoped_feature_list_.InitAndEnableFeature( + features::kTemporaryHoldingSpaceArcIntegration); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(HoldingSpaceKeyedServiceArcIntegrationTest, AddArcDownloadItem) { + // Wait for the holding space model to attach. + TestingProfile* profile = GetProfile(); + HoldingSpaceModelAttachedWaiter(profile).Wait(); + + // Verify the holding space `model` is empty. + HoldingSpaceModel* const model = HoldingSpaceController::Get()->model(); + ASSERT_EQ(0u, model->items().size()); + + // Create a test downloads mount point. + std::unique_ptr<ScopedTestMountPoint> downloads_mount = + ScopedTestMountPoint::CreateAndMountDownloads(profile); + ASSERT_TRUE(downloads_mount->IsValid()); + + // Create a fake download file on the local file system. + const base::FilePath file_path = downloads_mount->CreateFile( + /*relative_path=*/base::FilePath("Download.png"), /*content=*/"foo"); + + // Simulate an event from ARC to indicate that the Android application with + // package `com.bar.foo` added a download at `file_path`. + auto* arc_intent_helper_bridge = + arc::ArcIntentHelperBridge::GetForBrowserContext(profile); + ASSERT_TRUE(arc_intent_helper_bridge); + arc_intent_helper_bridge->OnDownloadAdded( + /*relative_path=*/"Download/Download.png", + /*owner_package_name=*/"com.bar.foo"); + + // Verify that an item of type `kArcDownload` was added to holding space. + ASSERT_EQ(1u, model->items().size()); + const HoldingSpaceItem* arc_download_item = model->items()[0].get(); + EXPECT_EQ(arc_download_item->type(), HoldingSpaceItem::Type::kArcDownload); + EXPECT_EQ(arc_download_item->file_path(), + file_manager::util::GetDownloadsFolderForProfile(profile).Append( + base::FilePath("Download.png"))); +} + class HoldingSpaceKeyedServiceNearbySharingTest : public HoldingSpaceKeyedServiceTest { public: HoldingSpaceKeyedServiceNearbySharingTest() { - scoped_feature_list_.InitWithFeatures( - {::features::kNearbySharing, ash::features::kTemporaryHoldingSpace}, - {}); + scoped_feature_list_.InitAndEnableFeature(::features::kNearbySharing); } - ~HoldingSpaceKeyedServiceNearbySharingTest() override = default; - private: base::test::ScopedFeatureList scoped_feature_list_; };
diff --git a/chrome/browser/ui/ash/network/network_state_notifier.cc b/chrome/browser/ui/ash/network/network_state_notifier.cc index 537823a..9e934e3 100644 --- a/chrome/browser/ui/ash/network/network_state_notifier.cc +++ b/chrome/browser/ui/ash/network/network_state_notifier.cc
@@ -16,10 +16,12 @@ #include "chrome/browser/notifications/system_notification_helper.h" #include "chrome/browser/ui/ash/system_tray_client.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/network/cellular_esim_profile_handler.h" #include "chromeos/network/network_configuration_handler.h" #include "chromeos/network/network_connect.h" #include "chromeos/network/network_connection_handler.h" #include "chromeos/network/network_event_log.h" +#include "chromeos/network/network_name_util.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/shill_property_util.h" @@ -504,11 +506,21 @@ NET_LOG(ERROR) << "Notify: " << log_id << ": Connect error: " + base::UTF16ToUTF8(error); + CellularESimProfileHandler* cellular_esim_profile_handler = + NetworkHandler::Get()->cellular_esim_profile_handler(); std::string network_name; - if (shill_properties) { + if (network) { + base::Optional<std::string> esim_name = + network_name_util::GetESimProfileName(cellular_esim_profile_handler, + network); + if (esim_name) + network_name = *esim_name; + } + if (network_name.empty() && shill_properties) { network_name = shill_property_util::GetNameFromProperties( service_path, shill_properties.value()); } + std::string network_error_details = GetStringFromDictionary(shill_properties, shill::kErrorDetailsProperty);
diff --git a/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc b/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc index 4d6189b..5a99200e 100644 --- a/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc +++ b/chrome/browser/ui/ash/network/network_state_notifier_unittest.cc
@@ -7,20 +7,27 @@ #include <memory> #include "ash/public/cpp/test/test_system_tray_client.h" +#include "ash/strings/grit/ash_strings.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/browser/notifications/system_notification_helper.h" +#include "chrome/grit/generated_resources.h" #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_browser_process.h" +#include "chromeos/dbus/hermes/hermes_clients.h" #include "chromeos/dbus/shill/shill_clients.h" #include "chromeos/dbus/shill/shill_device_client.h" #include "chromeos/dbus/shill/shill_service_client.h" #include "chromeos/network/network_connect.h" #include "chromeos/network/network_handler.h" +#include "chromeos/network/network_state_handler.h" +#include "chromeos/network/network_state_test_helper.h" +#include "chromeos/network/test_cellular_esim_profile_handler.h" #include "testing/platform_test.h" #include "third_party/cros_system_api/dbus/service_constants.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/message_center/public/cpp/notification.h" namespace chromeos { @@ -28,6 +35,8 @@ const char kWiFi1Guid[] = "wifi1_guid"; const char kCellular1Guid[] = "cellular1_guid"; +const char kCellular1NetworkName[] = "cellular1"; +const char kTestEsimProfileName[] = "test_profile_name"; class NetworkConnectTestDelegate : public NetworkConnect::Delegate { public: @@ -67,6 +76,7 @@ void SetUp() override { BrowserWithTestWindowTest::SetUp(); shill_clients::InitializeFakes(); + hermes_clients::InitializeFakes(); SetupDefaultShillState(); NetworkHandler::Initialize(); base::RunLoop().RunUntilIdle(); @@ -89,6 +99,33 @@ } protected: + void SetupESimNetwork() { + const char kCellularEsimServicePath[] = "/service/cellular_esim1"; + const char kTestEuiccPath[] = "euicc_path"; + const char kTestEidName[] = "eid"; + const char kTestIccid[] = "iccid"; + + ShillServiceClient::TestInterface* service_test = + ShillServiceClient::Get()->GetTestInterface(); + service_test->ClearServices(); + + hermes_manager_test_ = HermesManagerClient::Get()->GetTestInterface(); + hermes_euicc_test_ = HermesEuiccClient::Get()->GetTestInterface(); + + hermes_manager_test_->AddEuicc(dbus::ObjectPath(kTestEuiccPath), + kTestEidName, /*is_active=*/true, + /*physical_slot=*/0); + + hermes_euicc_test_->AddCarrierProfile( + dbus::ObjectPath(kCellularEsimServicePath), + dbus::ObjectPath(kTestEuiccPath), kTestIccid, kTestEsimProfileName, + "service_provider", "activation_code", kCellularEsimServicePath, + hermes::profile::State::kActive, + hermes::profile::ProfileClass::kOperational, + HermesEuiccClient::TestInterface::AddCarrierProfileBehavior:: + kAddProfileWithService); + base::RunLoop().RunUntilIdle(); + } void SetupDefaultShillState() { ShillDeviceClient::TestInterface* device_test = ShillDeviceClient::Get()->GetTestInterface(); @@ -118,8 +155,9 @@ const char kCellular1Iccid[] = "iccid"; device_test->AddDevice(kCellularDevicePath, shill::kTypeCellular, "stub_cellular_device1"); - service_test->AddService(kCellular1ServicePath, kCellular1Guid, "cellular1", - shill::kTypeCellular, shill::kStateIdle, true); + service_test->AddService(kCellular1ServicePath, kCellular1Guid, + kCellular1NetworkName, shill::kTypeCellular, + shill::kStateIdle, true); service_test->SetServiceProperty(kCellular1ServicePath, shill::kIccidProperty, base::Value(kCellular1Iccid)); @@ -145,6 +183,9 @@ base::RunLoop().RunUntilIdle(); } + std::unique_ptr<NetworkStateHandler> network_state_handler_; + HermesManagerClient::TestInterface* hermes_manager_test_; + HermesEuiccClient::TestInterface* hermes_euicc_test_; ash::TestSystemTrayClient test_system_tray_client_; std::unique_ptr<NetworkConnectTestDelegate> network_connect_delegate_; @@ -176,10 +217,39 @@ NetworkStateNotifier::kNetworkConnectNotificationId); EXPECT_TRUE(notification); + EXPECT_EQ( + notification->message(), + l10n_util::GetStringFUTF16( + IDS_NETWORK_CONNECTION_ERROR_MESSAGE, + base::UTF8ToUTF16(kCellular1NetworkName), + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SIM_CARD_LOCKED))); + // Clicking the notification should open SIM unlock settings. notification->delegate()->Click(/*button_index=*/base::nullopt, /*reply=*/base::nullopt); EXPECT_EQ(1, test_system_tray_client_.show_sim_unlock_settings_count()); } +TEST_F(NetworkStateNotifierTest, CellularEsimConnectionFailure) { + SetupESimNetwork(); + TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper( + std::make_unique<SystemNotificationHelper>()); + NotificationDisplayServiceTester tester(nullptr /* profile */); + NetworkConnect::Get()->ConnectToNetworkId("esim_guidiccid"); + base::RunLoop().RunUntilIdle(); + + // Failure should spawn a notification. + base::Optional<message_center::Notification> notification = + tester.GetNotification( + NetworkStateNotifier::kNetworkConnectNotificationId); + EXPECT_TRUE(notification); + + EXPECT_EQ( + notification->message(), + l10n_util::GetStringFUTF16( + IDS_NETWORK_CONNECTION_ERROR_MESSAGE, + base::UTF8ToUTF16(kTestEsimProfileName), + l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SIM_CARD_LOCKED))); +} + } // namespace chromeos
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc index d805b7ee..5683d9c 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -634,7 +634,8 @@ void ManagePasswordsUIController::OnLeakDialogHidden() { dialog_controller_.reset(); - if (GetState() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { + if (GetState() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || + GetState() == password_manager::ui::PENDING_PASSWORD_STATE) { bubble_status_ = BubbleStatus::SHOULD_POP_UP; UpdateBubbleAndIconVisibility(); }
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc index 82c2d8d2..0125cbf 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
@@ -1358,6 +1358,37 @@ #endif } +TEST_F(ManagePasswordsUIControllerTest, SaveBubbleAfterLeakCheck) { + std::vector<const PasswordForm*> matches; + auto test_form_manager = CreateFormManagerWithBestMatches(&matches); + EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility()); + controller()->OnPasswordSubmitted(std::move(test_form_manager)); + EXPECT_TRUE(controller()->opened_automatic_bubble()); + + // Leak detection dialog hides the bubble. + PasswordLeakDialogMock dialog_prompt; + CredentialLeakDialogController* dialog_controller = nullptr; + EXPECT_CALL(*controller(), CreateCredentialLeakPrompt) + .WillOnce(DoAll(SaveArg<0>(&dialog_controller), Return(&dialog_prompt))); + EXPECT_CALL(dialog_prompt, ShowCredentialLeakPrompt); + controller()->OnCredentialLeak( + password_manager::CreateLeakType(password_manager::IsSaved(false), + password_manager::IsReused(false), + password_manager::IsSyncing(false)), + GURL(kExampleUrl)); + // The bubble is gone. + EXPECT_FALSE(controller()->opened_bubble()); + + // Close the dialog. + EXPECT_CALL(dialog_prompt, ControllerGone); + EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility()); + dialog_controller->OnAcceptDialog(); + + // The save bubble is back. + EXPECT_TRUE(controller()->opened_automatic_bubble()); + ExpectIconAndControllerStateIs(password_manager::ui::PENDING_PASSWORD_STATE); +} + TEST_F(ManagePasswordsUIControllerTest, UpdateBubbleAfterLeakCheck) { std::vector<const PasswordForm*> matches = {&test_local_form()}; auto test_form_manager = CreateFormManagerWithBestMatches(&matches);
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 0672cfda..d166480f 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -65,7 +65,7 @@ #include "chrome/browser/ssl/chrome_security_blocking_page_factory.h" #include "chrome/browser/ssl/connection_help_tab_helper.h" #include "chrome/browser/ssl/security_state_tab_helper.h" -#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" +#include "chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.h" #include "chrome/browser/subresource_redirect/subresource_redirect_observer.h" #include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" #include "chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h" @@ -252,8 +252,7 @@ ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient( web_contents, autofill::ChromeAutofillClient::FromWebContents(web_contents)); - ChromeSubresourceFilterClient::CreateThrottleManagerWithClientForWebContents( - web_contents); + CreateSubresourceFilterThrottleManagerForWebContents(web_contents); ChromeTranslateClient::CreateForWebContents(web_contents); ConnectionHelpTabHelper::CreateForWebContents(web_contents); CoreTabHelper::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/user_education/scoped_new_badge_tracker.cc b/chrome/browser/ui/user_education/scoped_new_badge_tracker.cc index 5cdca33..41b92e90 100644 --- a/chrome/browser/ui/user_education/scoped_new_badge_tracker.cc +++ b/chrome/browser/ui/user_education/scoped_new_badge_tracker.cc
@@ -4,8 +4,8 @@ #include "chrome/browser/ui/user_education/scoped_new_badge_tracker.h" +#include "base/containers/contains.h" #include "base/feature_list.h" -#include "base/stl_util.h" #include "chrome/browser/feature_engagement/tracker_factory.h" #include "components/feature_engagement/public/tracker.h"
diff --git a/chrome/browser/ui/views/crostini/crostini_update_filesystem_view_browsertest.cc b/chrome/browser/ui/views/crostini/crostini_update_filesystem_view_browsertest.cc index 8d7d2319..85a96b1 100644 --- a/chrome/browser/ui/views/crostini/crostini_update_filesystem_view_browsertest.cc +++ b/chrome/browser/ui/views/crostini/crostini_update_filesystem_view_browsertest.cc
@@ -14,8 +14,8 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/views/crostini/crostini_dialogue_browser_test_util.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "components/crx_file/id_util.h" #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc index df63483..e58f902 100644 --- a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc +++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
@@ -17,7 +17,7 @@ #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ssl/security_state_tab_helper.h" -#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" +#include "chrome/browser/subresource_filter/chrome_content_subresource_filter_throttle_manager_factory.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "chrome/browser/ui/blocked_content/framebust_block_tab_helper.h" @@ -164,8 +164,7 @@ SearchTabHelper::CreateForWebContents(web_contents); TabDialogs::CreateForWebContents(web_contents); FramebustBlockTabHelper::CreateForWebContents(web_contents); - ChromeSubresourceFilterClient::CreateThrottleManagerWithClientForWebContents( - web_contents); + CreateSubresourceFilterThrottleManagerForWebContents(web_contents); InfoBarService::CreateForWebContents(web_contents); MixedContentSettingsTabHelper::CreateForWebContents(web_contents); blocked_content::PopupBlockerTabHelper::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/views/theme_copying_widget.cc b/chrome/browser/ui/views/theme_copying_widget.cc index b5a8044..4984622c 100644 --- a/chrome/browser/ui/views/theme_copying_widget.cc +++ b/chrome/browser/ui/views/theme_copying_widget.cc
@@ -5,14 +5,27 @@ #include "chrome/browser/ui/views/theme_copying_widget.h" ThemeCopyingWidget::ThemeCopyingWidget(views::Widget* role_model) - : role_model_(role_model) {} + : role_model_(role_model) { + observed_widget_.Observe(role_model); +} -ThemeCopyingWidget::~ThemeCopyingWidget() {} +ThemeCopyingWidget::~ThemeCopyingWidget() = default; const ui::NativeTheme* ThemeCopyingWidget::GetNativeTheme() const { - return role_model_->GetNativeTheme(); + return observed_widget_.IsObserving() ? role_model_->GetNativeTheme() + : nullptr; } const ui::ThemeProvider* ThemeCopyingWidget::GetThemeProvider() const { - return role_model_->GetThemeProvider(); + return observed_widget_.IsObserving() ? role_model_->GetThemeProvider() + : nullptr; +} + +void ThemeCopyingWidget::OnWidgetDestroying(Widget* widget) { + observed_widget_.Reset(); + role_model_ = nullptr; +} + +void ThemeCopyingWidget::OnWidgetThemeChanged(Widget* widget) { + ThemeChanged(); }
diff --git a/chrome/browser/ui/views/theme_copying_widget.h b/chrome/browser/ui/views/theme_copying_widget.h index 2e9aebf3..b694963 100644 --- a/chrome/browser/ui/views/theme_copying_widget.h +++ b/chrome/browser/ui/views/theme_copying_widget.h
@@ -5,24 +5,33 @@ #ifndef CHROME_BROWSER_UI_VIEWS_THEME_COPYING_WIDGET_H_ #define CHROME_BROWSER_UI_VIEWS_THEME_COPYING_WIDGET_H_ +#include "base/scoped_observation.h" #include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_observer.h" // This widget uses a reference widget to provide its NativeTheme and -// ThemeProvider. The reference widget is assumed to outlive |this|. -class ThemeCopyingWidget : public views::Widget { +// ThemeProvider. +class ThemeCopyingWidget : public views::Widget, public views::WidgetObserver { public: explicit ThemeCopyingWidget(views::Widget* role_model); + ThemeCopyingWidget(const ThemeCopyingWidget&) = delete; + ThemeCopyingWidget& operator=(const ThemeCopyingWidget&) = delete; ~ThemeCopyingWidget() override; - // views::Widget + // views::Widget: const ui::NativeTheme* GetNativeTheme() const override; const ui::ThemeProvider* GetThemeProvider() const override; + // views::WidgetObserver: + void OnWidgetDestroying(Widget* widget) override; + void OnWidgetThemeChanged(Widget* widget) override; + private: // The widget we'll copy our theme from. views::Widget* role_model_; - DISALLOW_COPY_AND_ASSIGN(ThemeCopyingWidget); + base::ScopedObservation<views::Widget, views::WidgetObserver> + observed_widget_{this}; }; #endif // CHROME_BROWSER_UI_VIEWS_THEME_COPYING_WIDGET_H_
diff --git a/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc b/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc index 69f3709..9664b2a 100644 --- a/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc
@@ -513,6 +513,8 @@ IN_PROC_BROWSER_TEST_F(WebAppDeclarativeLinkCapturingOriginTrialBrowserTest, OriginTrial) { + WebAppProvider& provider = *WebAppProvider::Get(browser()->profile()); + bool serve_token = true; content::URLLoaderInterceptor interceptor(base::BindLambdaForTesting( [&serve_token]( @@ -545,8 +547,8 @@ AppId app_id = web_app::InstallWebAppFromPage(browser(), GURL(kTestWebAppUrl)); +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) // Origin trial should grant the app access. - WebAppProvider& provider = *WebAppProvider::Get(browser()->profile()); EXPECT_EQ(provider.registrar().GetAppCaptureLinks(app_id), blink::mojom::CaptureLinks::kNewClient); @@ -581,6 +583,13 @@ // origin trial. EXPECT_EQ(provider.registrar().GetAppCaptureLinks(app_id), blink::mojom::CaptureLinks::kUndefined); +#else + // The origin trial is not available outside of Chrome OS. + EXPECT_EQ(provider.registrar().GetAppCaptureLinks(app_id), + blink::mojom::CaptureLinks::kUndefined); + + ALLOW_UNUSED_LOCAL(app_web_contents); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) } } // namespace web_app
diff --git a/chrome/browser/ui/webui/about_ui_unittest.cc b/chrome/browser/ui/webui/about_ui_unittest.cc index b7dbdfb..273d555 100644 --- a/chrome/browser/ui/webui/about_ui_unittest.cc +++ b/chrome/browser/ui/webui/about_ui_unittest.cc
@@ -53,9 +53,8 @@ void OnDataReceived(scoped_refptr<base::RefCountedMemory> bytes) { data_received_ = true; - data_ = base::StringPiece(reinterpret_cast<const char*>(bytes->front()), - bytes->size()) - .as_string(); + data_ = std::string(base::StringPiece( + reinterpret_cast<const char*>(bytes->front()), bytes->size())); } private:
diff --git a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc index 35e2c97..68753a7 100644 --- a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc +++ b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
@@ -16,6 +16,7 @@ #include "base/memory/ref_counted_memory.h" #include "base/metrics/histogram_macros.h" #include "base/process/process_iterator.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" @@ -152,7 +153,7 @@ std::vector<base::StringPiece> split_value_str = base::SplitStringPiece( value_str, "\t", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); DCHECK_EQ(2U, split_value_str.size()); - *out_name = split_value_str[1].as_string(); + *out_name = std::string(split_value_str[1]); return true; }
diff --git a/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc b/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc index 94f1bca..9c7d3b4f 100644 --- a/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc +++ b/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc
@@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/memory/ref_counted_memory.h" #include "base/strings/strcat.h" +#include "base/strings/string_piece.h" #include "build/build_config.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" @@ -98,9 +99,8 @@ void OnDataReceived(scoped_refptr<base::RefCountedMemory> bytes) { data_received_ = true; if (bytes.get()) { - data_ = base::StringPiece(reinterpret_cast<const char*>(bytes->front()), - bytes->size()) - .as_string(); + data_ = std::string(base::StringPiece( + reinterpret_cast<const char*>(bytes->front()), bytes->size())); } }
diff --git a/chrome/browser/ui/webui/management/management_ui.cc b/chrome/browser/ui/webui/management/management_ui.cc index 90dbd7d..a7d92741 100644 --- a/chrome/browser/ui/webui/management/management_ui.cc +++ b/chrome/browser/ui/webui/management/management_ui.cc
@@ -67,6 +67,7 @@ IDS_MANAGEMENT_REPORT_APP_INFO_AND_ACTIVITY}, {kManagementPrinting, IDS_MANAGEMENT_REPORT_PRINTING}, {kManagementReportPrintJobs, IDS_MANAGEMENT_REPORT_PRINT_JOBS}, + {kManagementReportDlpEvents, IDS_MANAGEMENT_REPORT_DLP_EVENTS}, {kManagementCrostini, IDS_MANAGEMENT_CROSTINI}, {kManagementCrostiniContainerConfiguration, IDS_MANAGEMENT_CROSTINI_CONTAINER_CONFIGURATION},
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.cc b/chrome/browser/ui/webui/management/management_ui_handler.cc index efde47f..81b12b40 100644 --- a/chrome/browser/ui/webui/management/management_ui_handler.cc +++ b/chrome/browser/ui/webui/management/management_ui_handler.cc
@@ -50,6 +50,8 @@ #include "chrome/browser/chromeos/crostini/crostini_pref_names.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" +#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h" +#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h" #include "chrome/browser/chromeos/policy/minimum_version_policy_handler.h" #include "chrome/browser/chromeos/policy/policy_cert_service.h" #include "chrome/browser/chromeos/policy/policy_cert_service_factory.h" @@ -172,6 +174,7 @@ const char kManagementReportAndroidApplications[] = "managementReportAndroidApplications"; const char kManagementReportPrintJobs[] = "managementReportPrintJobs"; +const char kManagementReportDlpEvents[] = "managementReportDlpEvents"; const char kManagementPrinting[] = "managementPrinting"; const char kManagementCrostini[] = "managementCrostini"; const char kManagementCrostiniContainerConfiguration[] = @@ -219,7 +222,8 @@ kCrostini, kUsername, kExtensions, - kAndroidApplication + kAndroidApplication, + kDlpEvents }; // Corresponds to DeviceReportingType in management_browser_proxy.js @@ -251,6 +255,8 @@ return "extension"; case DeviceReportingType::kAndroidApplication: return "android application"; + case DeviceReportingType::kDlpEvents: + return "dlp events"; default: NOTREACHED() << "Unknown device reporting type"; return "device"; @@ -529,6 +535,10 @@ return connector->GetDeviceCloudPolicyManager(); } +const policy::DlpRulesManager* ManagementUIHandler::GetDlpRulesManager() const { + return policy::DlpRulesManagerFactory::GetForPrimaryProfile(); +} + void ManagementUIHandler::AddDeviceReportingInfo( base::Value* report_sources, const policy::StatusCollector* collector, @@ -585,6 +595,11 @@ DeviceReportingType::kPrint); } + if (GetDlpRulesManager() && GetDlpRulesManager()->IsReportingEnabled()) { + AddDeviceReportingElement(report_sources, kManagementReportDlpEvents, + DeviceReportingType::kDlpEvents); + } + if (crostini::CrostiniFeatures::Get()->IsAllowedNow(profile)) { if (!profile->GetPrefs() ->GetFilePath(crostini::prefs::kCrostiniAnsiblePlaybookFilePath)
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.h b/chrome/browser/ui/webui/management/management_ui_handler.h index 61c502f1..9748c22 100644 --- a/chrome/browser/ui/webui/management/management_ui_handler.h +++ b/chrome/browser/ui/webui/management/management_ui_handler.h
@@ -35,6 +35,7 @@ extern const char kManagementReportCrashReports[]; extern const char kManagementReportAppInfoAndActivity[]; extern const char kManagementReportPrintJobs[]; +extern const char kManagementReportDlpEvents[]; extern const char kManagementPrinting[]; extern const char kManagementCrostini[]; extern const char kManagementCrostiniContainerConfiguration[]; @@ -73,6 +74,7 @@ extern const char kPolicyKeyReportUserIdData[]; extern const char kPolicyKeyReportVersionData[]; extern const char kPolicyKeyReportPolicyData[]; +extern const char kPolicyKeyReportDlpEvents[]; extern const char kPolicyKeyReportExtensionsData[]; extern const char kPolicyKeyReportSystemTelemetryData[]; extern const char kPolicyKeyReportUserBrowsingData[]; @@ -93,6 +95,7 @@ namespace policy { class DeviceCloudPolicyManagerChromeOS; +class DlpRulesManager; class PolicyService; class StatusCollector; class SystemLogUploader; @@ -147,6 +150,7 @@ virtual const std::string GetDeviceManager() const; virtual const policy::DeviceCloudPolicyManagerChromeOS* GetDeviceCloudPolicyManager() const; + virtual const policy::DlpRulesManager* GetDlpRulesManager() const; void AddDeviceReportingInfo(base::Value* report_sources, const policy::StatusCollector* collector, const policy::SystemLogUploader* uploader,
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc index 7a18843..baa4487 100644 --- a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc +++ b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -50,6 +50,8 @@ #include "chrome/browser/chromeos/policy/device_cloud_policy_initializer.h" #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h" +#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h" +#include "chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h" #include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h" #include "chrome/browser/chromeos/policy/status_collector/status_collector.h" #include "chrome/browser/chromeos/policy/status_uploader.h" @@ -193,8 +195,17 @@ public: TestManagementUIHandler() = default; explicit TestManagementUIHandler(policy::PolicyService* policy_service) - : policy_service_(policy_service) {} + : policy_service_(policy_service) { +#if BUILDFLAG(IS_CHROMEOS_ASH) + dlp_rules_manager_ = new policy::MockDlpRulesManager(); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + } + +#if BUILDFLAG(IS_CHROMEOS_ASH) + ~TestManagementUIHandler() override { delete dlp_rules_manager_; } +#else ~TestManagementUIHandler() override = default; +#endif // BUILDFLAG(IS_CHROMEOS_ASH) void EnableUpdateRequiredEolInfo(bool enable) { update_required_eol_ = enable; @@ -238,6 +249,9 @@ } const std::string GetDeviceManager() const override { return device_domain; } + const policy::DlpRulesManager* GetDlpRulesManager() const override { + return dlp_rules_manager_; + } void SetDeviceDomain(const std::string& domain) { device_domain = domain; } #endif // BUILDFLAG(IS_CHROMEOS_ASH) @@ -245,11 +259,14 @@ policy::PolicyService* policy_service_ = nullptr; bool update_required_eol_ = false; std::string device_domain = "devicedomain.com"; +#if BUILDFLAG(IS_CHROMEOS_ASH) + policy::DlpRulesManager* dlp_rules_manager_ = nullptr; +#endif // BUILDFLAG(IS_CHROMEOS_ASH) }; // We need to use a different base class for ChromeOS and non ChromeOS case. -// TODO(marcgrimme): refactor so that ChromeOS and non ChromeOS part is better -// separated. +// TODO(1071436, marcgrimme): refactor so that ChromeOS and non ChromeOS part is +// better separated. #if BUILDFLAG(IS_CHROMEOS_ASH) using TestingBaseClass = chromeos::DeviceSettingsTestBase; #else @@ -344,6 +361,7 @@ bool report_hw_status; bool report_crash_info; bool report_app_info_and_activity; + bool report_dlp_events; bool upload_enabled; bool printing_send_username_and_filename; bool crostini_report_usage; @@ -365,6 +383,7 @@ setup_config_.report_hw_status = default_value; setup_config_.report_crash_info = default_value; setup_config_.report_app_info_and_activity = default_value; + setup_config_.report_dlp_events = default_value; setup_config_.upload_enabled = default_value; setup_config_.printing_send_username_and_filename = default_value; setup_config_.crostini_report_usage = default_value; @@ -448,7 +467,10 @@ /*task_runner=*/task_runner_); ON_CALL(testing::Const(handler_), GetDeviceCloudPolicyManager()) .WillByDefault(Return(manager_.get())); - + EXPECT_CALL(*static_cast<const policy::MockDlpRulesManager*>( + handler_.GetDlpRulesManager()), + IsReportingEnabled) + .WillRepeatedly(testing::Return(GetTestConfig().report_dlp_events)); return handler_.GetDeviceReportingInfo(manager_.get(), status_collector, system_uploader, GetProfile()); } @@ -584,26 +606,41 @@ const char* expected_infolist_expr, base::Value::ConstListView infolist, const std::set<std::string>& expected_messages) { - if (infolist.size() != expected_messages.size()) { - return AssertionFailure() - << " " << infolist_expr << " and " << expected_infolist_expr - << " don't have the same size. (" << infolist.size() << ", " - << expected_messages.size() << ")"; - } std::set<std::string> tmp_expected(expected_messages); - for (const base::Value& info : infolist) { - const std::string* message_id = info.FindStringKey("messageId"); - if (message_id) { - if (tmp_expected.erase(*message_id) != 1u) { - return AssertionFailure() << " message " << *message_id << " is not in " - << expected_infolist_expr; + std::vector<std::string> tmp_info_messages; + for (const base::Value& tmp_info : infolist) { + const std::string* message = tmp_info.FindStringKey("messageId"); + if (message) { + if (tmp_expected.erase(*message) != 1u) { + tmp_info_messages.push_back(*message); } } } if (!tmp_expected.empty()) { + AssertionResult result = AssertionFailure(); + result << "Expected messages from " << expected_infolist_expr + << " has more contents than " << infolist_expr << std::endl + << "Messages missing from test: "; + for (const std::string& message : tmp_expected) { + result << message << ", "; + } + return result; + } + if (!tmp_info_messages.empty()) { + AssertionResult result = AssertionFailure(); + result << "Recieved messages from " << infolist_expr + << " has more contents than " << expected_infolist_expr << std::endl + << "Additional messages not expected: "; + for (const std::string& message : tmp_info_messages) { + result << message << ", "; + } + return result; + } + if (infolist.size() != expected_messages.size()) { return AssertionFailure() << " " << infolist_expr << " and " << expected_infolist_expr - << " have different contents " << infolist.data(); + << " don't have the same size. (info: " << infolist.size() + << ", expected: " << expected_messages.size() << ")"; } return AssertionSuccess(); } @@ -614,12 +651,6 @@ const char* expected_elements_expr, base::Value::ConstListView elements, const std::map<std::string, std::string> expected_elements) { - if (elements.size() != expected_elements.size()) { - return AssertionFailure() - << elements_expr << " and " << expected_elements_expr - << " don't have the same size. (" << elements.size() << ", " - << expected_elements.size() << ")"; - } std::map<std::string, std::string> tmp_expected(expected_elements); for (const base::Value& element : elements) { const std::string* message_id = element.FindStringKey("messageId"); @@ -656,6 +687,12 @@ result << "}"; return result; } + if (elements.size() != expected_elements.size()) { + return AssertionFailure() + << elements_expr << " and " << expected_elements_expr + << " don't have the same size. (" << elements.size() << ", " + << expected_elements.size() << ")"; + } return AssertionSuccess(); } #endif @@ -995,7 +1032,8 @@ {kManagementCrostini, "crostini"}, {kManagementExtensionReportUsername, "username"}, {kManagementReportExtensions, "extension"}, - {kManagementReportAndroidApplications, "android application"}}; + {kManagementReportAndroidApplications, "android application"}, + {kManagementReportDlpEvents, "dlp events"}}; ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(), expected_elements); @@ -1004,6 +1042,7 @@ TEST_F(ManagementUIHandlerTests, AllEnabledCrostiniAnsiblePlaybookDeviceReportingInfo) { ResetTestConfig(true); + GetTestConfig().report_dlp_events = false; GetTestConfig().crostini_ansible_playbook_filepath = base::FilePath("/tmp/"); const base::Value info = SetUpForReportingInfo(); const std::map<std::string, std::string> expected_elements = { @@ -1023,6 +1062,17 @@ expected_elements); } +TEST_F(ManagementUIHandlerTests, OnlyReportDlpEvents) { + ResetTestConfig(false); + GetTestConfig().report_dlp_events = true; + base::Value info = SetUpForReportingInfo(); + const std::map<std::string, std::string> expected_elements = { + {kManagementReportDlpEvents, "dlp events"}}; + + ASSERT_PRED_FORMAT2(ReportingElementsToBeEQ, info.GetList(), + expected_elements); +} + TEST_F(ManagementUIHandlerTests, OnlyReportUsersDeviceReportingInfo) { ResetTestConfig(false); GetTestConfig().report_users = true; @@ -1137,6 +1187,7 @@ handler_.GetExtensionReportingInfo().GetList(), expected_messages); } + TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoPoliciesMerge) { policy::PolicyMap on_prem_reporting_extension_beta_policies; policy::PolicyMap on_prem_reporting_extension_stable_policies;
diff --git a/chrome/browser/ui/webui/memories/memories_handler.cc b/chrome/browser/ui/webui/memories/memories_handler.cc index f1b7c4d..20d7593 100644 --- a/chrome/browser/ui/webui/memories/memories_handler.cc +++ b/chrome/browser/ui/webui/memories/memories_handler.cc
@@ -8,7 +8,6 @@ #include <utility> #include <vector> -#include "base/feature_list.h" #include "base/strings/stringprintf.h" #include "chrome/browser/history_clusters/memories_service_factory.h" #include "chrome/browser/profiles/profile.h" @@ -109,12 +108,6 @@ } void MemoriesHandler::OnMemoriesDebugMessage(const std::string& message) { - // Ignore messages if all the debug flags are off. - if (!base::FeatureList::IsEnabled(history_clusters::kDebug) && - !history_clusters::RemoteModelEndpointForDebugging().is_valid()) { - return; - } - if (content::RenderFrameHost* rfh = web_contents_->GetMainFrame()) { rfh->AddMessageToConsole(blink::mojom::ConsoleMessageLevel::kInfo, message); }
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc index 5b6d117..665bde8 100644 --- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc
@@ -14,6 +14,7 @@ #include "base/bind.h" #include "base/json/json_string_value_serializer.h" #include "base/memory/ref_counted.h" +#include "base/strings/string_piece.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/values.h" #include "chrome/browser/chromeos/printing/test_cups_printers_manager.h" @@ -122,7 +123,7 @@ base::BindOnce(std::move(cb), effective_make_and_model.empty() ? PpdProvider::NOT_FOUND : PpdProvider::SUCCESS, - effective_make_and_model.as_string())); + std::string(effective_make_and_model))); } // These methods are not used by `CupsPrintersManager`.
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index 9652d9d4..021c2e6c 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -14,6 +14,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/json/json_reader.h" #include "base/logging.h" +#include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/simple_test_clock.h" @@ -2150,10 +2151,9 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest, HandleGetChooserExceptionListForUsb) { - const std::string kUsbChooserGroupName = + const std::string kUsbChooserGroupName( site_settings::ContentSettingsTypeToGroupName( - ContentSettingsType::USB_CHOOSER_DATA) - .as_string(); + ContentSettingsType::USB_CHOOSER_DATA)); const base::Value& exceptions = GetChooserExceptionListFromWebUiCallData( kUsbChooserGroupName, /*expected_total_calls=*/1u); @@ -2167,10 +2167,9 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest, HandleGetChooserExceptionListForUsbOffTheRecord) { - const std::string kUsbChooserGroupName = + const std::string kUsbChooserGroupName( site_settings::ContentSettingsTypeToGroupName( - ContentSettingsType::USB_CHOOSER_DATA) - .as_string(); + ContentSettingsType::USB_CHOOSER_DATA)); SetUpOffTheRecordUsbChooserContext(); web_ui()->ClearTrackedCalls(); @@ -2204,10 +2203,9 @@ TEST_F(SiteSettingsHandlerChooserExceptionTest, HandleResetChooserExceptionForSiteForUsb) { - const std::string kUsbChooserGroupName = + const std::string kUsbChooserGroupName( site_settings::ContentSettingsTypeToGroupName( - ContentSettingsType::USB_CHOOSER_DATA) - .as_string(); + ContentSettingsType::USB_CHOOSER_DATA)); const auto kAndroidOrigin = url::Origin::Create(kAndroidUrl); const auto kChromiumOrigin = url::Origin::Create(kChromiumUrl); const auto kGoogleOrigin = url::Origin::Create(kGoogleUrl);
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc index a1a95a9..ede4eff 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
@@ -7,6 +7,7 @@ #include "base/callback_helpers.h" #include "base/guid.h" #include "base/json/json_reader.h" +#include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -536,9 +537,8 @@ } // namespace TEST_F(SiteSettingsHelperTest, CreateChooserExceptionObject) { - const std::string kUsbChooserGroupName = - ContentSettingsTypeToGroupName(ContentSettingsType::USB_CHOOSER_DATA) - .as_string(); + const std::string kUsbChooserGroupName( + ContentSettingsTypeToGroupName(ContentSettingsType::USB_CHOOSER_DATA)); const std::string& kPolicySource = SiteSettingSourceToString(SiteSettingSource::kPolicy); const std::string& kPreferenceSource = @@ -729,9 +729,8 @@ TEST_F(SiteSettingsHelperChooserExceptionTest, GetChooserExceptionListFromProfile) { - const std::string kUsbChooserGroupName = - ContentSettingsTypeToGroupName(ContentSettingsType::USB_CHOOSER_DATA) - .as_string(); + const std::string kUsbChooserGroupName( + ContentSettingsTypeToGroupName(ContentSettingsType::USB_CHOOSER_DATA)); const ChooserTypeNameEntry* chooser_type = ChooserTypeFromGroupName(kUsbChooserGroupName); const std::string& kPolicySource =
diff --git a/chrome/browser/usb/usb_blocklist_unittest.cc b/chrome/browser/usb/usb_blocklist_unittest.cc index bcea7606..75ee1e6 100644 --- a/chrome/browser/usb/usb_blocklist_unittest.cc +++ b/chrome/browser/usb/usb_blocklist_unittest.cc
@@ -18,7 +18,7 @@ params_manager_.ClearAllVariationParams(); std::map<std::string, std::string> params; - params["blocklist_additions"] = list.as_string(); + params["blocklist_additions"] = std::string(list); params_manager_.SetVariationParams("WebUSBBlocklist", params); blocklist_.ResetToDefaultValuesForTest();
diff --git a/chrome/browser/web_applications/components/preinstalled_app_install_features.cc b/chrome/browser/web_applications/components/preinstalled_app_install_features.cc index c250c6c..a5c14ae 100644 --- a/chrome/browser/web_applications/components/preinstalled_app_install_features.cc +++ b/chrome/browser/web_applications/components/preinstalled_app_install_features.cc
@@ -5,7 +5,10 @@ #include "chrome/browser/web_applications/components/preinstalled_app_install_features.h" #include "base/feature_list.h" +#include "chrome/browser/policy/profile_policy_connector.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/common/channel_info.h" +#include "chrome/common/chrome_features.h" #include "components/version_info/channel.h" namespace web_app { @@ -22,6 +25,13 @@ bool g_always_enabled_for_testing = false; +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +bool IsMigrationFeature(const base::Feature& feature) { + return &feature == &kMigrateDefaultChromeAppToWebAppsGSuite || + &feature == &kMigrateDefaultChromeAppToWebAppsNonGSuite; +} +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + } // namespace // Enables migration of default installed GSuite apps over to their replacement @@ -56,21 +66,42 @@ const base::Feature kMigrateDefaultChromeAppToWebAppsChromeOsBeta{ "MigrateDefaultChromeAppToWebAppsChromeOsBeta", base::FEATURE_ENABLED_BY_DEFAULT}; + +// Enables migration of default installed web apps over to their replacement +// web apps for Chrome OS managed users. +// This flag overrides the value of the kMigrateDefaultChromeAppToWebAppsGSuite +// and kMigrateDefaultChromeAppToWebAppsNonGSuite for Chrome OS managed users. +// +// Why have a separate flag? +// Field trials are not able to accurately distinguish managed Chrome OS users. +// Because admin installed Chrome apps conflict with the default web app +// migration we need to maintain separate control over the rollout for mananged +// users. +const base::Feature kMigrateDefaultChromeAppToWebAppsChromeOsManaged{ + "MigrateDefaultChromeAppToWebAppsChromeOsManaged", + base::FEATURE_DISABLED_BY_DEFAULT}; #endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) -bool IsPreinstalledAppInstallFeatureEnabled(base::StringPiece feature_name) { +bool IsPreinstalledAppInstallFeatureEnabled(base::StringPiece feature_name, + const Profile& profile) { if (g_always_enabled_for_testing) return true; for (const base::Feature* feature : kPreinstalledAppInstallFeatures) { if (feature->name == feature_name) { #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) - // See |kMigrateDefaultChromeAppToWebAppsChromeOsBeta| comment above. - if (chrome::GetChannel() == version_info::Channel::BETA && - (feature == &kMigrateDefaultChromeAppToWebAppsGSuite || - feature == &kMigrateDefaultChromeAppToWebAppsNonGSuite)) { - return base::FeatureList::IsEnabled( - kMigrateDefaultChromeAppToWebAppsChromeOsBeta); + if (IsMigrationFeature(*feature)) { + // See |kMigrateDefaultChromeAppToWebAppsChromeOsBeta| comment above. + if (chrome::GetChannel() == version_info::Channel::BETA) { + return base::FeatureList::IsEnabled( + kMigrateDefaultChromeAppToWebAppsChromeOsBeta); + } + + // See |kMigrateDefaultChromeAppToWebAppsChromeOsManaged| comment above. + if (profile.GetProfilePolicyConnector()->IsManaged()) { + return base::FeatureList::IsEnabled( + kMigrateDefaultChromeAppToWebAppsChromeOsManaged); + } } #endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/web_applications/components/preinstalled_app_install_features.h b/chrome/browser/web_applications/components/preinstalled_app_install_features.h index 9d79097..276e41d 100644 --- a/chrome/browser/web_applications/components/preinstalled_app_install_features.h +++ b/chrome/browser/web_applications/components/preinstalled_app_install_features.h
@@ -9,6 +9,8 @@ #include "base/feature_list.h" #include "base/strings/string_piece_forward.h" +class Profile; + namespace web_app { extern const base::Feature kMigrateDefaultChromeAppToWebAppsGSuite; @@ -17,12 +19,15 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) extern const base::Feature kMigrateDefaultChromeAppToWebAppsChromeOsBeta; -#endif + +extern const base::Feature kMigrateDefaultChromeAppToWebAppsChromeOsManaged; +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) // Returns the base::Feature in |kPreinstalledAppInstallFeatures| that // corresponds to |feature_name|. Used by external app install configs to gate // installation on features listed in |kPreinstalledAppInstallFeatures|. -bool IsPreinstalledAppInstallFeatureEnabled(base::StringPiece feature_name); +bool IsPreinstalledAppInstallFeatureEnabled(base::StringPiece feature_name, + const Profile& profile); base::AutoReset<bool> SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting();
diff --git a/chrome/browser/web_applications/components/preinstalled_app_install_features_unittest.cc b/chrome/browser/web_applications/components/preinstalled_app_install_features_unittest.cc index e7e6c9e..dd827220 100644 --- a/chrome/browser/web_applications/components/preinstalled_app_install_features_unittest.cc +++ b/chrome/browser/web_applications/components/preinstalled_app_install_features_unittest.cc
@@ -9,7 +9,6 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/common/chrome_features.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" @@ -22,6 +21,7 @@ struct Migrate { bool beta; + bool managed; }; class PreinstalledWebAppInstallFeaturesTest @@ -30,7 +30,9 @@ public: static std::string ParamToString( const ::testing::TestParamInfo<Migrate> param_info) { - return param_info.param.beta ? "MigrateBeta" : "UnmigrateBeta"; + return base::StrCat( + {param_info.param.beta ? "MigrateBeta" : "UnmigrateBeta", "_", + param_info.param.managed ? "MigrateManaged" : "UnmigrateManaged"}); } PreinstalledWebAppInstallFeaturesTest() { @@ -48,22 +50,68 @@ kMigrateDefaultChromeAppToWebAppsChromeOsBeta); } #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) + if (GetMigrate().managed) { + managed_migration_.InitAndEnableFeature( + kMigrateDefaultChromeAppToWebAppsChromeOsManaged); + } else { + managed_migration_.InitAndDisableFeature( + kMigrateDefaultChromeAppToWebAppsChromeOsManaged); + } #endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) } + ~PreinstalledWebAppInstallFeaturesTest() override = default; const Migrate& GetMigrate() { return GetParam(); } - private: + void ExpectMigrationEnabled(bool unmanaged_expectation, + bool managed_expectation) { + { + TestingProfile::Builder builder; + builder.OverridePolicyConnectorIsManagedForTesting(false); + std::unique_ptr<TestingProfile> unmanaged_profile = builder.Build(); + EXPECT_EQ( + IsPreinstalledAppInstallFeatureEnabled( + kMigrateDefaultChromeAppToWebAppsGSuite.name, *unmanaged_profile), + unmanaged_expectation); + EXPECT_EQ(IsPreinstalledAppInstallFeatureEnabled( + kMigrateDefaultChromeAppToWebAppsNonGSuite.name, + *unmanaged_profile), + unmanaged_expectation); + } + + { + TestingProfile::Builder builder; + builder.OverridePolicyConnectorIsManagedForTesting(true); + std::unique_ptr<TestingProfile> managed_profile = builder.Build(); + EXPECT_EQ( + IsPreinstalledAppInstallFeatureEnabled( + kMigrateDefaultChromeAppToWebAppsGSuite.name, *managed_profile), + managed_expectation); + EXPECT_EQ(IsPreinstalledAppInstallFeatureEnabled( + kMigrateDefaultChromeAppToWebAppsNonGSuite.name, + *managed_profile), + managed_expectation); + } + } + + protected: base::test::ScopedFeatureList base_migration_; base::test::ScopedFeatureList beta_migration_; + base::test::ScopedFeatureList managed_migration_; + + content::BrowserTaskEnvironment task_environment_; }; TEST_P(PreinstalledWebAppInstallFeaturesTest, NonBetaChannel) { - EXPECT_TRUE(IsPreinstalledAppInstallFeatureEnabled( - kMigrateDefaultChromeAppToWebAppsGSuite.name)); - EXPECT_TRUE(IsPreinstalledAppInstallFeatureEnabled( - kMigrateDefaultChromeAppToWebAppsNonGSuite.name)); + ExpectMigrationEnabled( + /*unmanaged_expectation=*/true, +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + /*managed_expectation=*/GetMigrate().managed +#else + /*managed_expectation=*/true +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + ); } #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) @@ -74,22 +122,21 @@ {crosapi::kChromeOSReleaseTrack, "=", crosapi::kReleaseChannelBeta}), base::Time::Now()); - EXPECT_EQ(IsPreinstalledAppInstallFeatureEnabled( - kMigrateDefaultChromeAppToWebAppsGSuite.name), - GetMigrate().beta); - EXPECT_EQ(IsPreinstalledAppInstallFeatureEnabled( - kMigrateDefaultChromeAppToWebAppsNonGSuite.name), - GetMigrate().beta); + ExpectMigrationEnabled(/*unmanaged_expectation=*/GetMigrate().beta, + /*managed_expectation=*/GetMigrate().beta); base::SysInfo::ResetChromeOSVersionInfoForTest(); } #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) #endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) -INSTANTIATE_TEST_SUITE_P(All, - PreinstalledWebAppInstallFeaturesTest, - testing::Values(Migrate{.beta = true}, - Migrate{.beta = false}), - &PreinstalledWebAppInstallFeaturesTest::ParamToString); +INSTANTIATE_TEST_SUITE_P( + All, + PreinstalledWebAppInstallFeaturesTest, + testing::Values(Migrate{.beta = false, .managed = false}, + Migrate{.beta = false, .managed = true}, + Migrate{.beta = true, .managed = false}, + Migrate{.beta = true, .managed = true}), + &PreinstalledWebAppInstallFeaturesTest::ParamToString); } // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc b/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc index 0837092..faf3d9c 100644 --- a/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc +++ b/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc
@@ -20,6 +20,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/logging.h" #include "base/nix/xdg_util.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" @@ -47,12 +48,12 @@ MockEnvironment& operator=(const MockEnvironment&) = delete; void Set(base::StringPiece name, const std::string& value) { - variables_[name.as_string()] = value; + variables_[std::string(name)] = value; } bool GetVar(base::StringPiece variable_name, std::string* result) override { - if (base::Contains(variables_, variable_name.as_string())) { - *result = variables_[variable_name.as_string()]; + if (base::Contains(variables_, std::string(variable_name))) { + *result = variables_[std::string(variable_name)]; return true; }
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager.cc b/chrome/browser/web_applications/preinstalled_web_app_manager.cc index 62739da9..69f6397 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_manager.cc +++ b/chrome/browser/web_applications/preinstalled_web_app_manager.cc
@@ -164,8 +164,8 @@ } // Remove if gated on a disabled feature. - if (options.gate_on_feature && - !IsPreinstalledAppInstallFeatureEnabled(*options.gate_on_feature)) { + if (options.gate_on_feature && !IsPreinstalledAppInstallFeatureEnabled( + *options.gate_on_feature, *profile)) { return options.install_url.spec() + " disabled because feature is disabled: " + *options.gate_on_feature; } @@ -541,10 +541,11 @@ SetMigrationRun(profile_, kMigrateDefaultChromeAppToWebAppsGSuite.name, IsPreinstalledAppInstallFeatureEnabled( - kMigrateDefaultChromeAppToWebAppsGSuite.name)); - SetMigrationRun(profile_, kMigrateDefaultChromeAppToWebAppsNonGSuite.name, - IsPreinstalledAppInstallFeatureEnabled( - kMigrateDefaultChromeAppToWebAppsNonGSuite.name)); + kMigrateDefaultChromeAppToWebAppsGSuite.name, *profile_)); + SetMigrationRun( + profile_, kMigrateDefaultChromeAppToWebAppsNonGSuite.name, + IsPreinstalledAppInstallFeatureEnabled( + kMigrateDefaultChromeAppToWebAppsNonGSuite.name, *profile_)); if (callback) { std::move(callback).Run(std::move(install_results),
diff --git a/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc b/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc index 95b8076..66e359f 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc +++ b/chrome/browser/web_applications/preinstalled_web_app_migration_browsertest.cc
@@ -249,7 +249,8 @@ // Set up pre-migration state. { - ASSERT_FALSE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_FALSE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); SyncExternalWebApps(/*expect_install=*/false, /*expect_uninstall=*/false); @@ -274,7 +275,8 @@ { base::AutoReset<bool> testing_scope = SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting(); - ASSERT_TRUE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_TRUE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); // Extension sticks around to be uninstalled by the replacement web app. @@ -317,7 +319,8 @@ // Revert migration. { - ASSERT_FALSE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_FALSE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); SyncExternalWebApps(/*expect_install=*/false, /*expect_uninstall=*/true); @@ -340,7 +343,8 @@ base::HistogramTester histograms; base::AutoReset<bool> testing_scope = SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting(); - ASSERT_TRUE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_TRUE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); extensions::TestExtensionRegistryObserver uninstall_observer( extensions::ExtensionRegistry::Get(profile())); @@ -388,7 +392,8 @@ // Set up pre-migration state. { - ASSERT_FALSE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_FALSE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); SyncExternalWebApps(/*expect_install=*/false, /*expect_uninstall=*/false); @@ -422,7 +427,8 @@ { base::AutoReset<bool> testing_scope = SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting(); - ASSERT_TRUE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_TRUE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); // Extension sticks around to be uninstalled by the replacement web app. @@ -482,7 +488,8 @@ UserUninstalledExtensionApp) { // Set up pre-migration state. { - ASSERT_FALSE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_FALSE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); SyncExternalWebApps(/*expect_install=*/false, /*expect_uninstall=*/false); @@ -507,7 +514,8 @@ { base::AutoReset<bool> testing_scope = SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting(); - ASSERT_TRUE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_TRUE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); EXPECT_FALSE(IsExtensionAppInstalled()); @@ -540,7 +548,8 @@ { base::HistogramTester histograms; - ASSERT_FALSE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_FALSE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); SyncExternalWebApps(/*expect_install=*/false, /*expect_uninstall=*/false, @@ -561,7 +570,8 @@ { base::AutoReset<bool> testing_scope = SetPreinstalledAppInstallFeatureAlwaysEnabledForTesting(); - ASSERT_TRUE(IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag)); + ASSERT_TRUE( + IsPreinstalledAppInstallFeatureEnabled(kMigrationFlag, *profile())); SyncExternalExtensions(); // Extension sticks around to be uninstalled by the replacement web app.
diff --git a/chrome/browser/win/conflicts/module_info_util.cc b/chrome/browser/win/conflicts/module_info_util.cc index 4967ecc..a1bc0a5 100644 --- a/chrome/browser/win/conflicts/module_info_util.cc +++ b/chrome/browser/win/conflicts/module_info_util.cc
@@ -18,6 +18,7 @@ #include "base/i18n/case_conversion.h" #include "base/logging.h" #include "base/scoped_generic.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/win/pe_image_reader.h" @@ -266,7 +267,7 @@ for (const std::wstring& variable : environment_variables) { std::string value; if (environment->GetVar(base::WideToASCII(variable).c_str(), &value)) { - value = base::TrimString(value, "\\", base::TRIM_TRAILING).as_string(); + value = std::string(base::TrimString(value, "\\", base::TRIM_TRAILING)); string_mapping.push_back(std::make_pair( base::i18n::ToLower(base::UTF8ToUTF16(value)), u"%" + base::i18n::ToLower(base::AsString16(variable)) + u"%"));
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 5aa4f37..6a33e5b 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-master-1619632776-bf9f30743a253033347f774818e9c95aee4c9cab.profdata +chrome-mac-master-1619672805-fa4a84cc78f76e86554b1c1cdf6d56a9360a0315.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 979d981..419ebcd 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-master-1619621900-8d394bc4ef01627c429b71cef8df49097a385661.profdata +chrome-win32-master-1619672805-ce53f98f92ccde0f80efffd2968099c86b1e3cb3.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 34fe5d2..0e576701 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1619632776-63b16d2daf336d315e60534a62a375f8b10fdde6.profdata +chrome-win64-master-1619672805-1a739302f722be6d61a7e6509e6039d1e86f5d75.profdata
diff --git a/chrome/chrome_cleaner/logging/message_builder.cc b/chrome/chrome_cleaner/logging/message_builder.cc index 1934ba33..266f206 100644 --- a/chrome/chrome_cleaner/logging/message_builder.cc +++ b/chrome/chrome_cleaner/logging/message_builder.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" namespace chrome_cleaner { @@ -15,7 +16,7 @@ : value_(value) {} MessageBuilder::MessageItem::MessageItem(base::StringPiece value) - : value_(base::UTF8ToWide(value.as_string())) {} + : value_(base::UTF8ToWide(value)) {} MessageBuilder::MessageItem::MessageItem(int value) : value_(base::NumberToWString(value)) {}
diff --git a/chrome/chrome_cleaner/os/digest_verifier.cc b/chrome/chrome_cleaner/os/digest_verifier.cc index fc6bc378..6ebf2ac 100644 --- a/chrome/chrome_cleaner/os/digest_verifier.cc +++ b/chrome/chrome_cleaner/os/digest_verifier.cc
@@ -76,7 +76,7 @@ } chrome_cleaner::FileDigests digests_pb; - if (!digests_pb.ParseFromString(serialized_digest_pb.as_string())) { + if (!digests_pb.ParseFromString(std::string(serialized_digest_pb))) { LOG(ERROR) << "Failed to parse digests protobuf"; return false; }
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 96af1297b..db4e6d4 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -864,9 +864,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) // Enables or disables SmartDim on Chrome OS. const base::Feature kSmartDim{"SmartDim", base::FEATURE_DISABLED_BY_DEFAULT}; - -// Enables or disables using smbfs for accessing SMB file shares. -const base::Feature kSmbFs{"SmbFs", base::FEATURE_ENABLED_BY_DEFAULT}; #endif // BUILDFLAG(IS_CHROMEOS_ASH) // Enables or disables the ability to use the sound content setting to mute a
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index d7db15b..18b8168a 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -578,8 +578,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kSmartDim; - -COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kSmbFs; #endif COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/credential_provider/gaiacp/gem_device_details_manager.cc b/chrome/credential_provider/gaiacp/gem_device_details_manager.cc index cdd9f6f..af1084e8 100644 --- a/chrome/credential_provider/gaiacp/gem_device_details_manager.cc +++ b/chrome/credential_provider/gaiacp/gem_device_details_manager.cc
@@ -162,10 +162,21 @@ return status; } + wchar_t found_username[kWindowsUsernameBufferLength] = {}; + wchar_t found_domain[kWindowsDomainBufferLength] = {}; + + status = OSUserManager::Get()->FindUserBySID( + context.user_sid.c_str(), found_username, base::size(found_username), + found_domain, base::size(found_domain)); + if (FAILED(status)) { + LOGFN(ERROR) << "Could not get username and domain from sid " + << context.user_sid; + } + return UploadDeviceDetailsInternal( /* access_token= */ std::string(), obfuscated_user_id, context.dm_token, - context.user_sid, context.device_resource_id, - /* username= */ L"", /* domain= */ L""); + context.user_sid, context.device_resource_id, found_username, + found_domain); } // Uploads the device details into GEM database using |access_token|
diff --git a/chrome/credential_provider/gaiacp/gem_device_details_manager_unittests.cc b/chrome/credential_provider/gaiacp/gem_device_details_manager_unittests.cc index 0f1a773..e5d5c0b 100644 --- a/chrome/credential_provider/gaiacp/gem_device_details_manager_unittests.cc +++ b/chrome/credential_provider/gaiacp/gem_device_details_manager_unittests.cc
@@ -6,6 +6,7 @@ #include "base/base_paths_win.h" #include "base/files/scoped_temp_dir.h" +#include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_path_override.h" @@ -27,12 +28,12 @@ // Params: // string : The specified device resource ID. // bool : Whether a valid user sid is present. -// bool : Whether the feature to upload device details via ESA is enabled. +// bool : Whether the username and domain lookup fails. // string : The specified DM token. class GemDeviceDetailsExtensionTest : public GemDeviceDetailsBaseTest, public ::testing::WithParamInterface< - std::tuple<const wchar_t*, bool, const wchar_t*>> { + std::tuple<const wchar_t*, bool, bool, const wchar_t*>> { public: GemDeviceDetailsExtensionTest(); @@ -48,19 +49,25 @@ TEST_P(GemDeviceDetailsExtensionTest, WithUserDeviceContext) { const std::wstring device_resource_id(std::get<0>(GetParam())); bool has_valid_sid = std::get<1>(GetParam()); - const std::wstring dm_token(std::get<2>(GetParam())); + bool fail_sid_lookup = std::get<2>(GetParam()); + const std::wstring dm_token(std::get<3>(GetParam())); std::wstring user_sid = L"invalid-user-sid"; + std::wstring domain_name = L"company.com"; if (has_valid_sid) { // Create a fake user associated to a gaia id. CComBSTR sid_str; ASSERT_EQ(S_OK, fake_os_user_manager()->CreateTestOSUser( kDefaultUsername, L"password", L"Full Name", L"comment", base::UTF8ToWide(kDefaultGaiaId), L"user@company.com", - &sid_str)); + domain_name, &sid_str)); user_sid = OLE2W(sid_str); } + if (fail_sid_lookup) { + fake_os_user_manager()->FailFindUserBySID(user_sid.c_str(), 1); + } + base::Value expected_response_value(base::Value::Type::DICTIONARY); expected_response_value.SetStringKey("deviceResourceId", base::WideToUTF8(device_resource_id)); @@ -75,6 +82,7 @@ fake_http_url_fetcher_factory()->SetFakeResponse( upload_device_details_url, FakeWinHttpUrlFetcher::Headers(), expected_response); + fake_http_url_fetcher_factory()->SetCollectRequestData(true); extension::UserDeviceContext context(device_resource_id, L"", L"", user_sid, dm_token); @@ -89,6 +97,26 @@ ASSERT_TRUE(FAILED(status)); } else { ASSERT_TRUE(SUCCEEDED(status)); + + ASSERT_EQ(1UL, fake_http_url_fetcher_factory()->requests_created()); + FakeWinHttpUrlFetcherFactory::RequestData request_data = + fake_http_url_fetcher_factory()->GetRequestData(0); + base::Value body_value = base::JSONReader::Read(request_data.body).value(); + + std::string uploaded_dm_token = GetDictStringUTF8(body_value, "dm_token"); + ASSERT_EQ(uploaded_dm_token, base::WideToUTF8(dm_token)); + + std::string uploaded_username = + GetDictStringUTF8(body_value, "account_username"); + std::string uploaded_domain = + GetDictStringUTF8(body_value, "device_domain"); + if (!fail_sid_lookup) { + ASSERT_EQ(uploaded_username, base::WideToUTF8(kDefaultUsername)); + ASSERT_EQ(uploaded_domain, base::WideToUTF8(domain_name)); + } else { + ASSERT_EQ(uploaded_username, ""); + ASSERT_EQ(uploaded_domain, ""); + } } } @@ -97,6 +125,7 @@ GemDeviceDetailsExtensionTest, ::testing::Combine(::testing::Values(L"valid-device-resource-id"), ::testing::Bool(), + ::testing::Bool(), ::testing::Values(L"valid-dm-token"))); } // namespace testing
diff --git a/chrome/credential_provider/test/gcp_fakes.cc b/chrome/credential_provider/test/gcp_fakes.cc index ef003a4f..265db43 100644 --- a/chrome/credential_provider/test/gcp_fakes.cc +++ b/chrome/credential_provider/test/gcp_fakes.cc
@@ -344,6 +344,15 @@ DWORD username_size, wchar_t* domain, DWORD domain_size) { + auto it = to_be_failed_find_user_sids_.find(sid); + if (it != to_be_failed_find_user_sids_.end()) { + to_be_failed_find_user_sids_[sid]--; + if (to_be_failed_find_user_sids_[sid] == 0) + to_be_failed_find_user_sids_.erase(it); + + return E_FAIL; + } + for (auto& kv : username_to_info_) { if (kv.second.sid == sid) { if (username) @@ -357,6 +366,11 @@ return HRESULT_FROM_WIN32(ERROR_NONE_MAPPED); } +void FakeOSUserManager::FailFindUserBySID(const wchar_t* sid, + int number_of_failures) { + to_be_failed_find_user_sids_[sid] = number_of_failures; +} + HRESULT FakeOSUserManager::RemoveUser(const wchar_t* username, const wchar_t* password) { username_to_info_.erase(username);
diff --git a/chrome/credential_provider/test/gcp_fakes.h b/chrome/credential_provider/test/gcp_fakes.h index 371c9ac..26a4f16 100644 --- a/chrome/credential_provider/test/gcp_fakes.h +++ b/chrome/credential_provider/test/gcp_fakes.h
@@ -146,6 +146,8 @@ is_device_domain_joined_ = is_device_domain_joined; } + void FailFindUserBySID(const wchar_t* sid, int number_of_failures); + struct UserInfo { UserInfo(const wchar_t* domain, const wchar_t* password, @@ -216,6 +218,7 @@ std::map<std::wstring, UserInfo> username_to_info_; bool is_device_domain_joined_ = false; std::map<FAILEDOPERATIONS, HRESULT> failure_reasons_; + std::map<std::wstring, int> to_be_failed_find_user_sids_; }; ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/services/ipp_parser/public/cpp/ipp_converter.cc b/chrome/services/ipp_parser/public/cpp/ipp_converter.cc index 438961c8..f8699431 100644 --- a/chrome/services/ipp_parser/public/cpp/ipp_converter.cc +++ b/chrome/services/ipp_parser/public/cpp/ipp_converter.cc
@@ -10,6 +10,7 @@ #include <vector> #include "base/strings/strcat.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/values.h" #include "net/http/http_util.h" @@ -74,12 +75,12 @@ const size_t value_begin_index = key_end_index + 1; if (value_begin_index == header.size()) { // Empty header value is valid - return HttpHeader{key.as_string(), ""}; + return HttpHeader{std::string(key), ""}; } base::StringPiece value = header.substr(value_begin_index); value = net::HttpUtil::TrimLWS(value); - return HttpHeader{key.as_string(), value.as_string()}; + return HttpHeader{std::string(key), std::string(value)}; } // Converts |value_tag| to corresponding mojom type for marshalling.
diff --git a/chrome/test/chromedriver/chrome/adb_impl.cc b/chrome/test/chromedriver/chrome/adb_impl.cc index 539e0cae..315b22bc 100644 --- a/chrome/test/chromedriver/chrome/adb_impl.cc +++ b/chrome/test/chromedriver/chrome/adb_impl.cc
@@ -15,6 +15,7 @@ #include "base/memory/ref_counted.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" @@ -322,7 +323,7 @@ base::SPLIT_WANT_NONEMPTY); if (tokens.size() != 8) continue; - *socket_name = tokens[7].as_string(); + *socket_name = std::string(tokens[7]); return Status(kOk); }
diff --git a/chrome/updater/lib_util_unittest.cc b/chrome/updater/lib_util_unittest.cc index c133b6a15..ff7a492 100644 --- a/chrome/updater/lib_util_unittest.cc +++ b/chrome/updater/lib_util_unittest.cc
@@ -23,8 +23,8 @@ for (auto pair : reserved_characters) { // If input contains a reserved character, just ignore it. - std::string escaped_includes_reserved = pair.first.as_string() + "%20"; - std::string unescaped = pair.first.as_string() + " "; + std::string escaped_includes_reserved = std::string(pair.first) + "%20"; + std::string unescaped = std::string(pair.first) + " "; EXPECT_EQ(unescaped, UnescapeURLComponent(escaped_includes_reserved)); } }
diff --git a/chrome/updater/lib_util_win.cc b/chrome/updater/lib_util_win.cc index 402038ca4..af7f91b 100644 --- a/chrome/updater/lib_util_win.cc +++ b/chrome/updater/lib_util_win.cc
@@ -4,6 +4,7 @@ #include "chrome/updater/lib_util.h" +#include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "base/win/shlwapi.h" #include "base/win/windows_full.h" @@ -16,7 +17,7 @@ if (escaped_text_piece.empty()) return {}; - std::string escaped_text = escaped_text_piece.as_string(); + std::string escaped_text(escaped_text_piece); // UrlUnescapeA doesn't modify the buffer unless passed URL_UNESCAPE_INPLACE. char* escaped_text_ptr = const_cast<char*>(escaped_text.data());
diff --git a/chrome/updater/tag.cc b/chrome/updater/tag.cc index 25aca505..c5fa9a5 100644 --- a/chrome/updater/tag.cc +++ b/chrome/updater/tag.cc
@@ -118,22 +118,22 @@ if (value.empty()) return ErrorCode::kGlobal_BundleNameCannotBeWhitespace; - args->bundle_name = value.as_string(); + args->bundle_name = std::string(value); return ErrorCode::kSuccess; } ErrorCode ParseInstallationId(base::StringPiece value, TagArgs* args) { - args->installation_id = value.as_string(); + args->installation_id = std::string(value); return ErrorCode::kSuccess; } ErrorCode ParseBrandCode(base::StringPiece value, TagArgs* args) { - args->brand_code = value.as_string(); + args->brand_code = std::string(value); return ErrorCode::kSuccess; } ErrorCode ParseClientId(base::StringPiece value, TagArgs* args) { - args->client_id = value.as_string(); + args->client_id = std::string(value); return ErrorCode::kSuccess; } @@ -142,12 +142,12 @@ if (value.empty()) return ErrorCode::kGlobal_ExperimentLabelsCannotBeWhitespace; - args->experiment_labels = value.as_string(); + args->experiment_labels = std::string(value); return ErrorCode::kSuccess; } ErrorCode ParseReferralId(base::StringPiece value, TagArgs* args) { - args->referral_id = value.as_string(); + args->referral_id = std::string(value); return ErrorCode::kSuccess; } @@ -170,7 +170,7 @@ ErrorCode ParseLanguage(base::StringPiece value, TagArgs* args) { // Even if we don't support the language, we want to pass it to the // installer. Omaha will pick its language later. See http://b/1336966. - args->language = value.as_string(); + args->language = std::string(value); return ErrorCode::kSuccess; } @@ -239,7 +239,7 @@ namespace app_attributes { ErrorCode ParseAdditionalParameters(base::StringPiece value, AppArgs* args) { - args->ap = value.as_string(); + args->ap = std::string(value); return ErrorCode::kSuccess; } @@ -248,7 +248,7 @@ if (value.empty()) return ErrorCode::kApp_ExperimentLabelsCannotBeWhitespace; - args->experiment_labels = value.as_string(); + args->experiment_labels = std::string(value); return ErrorCode::kSuccess; } @@ -257,7 +257,7 @@ if (value.empty()) return ErrorCode::kApp_AppNameCannotBeWhitespace; - args->app_name = value.as_string(); + args->app_name = std::string(value); return ErrorCode::kSuccess; } @@ -271,12 +271,12 @@ } ErrorCode ParseInstallDataIndex(base::StringPiece value, AppArgs* args) { - args->install_data_index = value.as_string(); + args->install_data_index = std::string(value); return ErrorCode::kSuccess; } ErrorCode ParseUntrustedData(base::StringPiece value, AppArgs* args) { - args->untrusted_data = value.as_string(); + args->untrusted_data = std::string(value); return ErrorCode::kSuccess; } @@ -333,7 +333,7 @@ kAppInstallerData_InstallerDataCannotBeSpecifiedBeforeAppId; args->apps[current_app_index->value()].encoded_installer_data = - value.as_string(); + std::string(value); return ErrorCode::kSuccess; } @@ -394,7 +394,7 @@ base::TrimPositions::TRIM_ALL); attributes.emplace_back(name, unescape_value ? updater::UnescapeURLComponent(value) - : value.as_string()); + : std::string(value)); } } return attributes;
diff --git a/chromeos/components/camera_app_ui/resources/views/main.html b/chromeos/components/camera_app_ui/resources/views/main.html index 4dc821d..c0430e75 100644 --- a/chromeos/components/camera_app_ui/resources/views/main.html +++ b/chromeos/components/camera_app_ui/resources/views/main.html
@@ -251,15 +251,17 @@ </div> <div id="view-ptz-panel"> <div id="panel-container"> - <button id="tilt-up" i18n-label="tilt_up_button" tabindex="0"></button> - <button id="pan-right" i18n-label="pan_right_button" + <button id="tilt-up" class="inkdrop" i18n-label="tilt_up_button" tabindex="0"></button> - <button id="tilt-down" i18n-label="tilt_down_button" + <button id="pan-right" class="inkdrop" i18n-label="pan_right_button" tabindex="0"></button> - <button id="pan-left" i18n-label="pan_left_button" + <button id="tilt-down" class="inkdrop" i18n-label="tilt_down_button" tabindex="0"></button> - <button id="zoom-in" i18n-label="zoom_in_button" tabindex="0"></button> - <button id="zoom-out" i18n-label="zoom_out_button" + <button id="pan-left" class="inkdrop" i18n-label="pan_left_button" + tabindex="0"></button> + <button id="zoom-in" class="inkdrop" i18n-label="zoom_in_button" + tabindex="0"></button> + <button id="zoom-out" class="inkdrop" i18n-label="zoom_out_button" tabindex="0"></button> <div id="ptz-divider1" class="ptz-divider"></div> <div id="ptz-divider2" class="ptz-divider"></div>
diff --git a/chromeos/components/help_app_ui/resources/help_app.externs.js b/chromeos/components/help_app_ui/resources/help_app.externs.js index d7f9e86..2a0ab7f 100644 --- a/chromeos/components/help_app_ui/resources/help_app.externs.js +++ b/chromeos/components/help_app_ui/resources/help_app.externs.js
@@ -230,3 +230,11 @@ * @return {!helpApp.ClientApiDelegate} */ helpApp.ClientApi.prototype.getDelegate = function() {}; + +/** + * Launch data that can be read by the app when it first loads. + * @type {{ + * delegate: (!helpApp.ClientApiDelegate | undefined), + * }} + */ +window.customLaunchData;
diff --git a/chromeos/components/help_app_ui/resources/receiver.js b/chromeos/components/help_app_ui/resources/receiver.js index 65eab81d..1c6cd25 100644 --- a/chromeos/components/help_app_ui/resources/receiver.js +++ b/chromeos/components/help_app_ui/resources/receiver.js
@@ -57,6 +57,10 @@ }, }; +window.customLaunchData = { + delegate: DELEGATE, +}; + /** * Returns the help app if it can find it in the DOM. * @return {?helpApp.ClientApi}
diff --git a/chromeos/components/local_search_service/content_extraction_utils.cc b/chromeos/components/local_search_service/content_extraction_utils.cc index f503894..8899035 100644 --- a/chromeos/components/local_search_service/content_extraction_utils.cc +++ b/chromeos/components/local_search_service/content_extraction_utils.cc
@@ -9,12 +9,12 @@ #include <vector> #include "base/check.h" +#include "base/containers/contains.h" #include "base/containers/flat_set.h" #include "base/i18n/case_conversion.h" #include "base/i18n/unicodestring.h" #include "base/memory/ptr_util.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "chromeos/components/string_matching/tokenized_string.h" #include "third_party/icu/source/i18n/unicode/translit.h"
diff --git a/chromeos/components/media_app_ui/media_app_guest_ui.cc b/chromeos/components/media_app_ui/media_app_guest_ui.cc index c151c28..9aa755cb 100644 --- a/chromeos/components/media_app_ui/media_app_guest_ui.cc +++ b/chromeos/components/media_app_ui/media_app_guest_ui.cc
@@ -3,16 +3,14 @@ // found in the LICENSE file. #include "chromeos/components/media_app_ui/media_app_guest_ui.h" -#include "base/command_line.h" -#include "base/memory/ref_counted_memory.h" #include "chromeos/components/media_app_ui/url_constants.h" +#include "chromeos/components/web_applications/webui_test_prod_util.h" #include "chromeos/grit/chromeos_media_app_bundle_resources.h" #include "chromeos/grit/chromeos_media_app_bundle_resources_map.h" #include "chromeos/grit/chromeos_media_app_resources.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" -#include "content/public/common/content_switches.h" #include "services/network/public/mojom/content_security_policy.mojom.h" #include "ui/file_manager/grit/file_manager_resources.h" @@ -20,31 +18,6 @@ namespace { -content::WebUIDataSource::ShouldHandleRequestCallback& -GetTestShouldHandleRequest() { - static base::NoDestructor< - content::WebUIDataSource::ShouldHandleRequestCallback> - callback; - return *callback; -} - -content::WebUIDataSource::HandleRequestCallback& GetTestRequestFilterHandler() { - static base::NoDestructor<content::WebUIDataSource::HandleRequestCallback> - callback; - return *callback; -} - -bool InvokeTestShouldHandleRequestCallback(const std::string& path) { - const auto& callback = GetTestShouldHandleRequest(); - return callback ? callback.Run(path) : false; -} - -void InvokeTestFileRequestFilterCallback( - const std::string& path, - content::WebUIDataSource::GotDataCallback callback) { - return GetTestRequestFilterHandler().Run(path, std::move(callback)); -} - content::WebUIDataSource* CreateMediaAppUntrustedDataSource( MediaAppGuestUIDelegate* delegate) { content::WebUIDataSource* source = @@ -67,13 +40,8 @@ source->AddResourcePath("js/app_image_handler_module.js", IDR_MEDIA_APP_APP_IMAGE_HANDLER_MODULE_JS); - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - const bool is_running_test = command_line->HasSwitch(::switches::kTestType); - if (is_running_test) { - source->SetRequestFilter( - base::BindRepeating(&InvokeTestShouldHandleRequestCallback), - base::BindRepeating(&InvokeTestFileRequestFilterCallback)); - } + MaybeConfigureTestableDataSource(source); + // Add all resources from chromeos_media_app_bundle_resources.pak. source->AddResourcePaths(base::make_span( kChromeosMediaAppBundleResources, kChromeosMediaAppBundleResourcesSize)); @@ -127,13 +95,6 @@ } // namespace -void SetMediaAppGuestUITestRequestHandlerForTesting( // IN-TEST - content::WebUIDataSource::ShouldHandleRequestCallback should_handle, - content::WebUIDataSource::HandleRequestCallback handler) { - GetTestShouldHandleRequest() = std::move(should_handle); - GetTestRequestFilterHandler() = std::move(handler); -} - MediaAppGuestUI::MediaAppGuestUI(content::WebUI* web_ui, MediaAppGuestUIDelegate* delegate) : ui::UntrustedWebUIController(web_ui) {
diff --git a/chromeos/components/media_app_ui/media_app_guest_ui.h b/chromeos/components/media_app_ui/media_app_guest_ui.h index 3ed62b6..b694f50 100644 --- a/chromeos/components/media_app_ui/media_app_guest_ui.h +++ b/chromeos/components/media_app_ui/media_app_guest_ui.h
@@ -5,9 +5,12 @@ #ifndef CHROMEOS_COMPONENTS_MEDIA_APP_UI_MEDIA_APP_GUEST_UI_H_ #define CHROMEOS_COMPONENTS_MEDIA_APP_UI_MEDIA_APP_GUEST_UI_H_ -#include "content/public/browser/web_ui_data_source.h" #include "ui/webui/untrusted_web_ui_controller.h" +namespace content { +class WebUIDataSource; +} + namespace chromeos { // A delegate used during data source creation to expose some //chrome @@ -27,11 +30,6 @@ ~MediaAppGuestUI() override; }; -// Configures the data source request filter used for testing. -void SetMediaAppGuestUITestRequestHandlerForTesting( - content::WebUIDataSource::ShouldHandleRequestCallback should_handle, - content::WebUIDataSource::HandleRequestCallback handler); - } // namespace chromeos #endif // CHROMEOS_COMPONENTS_MEDIA_APP_UI_MEDIA_APP_GUEST_UI_H_
diff --git a/chromeos/components/media_app_ui/media_app_ui.cc b/chromeos/components/media_app_ui/media_app_ui.cc index a2488e9..b747792 100644 --- a/chromeos/components/media_app_ui/media_app_ui.cc +++ b/chromeos/components/media_app_ui/media_app_ui.cc
@@ -6,16 +6,16 @@ #include <utility> -#include "base/command_line.h" #include "chromeos/components/media_app_ui/media_app_page_handler.h" #include "chromeos/components/media_app_ui/url_constants.h" +#include "chromeos/components/web_applications/webui_test_prod_util.h" #include "chromeos/grit/chromeos_media_app_bundle_resources.h" #include "chromeos/grit/chromeos_media_app_resources.h" #include "chromeos/strings/grit/chromeos_strings.h" #include "components/content_settings/core/common/content_settings_types.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" -#include "content/public/common/content_switches.h" +#include "content/public/browser/web_ui_data_source.h" #include "content/public/common/url_constants.h" #include "services/network/public/mojom/content_security_policy.mojom.h" #include "ui/webui/webui_allowlist.h" @@ -56,22 +56,6 @@ return source; } -bool TestShouldHandleRequest(const std::string& path) { - return path == "media_app_ui_browsertest.js" || path == "driver.js"; -} - -content::WebUIDataSource::HandleRequestCallback& GetTestRequestFilterHandler() { - static base::NoDestructor<content::WebUIDataSource::HandleRequestCallback> - callback; - return *callback; -} - -void InvokeTestFileRequestFilterCallback( - const std::string& path, - content::WebUIDataSource::GotDataCallback callback) { - return GetTestRequestFilterHandler().Run(path, std::move(callback)); -} - } // namespace MediaAppUI::MediaAppUI(content::WebUI* web_ui, @@ -90,17 +74,10 @@ host_source->OverrideCrossOriginOpenerPolicy("same-origin"); host_source->OverrideCrossOriginEmbedderPolicy("require-corp"); - // Only add a filter when running as test. - const bool is_running_test = - base::CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType); - if (is_running_test) { + if (MaybeConfigureTestableDataSource(host_source)) { host_source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::TrustedTypes, std::string("trusted-types test-harness;")); - - host_source->SetRequestFilter( - base::BindRepeating(&TestShouldHandleRequest), - base::BindRepeating(&InvokeTestFileRequestFilterCallback)); } // Register auto-granted permissions. @@ -143,9 +120,4 @@ WEB_UI_CONTROLLER_TYPE_IMPL(MediaAppUI) -void SetMediaAppUITestRequestHandlerForTesting( - content::WebUIDataSource::HandleRequestCallback callback) { - GetTestRequestFilterHandler() = std::move(callback); -} - } // namespace chromeos
diff --git a/chromeos/components/media_app_ui/media_app_ui.h b/chromeos/components/media_app_ui/media_app_ui.h index b5fb3bb..508c38f 100644 --- a/chromeos/components/media_app_ui/media_app_ui.h +++ b/chromeos/components/media_app_ui/media_app_ui.h
@@ -9,7 +9,6 @@ #include "chromeos/components/media_app_ui/media_app_ui.mojom.h" #include "chromeos/components/media_app_ui/media_app_ui_delegate.h" -#include "content/public/browser/web_ui_data_source.h" #include "mojo/public/cpp/bindings/receiver.h" #include "ui/webui/mojo_web_ui_controller.h" @@ -47,10 +46,6 @@ WEB_UI_CONTROLLER_TYPE_DECL(); }; -// Lets tests add their own handlers for requests made from testing code. -void SetMediaAppUITestRequestHandlerForTesting( - content::WebUIDataSource::HandleRequestCallback callback); - } // namespace chromeos #endif // CHROMEOS_COMPONENTS_MEDIA_APP_UI_MEDIA_APP_UI_H_
diff --git a/chromeos/components/media_app_ui/test/media_app_ui_browsertest.cc b/chromeos/components/media_app_ui/test/media_app_ui_browsertest.cc index 1bbcbf9..6d93244 100644 --- a/chromeos/components/media_app_ui/test/media_app_ui_browsertest.cc +++ b/chromeos/components/media_app_ui/test/media_app_ui_browsertest.cc
@@ -4,11 +4,7 @@ #include "chromeos/components/media_app_ui/test/media_app_ui_browsertest.h" -#include "base/base_paths.h" #include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/memory/ref_counted_memory.h" -#include "base/path_service.h" #include "chromeos/components/media_app_ui/media_app_guest_ui.h" #include "chromeos/components/media_app_ui/media_app_ui.h" #include "chromeos/components/media_app_ui/url_constants.h" @@ -35,27 +31,12 @@ constexpr base::FilePath::CharType kTestFileLocation[] = FILE_PATH_LITERAL("chromeos/components/media_app_ui/test"); -void HandleTestFileRequestCallback( - const std::string& path, - content::WebUIDataSource::GotDataCallback callback) { - base::ScopedAllowBlockingForTesting allow_blocking; - - base::FilePath source_root; - base::PathService::Get(base::DIR_SOURCE_ROOT, &source_root); - const base::FilePath test_file_path = - source_root.AppendASCII(kTestFileLocation).AppendASCII(path); - - std::string contents; - CHECK(base::ReadFileToString(test_file_path, &contents)) << test_file_path; - - std::move(callback).Run(base::RefCountedString::TakeString(&contents)); -} - -bool GuestTestShouldHandleRequest(const std::string& path) { - return path == "test_worker.js" || - path == "media_app_guest_ui_browsertest.js" || - path == "guest_query_receiver.js"; -} +// Paths requested on the media-app origin that should be delivered by the test +// handler. +constexpr const char* kTestFiles[] = { + kGuestTestCases, "media_app_ui_browsertest.js", "driver.js", + "test_worker.js", "guest_query_receiver.js", +}; } // namespace @@ -66,12 +47,9 @@ {base::FilePath(kTestLibraryPath), base::FilePath(kCr), base::FilePath(kWebUiTestUtil)}, kGuestTestCases) { - chromeos::SetMediaAppGuestUITestRequestHandlerForTesting( - base::BindRepeating(&GuestTestShouldHandleRequest), - base::BindRepeating(&HandleTestFileRequestCallback)); - - chromeos::SetMediaAppUITestRequestHandlerForTesting( - base::BindRepeating(&HandleTestFileRequestCallback)); + ConfigureDefaultTestRequestHandler( + base::FilePath(kTestFileLocation), + {std::begin(kTestFiles), std::end(kTestFiles)}); } MediaAppUiBrowserTest::~MediaAppUiBrowserTest() = default;
diff --git a/chromeos/components/web_applications/BUILD.gn b/chromeos/components/web_applications/BUILD.gn index 389cdde..c2541bc 100644 --- a/chromeos/components/web_applications/BUILD.gn +++ b/chromeos/components/web_applications/BUILD.gn
@@ -5,6 +5,10 @@ assert(is_chromeos, "These utils are Chrome OS only") static_library("web_applications") { + sources = [ + "webui_test_prod_util.cc", + "webui_test_prod_util.h", + ] deps = [ "//base", "//base:i18n",
diff --git a/chromeos/components/web_applications/DEPS b/chromeos/components/web_applications/DEPS index c36190b..aed5532 100644 --- a/chromeos/components/web_applications/DEPS +++ b/chromeos/components/web_applications/DEPS
@@ -1,4 +1,5 @@ include_rules = [ "+content/public/browser", + "+content/public/common", "+ui/base", ]
diff --git a/chromeos/components/web_applications/test/BUILD.gn b/chromeos/components/web_applications/test/BUILD.gn index 5a346c4..04c29cfd 100644 --- a/chromeos/components/web_applications/test/BUILD.gn +++ b/chromeos/components/web_applications/test/BUILD.gn
@@ -15,6 +15,7 @@ "//base/test:test_support", "//chrome/test:test_support", "//chrome/test:test_support_ui", + "//chromeos/components/web_applications", "//content/test:test_support", "//ui/webui:webui", ]
diff --git a/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.cc b/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.cc index ce0ba5aa..61002c3 100644 --- a/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.cc +++ b/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.cc
@@ -6,14 +6,44 @@ #include <vector> +#include "base/base_paths.h" #include "base/files/file_util.h" +#include "base/memory/ref_counted_memory.h" #include "base/path_service.h" #include "base/threading/thread_restrictions.h" #include "chrome/test/base/js_test_api.h" +#include "chromeos/components/web_applications/webui_test_prod_util.h" #include "content/public/browser/navigation_handle.h" #include "content/public/test/test_navigation_observer.h" #include "testing/gtest/include/gtest/gtest.h" +namespace { + +void HandleTestFileRequestCallback( + const base::FilePath& test_file_location, + const std::string& path, + content::WebUIDataSource::GotDataCallback callback) { + base::ScopedAllowBlockingForTesting allow_blocking; + + base::FilePath source_root; + base::PathService::Get(base::DIR_SOURCE_ROOT, &source_root); + const base::FilePath test_file_path = + source_root.Append(test_file_location).AppendASCII(path); + + std::string contents; + CHECK(base::ReadFileToString(test_file_path, &contents)) << test_file_path; + + std::move(callback).Run(base::RefCountedString::TakeString(&contents)); +} + +bool TestRequestHandlerShouldHandleRequest( + const std::vector<std::string>& test_paths, + const std::string& path) { + return base::Contains(test_paths, path); +} + +} // namespace + class SandboxedWebUiAppTestBase::TestCodeInjector : public content::TestNavigationObserver { public: @@ -75,6 +105,16 @@ SandboxedWebUiAppTestBase::~SandboxedWebUiAppTestBase() = default; // static +void SandboxedWebUiAppTestBase::ConfigureDefaultTestRequestHandler( + const base::FilePath& root_folder, + const std::vector<std::string>& resource_files) { + SetTestableDataSourceRequestHandlerForTesting( + base::BindRepeating(&TestRequestHandlerShouldHandleRequest, + resource_files), + base::BindRepeating(&HandleTestFileRequestCallback, root_folder)); +} + +// static std::string SandboxedWebUiAppTestBase::LoadJsTestLibrary( const base::FilePath& script_path) { base::FilePath source_root;
diff --git a/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.h b/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.h index 3d5d6dd..9e01f9c 100644 --- a/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.h +++ b/chromeos/components/web_applications/test/sandboxed_web_ui_test_base.h
@@ -28,6 +28,17 @@ SandboxedWebUiAppTestBase& operator=(const SandboxedWebUiAppTestBase&) = delete; + // Configures and installs a handler to deliver testing resources into a + // WebUIDataSource configured using MaybeConfigureTestableDataSource(). + // This installs the "default" handler which serves requests of the form + // scheme://origin/<file>, where <file> is in |resource_files| and can be + // found from |root_folder| under the source tree. + // Tests can invoke SetTestableDataSourceRequestHandlerForTesting() directly + // for more elaborate handlers. + static void ConfigureDefaultTestRequestHandler( + const base::FilePath& root_folder, + const std::vector<std::string>& resource_files); + // Returns the contents of the JavaScript library used to help test the // sandboxed frame. static std::string LoadJsTestLibrary(const base::FilePath& script_path);
diff --git a/chromeos/components/web_applications/webui_test_prod_util.cc b/chromeos/components/web_applications/webui_test_prod_util.cc new file mode 100644 index 0000000..1a716561 --- /dev/null +++ b/chromeos/components/web_applications/webui_test_prod_util.cc
@@ -0,0 +1,55 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/web_applications/webui_test_prod_util.h" + +#include "base/command_line.h" +#include "base/no_destructor.h" +#include "content/public/common/content_switches.h" + +namespace { + +content::WebUIDataSource::ShouldHandleRequestCallback& +GetTestShouldHandleRequest() { + static base::NoDestructor< + content::WebUIDataSource::ShouldHandleRequestCallback> + callback; + return *callback; +} + +content::WebUIDataSource::HandleRequestCallback& GetTestRequestFilterHandler() { + static base::NoDestructor<content::WebUIDataSource::HandleRequestCallback> + callback; + return *callback; +} + +bool InvokeTestShouldHandleRequestCallback(const std::string& path) { + const auto& callback = GetTestShouldHandleRequest(); + return callback ? callback.Run(path) : false; +} + +void InvokeTestFileRequestFilterCallback( + const std::string& path, + content::WebUIDataSource::GotDataCallback callback) { + return GetTestRequestFilterHandler().Run(path, std::move(callback)); +} + +} // namespace + +bool MaybeConfigureTestableDataSource(content::WebUIDataSource* host_source) { + if (!base::CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType)) + return false; + + host_source->SetRequestFilter( + base::BindRepeating(&InvokeTestShouldHandleRequestCallback), + base::BindRepeating(&InvokeTestFileRequestFilterCallback)); + return true; +} + +void SetTestableDataSourceRequestHandlerForTesting( // IN-TEST + content::WebUIDataSource::ShouldHandleRequestCallback should_handle, + content::WebUIDataSource::HandleRequestCallback handler) { + GetTestShouldHandleRequest() = std::move(should_handle); + GetTestRequestFilterHandler() = std::move(handler); +}
diff --git a/chromeos/components/web_applications/webui_test_prod_util.h b/chromeos/components/web_applications/webui_test_prod_util.h new file mode 100644 index 0000000..c8b5686 --- /dev/null +++ b/chromeos/components/web_applications/webui_test_prod_util.h
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_COMPONENTS_WEB_APPLICATIONS_WEBUI_TEST_PROD_UTIL_H_ +#define CHROMEOS_COMPONENTS_WEB_APPLICATIONS_WEBUI_TEST_PROD_UTIL_H_ + +#include "content/public/browser/web_ui_data_source.h" + +// If the current process is running for tests, configures |host_source| for +// testing by installing a request filter that can be satisfied by tests wanting +// to provide custom resources. Note that if these resources are scripts, +// further CSP changes (e.g. trusted-types) may be required in order for them to +// load. Returns true if the request filter was installed. +bool MaybeConfigureTestableDataSource(content::WebUIDataSource* host_source); + +// Configures the data source request filter used for testing. Only testing code +// should call this. +void SetTestableDataSourceRequestHandlerForTesting( + content::WebUIDataSource::ShouldHandleRequestCallback should_handle, + content::WebUIDataSource::HandleRequestCallback handler); + +#endif // CHROMEOS_COMPONENTS_WEB_APPLICATIONS_WEBUI_TEST_PROD_UTIL_H_
diff --git a/chromeos/dbus/BUILD.gn b/chromeos/dbus/BUILD.gn index 6295613..b600b6b 100644 --- a/chromeos/dbus/BUILD.gn +++ b/chromeos/dbus/BUILD.gn
@@ -15,6 +15,7 @@ public_deps = [ ":common", "//chromeos/dbus/arc", + "//chromeos/dbus/cicerone", "//chromeos/dbus/constants", "//chromeos/dbus/debug_daemon", "//chromeos/dbus/lorgnette_manager", @@ -50,8 +51,6 @@ "cec_service_client.h", "chunneld_client.cc", "chunneld_client.h", - "cicerone_client.cc", - "cicerone_client.h", "concierge_client.cc", "concierge_client.h", "cros_disks_client.cc", @@ -69,8 +68,6 @@ "fake_cec_service_client.h", "fake_chunneld_client.cc", "fake_chunneld_client.h", - "fake_cicerone_client.cc", - "fake_cicerone_client.h", "fake_concierge_client.cc", "fake_concierge_client.h", "fake_cros_disks_client.cc",
diff --git a/chromeos/dbus/biod/fake_biod_client.cc b/chromeos/dbus/biod/fake_biod_client.cc index 10d3915a..1f1c312 100644 --- a/chromeos/dbus/biod/fake_biod_client.cc +++ b/chromeos/dbus/biod/fake_biod_client.cc
@@ -9,8 +9,8 @@ #include <vector> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/threading/thread_task_runner_handle.h" #include "dbus/object_path.h" #include "third_party/cros_system_api/dbus/service_constants.h"
diff --git a/chromeos/dbus/cicerone/BUILD.gn b/chromeos/dbus/cicerone/BUILD.gn new file mode 100644 index 0000000..5662895 --- /dev/null +++ b/chromeos/dbus/cicerone/BUILD.gn
@@ -0,0 +1,22 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") + +component("cicerone") { + defines = [ "IS_CHROMEOS_DBUS_IMPL" ] + deps = [ + "//base", + "//chromeos/dbus:cicerone_proto", + "//chromeos/dbus:common", + "//dbus", + ] + + sources = [ + "cicerone_client.cc", + "cicerone_client.h", + "fake_cicerone_client.cc", + "fake_cicerone_client.h", + ] +}
diff --git a/chromeos/dbus/cicerone_client.cc b/chromeos/dbus/cicerone/cicerone_client.cc similarity index 99% rename from chromeos/dbus/cicerone_client.cc rename to chromeos/dbus/cicerone/cicerone_client.cc index c341f6c..b4921a0 100644 --- a/chromeos/dbus/cicerone_client.cc +++ b/chromeos/dbus/cicerone/cicerone_client.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" #include <string> #include <utility>
diff --git a/chromeos/dbus/cicerone_client.h b/chromeos/dbus/cicerone/cicerone_client.h similarity index 98% rename from chromeos/dbus/cicerone_client.h rename to chromeos/dbus/cicerone/cicerone_client.h index 09cc9c9..e86a375 100644 --- a/chromeos/dbus/cicerone_client.h +++ b/chromeos/dbus/cicerone/cicerone_client.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_DBUS_CICERONE_CLIENT_H_ -#define CHROMEOS_DBUS_CICERONE_CLIENT_H_ +#ifndef CHROMEOS_DBUS_CICERONE_CICERONE_CLIENT_H_ +#define CHROMEOS_DBUS_CICERONE_CICERONE_CLIENT_H_ #include <memory> @@ -359,4 +359,4 @@ } // namespace chromeos -#endif // CHROMEOS_DBUS_CICERONE_CLIENT_H_ +#endif // CHROMEOS_DBUS_CICERONE_CICERONE_CLIENT_H_
diff --git a/chromeos/dbus/fake_cicerone_client.cc b/chromeos/dbus/cicerone/fake_cicerone_client.cc similarity index 99% rename from chromeos/dbus/fake_cicerone_client.cc rename to chromeos/dbus/cicerone/fake_cicerone_client.cc index dca5df5..14baaca 100644 --- a/chromeos/dbus/fake_cicerone_client.cc +++ b/chromeos/dbus/cicerone/fake_cicerone_client.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/dbus/fake_cicerone_client.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include <utility>
diff --git a/chromeos/dbus/fake_cicerone_client.h b/chromeos/dbus/cicerone/fake_cicerone_client.h similarity index 98% rename from chromeos/dbus/fake_cicerone_client.h rename to chromeos/dbus/cicerone/fake_cicerone_client.h index 1346d58..a07b316 100644 --- a/chromeos/dbus/fake_cicerone_client.h +++ b/chromeos/dbus/cicerone/fake_cicerone_client.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_DBUS_FAKE_CICERONE_CLIENT_H_ -#define CHROMEOS_DBUS_FAKE_CICERONE_CLIENT_H_ +#ifndef CHROMEOS_DBUS_CICERONE_FAKE_CICERONE_CLIENT_H_ +#define CHROMEOS_DBUS_CICERONE_FAKE_CICERONE_CLIENT_H_ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/time/time.h" -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" namespace chromeos { @@ -480,4 +480,4 @@ } // namespace chromeos -#endif // CHROMEOS_DBUS_FAKE_CICERONE_CLIENT_H_ +#endif // CHROMEOS_DBUS_CICERONE_FAKE_CICERONE_CLIENT_H_
diff --git a/chromeos/dbus/dbus_clients_browser.cc b/chromeos/dbus/dbus_clients_browser.cc index 01dd8e8..84deb1a6 100644 --- a/chromeos/dbus/dbus_clients_browser.cc +++ b/chromeos/dbus/dbus_clients_browser.cc
@@ -18,7 +18,8 @@ #include "chromeos/dbus/arc/fake_arc_obb_mounter_client.h" #include "chromeos/dbus/cec_service_client.h" #include "chromeos/dbus/chunneld_client.h" -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/concierge_client.h" #include "chromeos/dbus/cros_disks_client.h" #include "chromeos/dbus/dbus_client_implementation_type.h" @@ -29,7 +30,6 @@ #include "chromeos/dbus/fake_anomaly_detector_client.h" #include "chromeos/dbus/fake_cec_service_client.h" #include "chromeos/dbus/fake_chunneld_client.h" -#include "chromeos/dbus/fake_cicerone_client.h" #include "chromeos/dbus/fake_concierge_client.h" #include "chromeos/dbus/fake_cros_disks_client.h" #include "chromeos/dbus/fake_easy_unlock_client.h"
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc index ef7f035..bed50f0 100644 --- a/chromeos/dbus/dbus_thread_manager.cc +++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -20,7 +20,7 @@ #include "chromeos/dbus/arc/arc_obb_mounter_client.h" #include "chromeos/dbus/cec_service_client.h" #include "chromeos/dbus/chunneld_client.h" -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" #include "chromeos/dbus/concierge_client.h" #include "chromeos/dbus/constants/dbus_switches.h" #include "chromeos/dbus/cros_disks_client.h"
diff --git a/chromeos/dbus/fake_concierge_client.cc b/chromeos/dbus/fake_concierge_client.cc index a531c95b..58d7bc8 100644 --- a/chromeos/dbus/fake_concierge_client.cc +++ b/chromeos/dbus/fake_concierge_client.cc
@@ -8,8 +8,8 @@ #include "base/bind.h" #include "base/threading/thread_task_runner_handle.h" +#include "chromeos/dbus/cicerone/fake_cicerone_client.h" #include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/fake_cicerone_client.h" namespace chromeos {
diff --git a/chromeos/dbus/fake_concierge_client.h b/chromeos/dbus/fake_concierge_client.h index ca0dd30..63ffacf7 100644 --- a/chromeos/dbus/fake_concierge_client.h +++ b/chromeos/dbus/fake_concierge_client.h
@@ -11,7 +11,7 @@ #include "base/observer_list.h" #include "base/optional.h" #include "base/time/time.h" -#include "chromeos/dbus/cicerone_client.h" +#include "chromeos/dbus/cicerone/cicerone_client.h" #include "chromeos/dbus/concierge_client.h" namespace chromeos {
diff --git a/chromeos/dbus/hermes/hermes_response_status.h b/chromeos/dbus/hermes/hermes_response_status.h index 319c787..89fd7e4db 100644 --- a/chromeos/dbus/hermes/hermes_response_status.h +++ b/chromeos/dbus/hermes/hermes_response_status.h
@@ -12,21 +12,24 @@ namespace chromeos { // Enum values the represent response status of hermes client method calls. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. enum class HermesResponseStatus { - kSuccess, - kErrorAlreadyDisabled, - kErrorAlreadyEnabled, - kErrorInvalidActivationCode, - kErrorInvalidIccid, - kErrorInvalidParameter, - kErrorNeedConfirmationCode, - kErrorSendNotificationFailure, - kErrorTestProfileInProd, - kErrorUnknown, - kErrorUnsupported, - kErrorWrongState, - kErrorInvalidResponse, - kErrorNoResponse, + kSuccess = 0, + kErrorAlreadyDisabled = 1, + kErrorAlreadyEnabled = 2, + kErrorInvalidActivationCode = 3, + kErrorInvalidIccid = 4, + kErrorInvalidParameter = 5, + kErrorNeedConfirmationCode = 6, + kErrorSendNotificationFailure = 7, + kErrorTestProfileInProd = 8, + kErrorUnknown = 9, + kErrorUnsupported = 10, + kErrorWrongState = 11, + kErrorInvalidResponse = 12, + kErrorNoResponse = 13, + kMaxValue = kErrorNoResponse }; // Callback that receives only a HermesResponseStatus.
diff --git a/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc b/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc index 82e0a94..e2706bc 100644 --- a/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc +++ b/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc
@@ -11,13 +11,13 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/files/scoped_file.h" #include "base/location.h" #include "base/logging.h" #include "base/optional.h" #include "base/sequence_checker.h" -#include "base/stl_util.h" #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/chromeos/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/dbus/userdataauth/fake_userdataauth_client.cc index c89df3cc..24e7acf5 100644 --- a/chromeos/dbus/userdataauth/fake_userdataauth_client.cc +++ b/chromeos/dbus/userdataauth/fake_userdataauth_client.cc
@@ -6,9 +6,9 @@ #include <utility> +#include "base/containers/contains.h" #include "base/location.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/chromeos/lacros/lacros_chrome_service_impl.h b/chromeos/lacros/lacros_chrome_service_impl.h index d6fcec9b..8289b725 100644 --- a/chromeos/lacros/lacros_chrome_service_impl.h +++ b/chromeos/lacros/lacros_chrome_service_impl.h
@@ -13,13 +13,13 @@ #include "base/check.h" #include "base/component_export.h" +#include "base/containers/contains.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list_threadsafe.h" #include "base/optional.h" #include "base/sequence_checker.h" #include "base/sequenced_task_runner.h" -#include "base/stl_util.h" #include "base/token.h" #include "chromeos/components/sensors/mojom/cros_sensor_service.mojom.h" #include "chromeos/crosapi/mojom/account_manager.mojom.h"
diff --git a/chromeos/services/cellular_setup/BUILD.gn b/chromeos/services/cellular_setup/BUILD.gn index e55d02c86..bf7ce6d9 100644 --- a/chromeos/services/cellular_setup/BUILD.gn +++ b/chromeos/services/cellular_setup/BUILD.gn
@@ -36,6 +36,8 @@ "esim_profile.h", "euicc.cc", "euicc.h", + "metrics_util.cc", + "metrics_util.h", ] deps = [
diff --git a/chromeos/services/cellular_setup/esim_profile.cc b/chromeos/services/cellular_setup/esim_profile.cc index fb7ac1a..5d4d182 100644 --- a/chromeos/services/cellular_setup/esim_profile.cc +++ b/chromeos/services/cellular_setup/esim_profile.cc
@@ -21,6 +21,7 @@ #include "chromeos/services/cellular_setup/esim_manager.h" #include "chromeos/services/cellular_setup/esim_mojo_utils.h" #include "chromeos/services/cellular_setup/euicc.h" +#include "chromeos/services/cellular_setup/metrics_util.h" #include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" #include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom.h" #include "components/device_event_log/device_event_log.h" @@ -369,6 +370,8 @@ void ESimProfile::OnPendingProfileInstallResult( std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock, HermesResponseStatus status) { + metrics::LogInstallPendingProfileResult(status); + if (status != HermesResponseStatus::kSuccess) { NET_LOG(ERROR) << "Error Installing pending profile status=" << static_cast<int>(status);
diff --git a/chromeos/services/cellular_setup/esim_profile_unittest.cc b/chromeos/services/cellular_setup/esim_profile_unittest.cc index a0dc0184..ec8c2656 100644 --- a/chromeos/services/cellular_setup/esim_profile_unittest.cc +++ b/chromeos/services/cellular_setup/esim_profile_unittest.cc
@@ -24,6 +24,10 @@ "Network.Cellular.ESim.ProfileUninstallationResult"; const char kProfileRenameResultHistogram[] = "Network.Cellular.ESim.ProfileRenameResult"; +const char kPendingProfileLatencyHistogram[] = + "Network.Cellular.ESim.ProfileDownload.PendingProfile.Latency"; +const char kPendingProfileInstallHistogram[] = + "Network.Cellular.ESim.InstallPendingProfile.Result"; mojom::ESimOperationResult UninstallProfile( const mojo::Remote<mojom::ESimProfile>& esim_profile) { @@ -191,6 +195,8 @@ } TEST_F(ESimProfileTest, InstallProfile) { + base::HistogramTester histogram_tester; + HermesEuiccClient::TestInterface* euicc_test = HermesEuiccClient::Get()->GetTestInterface(); dbus::ObjectPath profile_path = euicc_test->AddFakeCarrierProfile( @@ -213,9 +219,11 @@ EXPECT_EQ(mojom::ProfileInstallResult::kErrorNeedsConfirmationCode, install_result); - base::HistogramTester histogram_tester; - histogram_tester.ExpectTotalCount( - "Network.Cellular.ESim.ProfileDownload.PendingProfile.Latency", 0); + histogram_tester.ExpectTotalCount(kPendingProfileLatencyHistogram, 0); + histogram_tester.ExpectBucketCount( + kPendingProfileInstallHistogram, + HermesResponseStatus::kErrorNeedConfirmationCode, + /*expected_count=*/1); // Verify that installing pending profile returns proper results // and updates esim_profile properties. @@ -230,8 +238,10 @@ EXPECT_NE(mojo_properties->state, mojom::ProfileState::kPending); EXPECT_EQ(1u, observer()->profile_list_change_calls().size()); - histogram_tester.ExpectTotalCount( - "Network.Cellular.ESim.ProfileDownload.PendingProfile.Latency", 1); + histogram_tester.ExpectTotalCount(kPendingProfileLatencyHistogram, 1); + histogram_tester.ExpectBucketCount(kPendingProfileInstallHistogram, + HermesResponseStatus::kSuccess, + /*expected_count=*/1); } TEST_F(ESimProfileTest, InstallProfileAlreadyConnected) {
diff --git a/chromeos/services/cellular_setup/euicc.cc b/chromeos/services/cellular_setup/euicc.cc index 2853f24f..829f7d65 100644 --- a/chromeos/services/cellular_setup/euicc.cc +++ b/chromeos/services/cellular_setup/euicc.cc
@@ -20,6 +20,7 @@ #include "chromeos/services/cellular_setup/esim_manager.h" #include "chromeos/services/cellular_setup/esim_mojo_utils.h" #include "chromeos/services/cellular_setup/esim_profile.h" +#include "chromeos/services/cellular_setup/metrics_util.h" #include "chromeos/services/cellular_setup/public/mojom/esim_manager.mojom-shared.h" #include "components/device_event_log/device_event_log.h" #include "components/qr_code_generator/qr_code_generator.h" @@ -255,6 +256,8 @@ std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock, HermesResponseStatus status, const dbus::ObjectPath* profile_path) { + metrics::LogInstallViaQrCodeResult(status); + if (status != HermesResponseStatus::kSuccess) { NET_LOG(ERROR) << "Error Installing profile status=" << static_cast<int>(status);
diff --git a/chromeos/services/cellular_setup/euicc_unittest.cc b/chromeos/services/cellular_setup/euicc_unittest.cc index 3828411..d574fd9 100644 --- a/chromeos/services/cellular_setup/euicc_unittest.cc +++ b/chromeos/services/cellular_setup/euicc_unittest.cc
@@ -21,6 +21,9 @@ namespace { +const char kInstallViaQrCodeHistogram[] = + "Network.Cellular.ESim.InstallViaQrCode.Result"; + using InstallResultPair = std::pair<mojom::ProfileInstallResult, mojo::PendingRemote<mojom::ESimProfile>>; @@ -130,6 +133,8 @@ } TEST_F(EuiccTest, InstallProfileFromActivationCode) { + base::HistogramTester histogram_tester; + mojo::Remote<mojom::Euicc> euicc = GetEuiccForEid(ESimTestBase::kTestEid); ASSERT_TRUE(euicc.is_bound()); @@ -145,6 +150,10 @@ EXPECT_EQ(mojom::ProfileInstallResult::kErrorInvalidActivationCode, result_pair.first); EXPECT_FALSE(result_pair.second.is_valid()); + histogram_tester.ExpectBucketCount( + kInstallViaQrCodeHistogram, + HermesResponseStatus::kErrorInvalidActivationCode, + /*expected_count=*/1); // Verify that connect failures are handled properly. result_pair = InstallProfileFromActivationCode( @@ -153,8 +162,9 @@ /*fail_connect=*/true); EXPECT_EQ(mojom::ProfileInstallResult::kSuccess, result_pair.first); ASSERT_TRUE(result_pair.second.is_valid()); - - base::HistogramTester histogram_tester; + histogram_tester.ExpectBucketCount(kInstallViaQrCodeHistogram, + HermesResponseStatus::kSuccess, + /*expected_count=*/1); // Verify that install succeeds when valid activation code is passed. result_pair = InstallProfileFromActivationCode( @@ -165,7 +175,10 @@ ASSERT_TRUE(result_pair.second.is_valid()); histogram_tester.ExpectTotalCount( - "Network.Cellular.ESim.ProfileDownload.ActivationCode.Latency", 1); + "Network.Cellular.ESim.ProfileDownload.ActivationCode.Latency", 2); + histogram_tester.ExpectBucketCount(kInstallViaQrCodeHistogram, + HermesResponseStatus::kSuccess, + /*expected_count=*/2); } TEST_F(EuiccTest, InstallProfileAlreadyConnected) {
diff --git a/chromeos/services/cellular_setup/metrics_util.cc b/chromeos/services/cellular_setup/metrics_util.cc new file mode 100644 index 0000000..38834703 --- /dev/null +++ b/chromeos/services/cellular_setup/metrics_util.cc
@@ -0,0 +1,25 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/cellular_setup/metrics_util.h" + +#include "base/metrics/histogram_functions.h" + +namespace chromeos { +namespace cellular_setup { +namespace metrics { + +void LogInstallViaQrCodeResult(HermesResponseStatus status) { + base::UmaHistogramEnumeration("Network.Cellular.ESim.InstallViaQrCode.Result", + status); +} + +void LogInstallPendingProfileResult(HermesResponseStatus status) { + base::UmaHistogramEnumeration( + "Network.Cellular.ESim.InstallPendingProfile.Result", status); +} + +} // namespace metrics +} // namespace cellular_setup +} // namespace chromeos
diff --git a/chromeos/services/cellular_setup/metrics_util.h b/chromeos/services/cellular_setup/metrics_util.h new file mode 100644 index 0000000..1a9a1e4 --- /dev/null +++ b/chromeos/services/cellular_setup/metrics_util.h
@@ -0,0 +1,21 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_CELLULAR_SETUP_METRICS_UTIL_H_ +#define CHROMEOS_SERVICES_CELLULAR_SETUP_METRICS_UTIL_H_ + +#include "chromeos/dbus/hermes/hermes_response_status.h" + +namespace chromeos { +namespace cellular_setup { +namespace metrics { + +void LogInstallViaQrCodeResult(HermesResponseStatus status); +void LogInstallPendingProfileResult(HermesResponseStatus status); + +} // namespace metrics +} // namespace cellular_setup +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_CELLULAR_SETUP_METRICS_UTIL_H_
diff --git a/chromeos/services/machine_learning/public/cpp/service_connection_unittest.cc b/chromeos/services/machine_learning/public/cpp/service_connection_unittest.cc index 135dd5b..1e67282 100644 --- a/chromeos/services/machine_learning/public/cpp/service_connection_unittest.cc +++ b/chromeos/services/machine_learning/public/cpp/service_connection_unittest.cc
@@ -176,10 +176,15 @@ &fake_service_connection); ServiceConnection::GetInstance()->Initialize(); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); mojo::Remote<mojom::MachineLearningService> ml_service; - ServiceConnection::GetInstance()->BindMachineLearningService( - ml_service.BindNewPipeAndPassReceiver()); - base::RunLoop().RunUntilIdle(); + base::OnceClosure callback = + base::BindOnce(&ServiceConnection::BindMachineLearningService, + base::Unretained(ServiceConnection::GetInstance()), + ml_service.BindNewPipeAndPassReceiver()) + .Then(run_loop->QuitClosure()); + std::move(callback).Run(); + run_loop->Run(); ASSERT_TRUE(ml_service.is_bound()); // Check the bound ml_service remote can be used to call @@ -187,6 +192,7 @@ mojo::Remote<mojom::Model> model; bool callback_done = false; + run_loop.reset(new base::RunLoop); ml_service->LoadBuiltinModel( mojom::BuiltinModelSpec::New(mojom::BuiltinModelId::TEST_MODEL), model.BindNewPipeAndPassReceiver(), @@ -195,8 +201,10 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + + run_loop->Run(); EXPECT_TRUE(callback_done); EXPECT_TRUE(model.is_bound()); } @@ -248,6 +256,7 @@ const double expected_value = 200.002; fake_service_connection.SetOutputValue(std::vector<int64_t>{1L}, std::vector<double>{expected_value}); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadBuiltinModel( @@ -258,13 +267,15 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(model.is_bound()); callback_done = false; mojo::Remote<mojom::GraphExecutor> graph; + run_loop.reset(new base::RunLoop); model->CreateGraphExecutor( graph.BindNewPipeAndPassReceiver(), base::BindOnce( @@ -272,14 +283,16 @@ EXPECT_EQ(result, mojom::CreateGraphExecutorResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(graph.is_bound()); callback_done = false; base::flat_map<std::string, mojom::TensorPtr> inputs; std::vector<std::string> outputs; + run_loop.reset(new base::RunLoop); graph->Execute(std::move(inputs), std::move(outputs), base::BindOnce( [](bool* callback_done, double expected_value, @@ -294,9 +307,10 @@ *callback_done = true; }, - &callback_done, expected_value)); + &callback_done, expected_value) + .Then(run_loop->QuitClosure())); - base::RunLoop().RunUntilIdle(); + run_loop->Run(); ASSERT_TRUE(callback_done); } @@ -313,6 +327,7 @@ fake_service_connection.SetOutputValue(std::vector<int64_t>{1L}, std::vector<double>{expected_value}); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadFlatBufferModel( @@ -322,13 +337,15 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(model.is_bound()); callback_done = false; mojo::Remote<mojom::GraphExecutor> graph; + run_loop.reset(new base::RunLoop); model->CreateGraphExecutor( graph.BindNewPipeAndPassReceiver(), base::BindOnce( @@ -336,14 +353,16 @@ EXPECT_EQ(result, mojom::CreateGraphExecutorResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(graph.is_bound()); callback_done = false; base::flat_map<std::string, mojom::TensorPtr> inputs; std::vector<std::string> outputs; + run_loop.reset(new base::RunLoop); graph->Execute(std::move(inputs), std::move(outputs), base::BindOnce( [](bool* callback_done, double expected_value, @@ -358,9 +377,9 @@ *callback_done = true; }, - &callback_done, expected_value)); - - base::RunLoop().RunUntilIdle(); + &callback_done, expected_value) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); } @@ -388,6 +407,7 @@ annotations.emplace_back(std::move(dummy_annotation)); fake_service_connection.SetOutputAnnotation(annotations); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadTextClassifier( @@ -397,13 +417,15 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(text_classifier.is_bound()); auto request = mojom::TextAnnotationRequest::New(); bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); text_classifier->Annotate( std::move(request), base::BindOnce( @@ -418,8 +440,9 @@ EXPECT_EQ(annotations[0]->entities[0]->data->get_numeric_value(), 123456789.); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); } @@ -438,6 +461,7 @@ span->end_offset = 2; fake_service_connection.SetOutputSelection(span); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadTextClassifier( @@ -447,14 +471,16 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(text_classifier.is_bound()); auto request = mojom::TextSuggestSelectionRequest::New(); request->user_selection = mojom::CodepointSpan::New(); bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); text_classifier->SuggestSelection( std::move(request), base::BindOnce( [](bool* infer_callback_done, @@ -464,8 +490,9 @@ EXPECT_EQ(suggested_span->start_offset, 1u); EXPECT_EQ(suggested_span->end_offset, 2u); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); } @@ -484,6 +511,7 @@ languages.emplace_back(mojom::TextLanguage::New("fr", 0.1)); fake_service_connection.SetOutputLanguages(languages); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadTextClassifier( @@ -493,13 +521,15 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(text_classifier.is_bound()); std::string input_text = "dummy input text"; bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); text_classifier->FindLanguages( input_text, base::BindOnce( [](bool* infer_callback_done, @@ -512,8 +542,9 @@ EXPECT_EQ(languages[1]->locale, "fr"); EXPECT_EQ(languages[1]->confidence, 0.1f); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); } @@ -526,6 +557,7 @@ &fake_service_connection); ServiceConnection::GetInstance()->Initialize(); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadHandwritingModel( @@ -537,8 +569,9 @@ EXPECT_EQ(result, mojom::LoadHandwritingModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(recognizer.is_bound()); @@ -555,6 +588,7 @@ auto query = mojom::HandwritingRecognitionQuery::New(); bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); recognizer->Recognize( std::move(query), base::BindOnce( @@ -567,8 +601,9 @@ EXPECT_EQ(result->candidates.at(0)->text, "cat"); EXPECT_EQ(result->candidates.at(0)->score, 0.5f); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); } @@ -582,6 +617,7 @@ &fake_service_connection); ServiceConnection::GetInstance()->Initialize(); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadHandwritingModelWithSpec( @@ -592,8 +628,9 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(recognizer.is_bound()); @@ -610,6 +647,7 @@ auto query = mojom::HandwritingRecognitionQuery::New(); bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); recognizer->Recognize( std::move(query), base::BindOnce( @@ -622,8 +660,9 @@ EXPECT_EQ(result->candidates.at(0)->text, "cat"); EXPECT_EQ(result->candidates.at(0)->score, 0.5f); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); } @@ -637,6 +676,7 @@ ServiceConnection::GetInstance()->Initialize(); auto constraint = web_platform::mojom::HandwritingModelConstraint::New(); constraint->languages.emplace_back("en"); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadWebPlatformHandwritingModel( @@ -647,8 +687,9 @@ EXPECT_EQ(result, mojom::LoadHandwritingModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(recognizer.is_bound()); @@ -663,6 +704,7 @@ std::vector<web_platform::mojom::HandwritingStrokePtr> strokes; auto hints = web_platform::mojom::HandwritingHints::New(); bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); recognizer->GetPrediction( std::move(strokes), std::move(hints), base::BindOnce( @@ -673,8 +715,9 @@ ASSERT_TRUE(predictions.has_value()); ASSERT_EQ(predictions.value().size(), 1u); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); } @@ -686,6 +729,7 @@ &fake_service_connection); ServiceConnection::GetInstance()->Initialize(); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadGrammarChecker( @@ -695,8 +739,9 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(checker.is_bound()); @@ -718,6 +763,7 @@ auto query = mojom::GrammarCheckerQuery::New(); bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); checker->Check( std::move(query), base::BindOnce( @@ -735,8 +781,9 @@ EXPECT_EQ(result->candidates.at(0)->fragments.at(0)->replacement, "dog"); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); } @@ -748,6 +795,7 @@ &fake_service_connection); ServiceConnection::GetInstance()->Initialize(); + std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ServiceConnection::GetInstance() ->GetMachineLearningService() .LoadTextSuggester( @@ -757,8 +805,9 @@ EXPECT_EQ(result, mojom::LoadModelResult::OK); *callback_done = true; }, - &callback_done)); - base::RunLoop().RunUntilIdle(); + &callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(callback_done); ASSERT_TRUE(suggester.is_bound()); @@ -779,6 +828,7 @@ auto query = mojom::TextSuggesterQuery::New(); bool infer_callback_done = false; + run_loop.reset(new base::RunLoop); suggester->Suggest( std::move(query), base::BindOnce( @@ -794,8 +844,9 @@ result->candidates.at(0)->get_multi_word()->normalized_score, 0.5f); }, - &infer_callback_done)); - base::RunLoop().RunUntilIdle(); + &infer_callback_done) + .Then(run_loop->QuitClosure())); + run_loop->Run(); ASSERT_TRUE(infer_callback_done); }
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc index 7f847f3..39915c1 100644 --- a/chromeos/services/network_config/cros_network_config.cc +++ b/chromeos/services/network_config/cros_network_config.cc
@@ -1991,12 +1991,6 @@ return; } - // If network is not known by Shill, there are no properties to fetch. - if (network->IsNonProfileType()) { - std::move(callback).Run(nullptr); - return; - } - network_configuration_handler_->GetManagedProperties( chromeos::LoginState::Get()->primary_user_hash(), network->path(), base::BindOnce(&CrosNetworkConfig::OnGetManagedProperties,
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc index 4f82297..1183e6d 100644 --- a/chromeos/services/network_config/cros_network_config_unittest.cc +++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -15,7 +15,6 @@ #include "chromeos/dbus/shill/fake_shill_device_client.h" #include "chromeos/login/login_state/login_state.h" #include "chromeos/network/cellular_inhibitor.h" -#include "chromeos/network/fake_stub_cellular_networks_provider.h" #include "chromeos/network/managed_network_configuration_handler.h" #include "chromeos/network/network_cert_loader.h" #include "chromeos/network/network_certificate_handler.h" @@ -72,8 +71,6 @@ const char kCellularTestApnPassword3[] = "Test Pass"; const char kCellularTestApnAttach3[] = "attach"; -const char kStubCellularIccid[] = "test_iccid"; - } // namespace class CrosNetworkConfigTest : public testing::Test { @@ -129,8 +126,6 @@ cellular_inhibitor_.get(), cellular_esim_profile_handler_.get(), managed_network_configuration_handler_.get(), network_connection_handler_.get(), network_certificate_handler_.get()); - helper_.network_state_handler()->set_stub_cellular_networks_provider( - &fake_stub_cellular_networks_provider_); SetupPolicy(); SetupNetworks(); } @@ -295,24 +290,6 @@ base::RunLoop().RunUntilIdle(); } - mojom::NetworkStatePropertiesPtr SetupStubCellularNetwork() { - fake_stub_cellular_networks_provider_.AddStub(kStubCellularIccid); - helper().network_state_handler()->SyncStubCellularNetworks(); - - mojom::NetworkFilterPtr filter = mojom::NetworkFilter::New(); - filter->filter = mojom::FilterType::kAll; - filter->network_type = mojom::NetworkType::kCellular; - filter->limit = mojom::kNoLimit; - std::vector<mojom::NetworkStatePropertiesPtr> networks = - GetNetworkStateList(std::move(filter)); - for (auto& network : networks) { - if (network->type_state->get_cellular()->iccid == kStubCellularIccid) { - return std::move(network); - } - } - return nullptr; - } - void SetupObserver() { observer_ = std::make_unique<CrosNetworkConfigTestObserver>(); cros_network_config_->AddObserver(observer_->GenerateRemote()); @@ -618,7 +595,6 @@ TestingPrefServiceSimple local_state_; std::unique_ptr<CrosNetworkConfig> cros_network_config_; std::unique_ptr<CrosNetworkConfigTestObserver> observer_; - FakeStubCellularNetworksProvider fake_stub_cellular_networks_provider_; std::string wifi1_path_; DISALLOW_COPY_AND_ASSIGN(CrosNetworkConfigTest); @@ -1006,12 +982,6 @@ EXPECT_TRUE(cellular->sim_locked); EXPECT_EQ(mojom::ActivationStateType::kActivated, cellular->activation_state); - mojom::NetworkStatePropertiesPtr stub_cellular = SetupStubCellularNetwork(); - ASSERT_TRUE(stub_cellular); - ASSERT_FALSE(stub_cellular->guid.empty()); - properties = GetManagedProperties(stub_cellular->guid); - ASSERT_FALSE(properties); - properties = GetManagedProperties("vpn_guid"); ASSERT_TRUE(properties); EXPECT_EQ("vpn_guid", properties->guid);
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.cc b/components/arc/intent_helper/arc_intent_helper_bridge.cc index ccf95fb..1598d1e1 100644 --- a/components/arc/intent_helper/arc_intent_helper_bridge.cc +++ b/components/arc/intent_helper/arc_intent_helper_bridge.cc
@@ -97,7 +97,7 @@ } // static -KeyedServiceBaseFactory* ArcIntentHelperBridge::GetFactory() { +BrowserContextKeyedServiceFactory* ArcIntentHelperBridge::GetFactory() { return ArcIntentHelperBridgeFactory::GetInstance(); }
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.h b/components/arc/intent_helper/arc_intent_helper_bridge.h index 0075833..4f64c34 100644 --- a/components/arc/intent_helper/arc_intent_helper_bridge.h +++ b/components/arc/intent_helper/arc_intent_helper_bridge.h
@@ -21,7 +21,7 @@ #include "components/keyed_service/core/keyed_service.h" #include "url/gurl.h" -class KeyedServiceBaseFactory; +class BrowserContextKeyedServiceFactory; namespace content { class BrowserContext; @@ -55,7 +55,7 @@ content::BrowserContext* context); // Returns factory for the ArcIntentHelperBridge. - static KeyedServiceBaseFactory* GetFactory(); + static BrowserContextKeyedServiceFactory* GetFactory(); // Appends '.' + |to_append| to the intent helper package name. static std::string AppendStringToIntentHelperPackageName(
diff --git a/components/arc/session/OWNERS b/components/arc/session/OWNERS index 868d420..eb39984 100644 --- a/components/arc/session/OWNERS +++ b/components/arc/session/OWNERS
@@ -1,4 +1,3 @@ -ereth@chromium.org lgcheng@google.com # backup reviewers hashimoto@chromium.org
diff --git a/components/autofill/android/provider/java/src/org/chromium/components/autofill/AutofillProvider.java b/components/autofill/android/provider/java/src/org/chromium/components/autofill/AutofillProvider.java index 068411d..926b12fa 100644 --- a/components/autofill/android/provider/java/src/org/chromium/components/autofill/AutofillProvider.java +++ b/components/autofill/android/provider/java/src/org/chromium/components/autofill/AutofillProvider.java
@@ -430,6 +430,11 @@ sAutofillManagerForTestingFactory = factory; } + @VisibleForTesting(otherwise = VisibleForTesting.NONE) + public void replaceAutofillManagerWrapperForTesting(AutofillManagerWrapper wrapper) { + mAutofillManager = wrapper; + } + /** * Invoked when filling form is need. AutofillProvider shall ask autofill * service for the values with which to fill the form.
diff --git a/components/autofill/core/browser/autofill_profile_sync_util.cc b/components/autofill/core/browser/autofill_profile_sync_util.cc index 2d5178a..db5b7be 100644 --- a/components/autofill/core/browser/autofill_profile_sync_util.cc +++ b/components/autofill/core/browser/autofill_profile_sync_util.cc
@@ -97,6 +97,8 @@ if (!entry.profile_label().empty()) specifics->set_profile_label(entry.profile_label()); + specifics->set_disallow_settings_visible_updates( + entry.disallow_settings_visible_updates()); specifics->set_use_count(entry.use_count()); specifics->set_use_date(entry.use_date().ToTimeT()); specifics->set_address_home_language_code( @@ -260,6 +262,11 @@ if (specifics.has_profile_label()) profile->set_profile_label(specifics.profile_label()); + // Set the `disallow_settings_visible_updates state` if it exists. + if (specifics.has_disallow_settings_visible_updates()) + profile->set_disallow_settings_visible_updates( + specifics.disallow_settings_visible_updates()); + // Set repeated fields. profile->SetRawInfoWithVerificationStatus( NAME_HONORIFIC_PREFIX,
diff --git a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc index 44d05075..166a529b 100644 --- a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc +++ b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc
@@ -43,6 +43,7 @@ profile.set_use_date(base::Time::FromTimeT(1423182152)); profile.set_profile_label("profile_label"); + profile.set_disallow_settings_visible_updates(true); // Set testing values and statuses for the name. profile.SetRawInfoWithVerificationStatus(NAME_HONORIFIC_PREFIX, u"Dr.", @@ -137,6 +138,7 @@ specifics.set_use_count(7); specifics.set_use_date(1423182152); specifics.set_profile_label("profile_label"); + specifics.set_disallow_settings_visible_updates(true); // Set values and statuses for the names. specifics.add_name_honorific("Dr.");
diff --git a/components/autofill/core/browser/data_model/autofill_profile.cc b/components/autofill/core/browser/data_model/autofill_profile.cc index f57a93e..1b20f06 100644 --- a/components/autofill/core/browser/data_model/autofill_profile.cc +++ b/components/autofill/core/browser/data_model/autofill_profile.cc
@@ -269,6 +269,8 @@ if (this == &profile) return *this; + set_disallow_settings_visible_updates( + profile.disallow_settings_visible_updates()); set_use_count(profile.use_count()); set_use_date(profile.use_date()); set_previous_use_date(profile.previous_use_date()); @@ -1316,6 +1318,8 @@ bool AutofillProfile::EqualsSansGuid(const AutofillProfile& profile) const { return origin() == profile.origin() && + disallow_settings_visible_updates() == + profile.disallow_settings_visible_updates() && language_code() == profile.language_code() && profile_label() == profile.profile_label() && Compare(profile) == 0; }
diff --git a/components/autofill/core/browser/data_model/autofill_profile.h b/components/autofill/core/browser/data_model/autofill_profile.h index 80443fc..70a059f 100644 --- a/components/autofill/core/browser/data_model/autofill_profile.h +++ b/components/autofill/core/browser/data_model/autofill_profile.h
@@ -305,6 +305,13 @@ // Sets the label of the profile. void set_profile_label(const std::string& label) { profile_label_ = label; } + bool disallow_settings_visible_updates() const { + return disallow_settings_visible_updates_; + } + void set_disallow_settings_visible_updates(bool disallow) { + disallow_settings_visible_updates_ = disallow; + } + private: // FormGroup: std::u16string GetInfoImpl(const AutofillType& type, @@ -361,6 +368,12 @@ // The BCP 47 language code that can be used to format |address_| for display. std::string language_code_; + // The state indicates if the profile qualifies to get merged with a + // profile observed in a form submission. If true, the profile can still be + // updated silently, but it should not be considered for merges that need to + // involve user interactions. + bool disallow_settings_visible_updates_{false}; + // ID used for identifying this profile. Only set for SERVER_PROFILEs. This is // a hash of the contents. std::string server_id_;
diff --git a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc index 86dd3c6..0eb5a4bd 100644 --- a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc +++ b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
@@ -2109,6 +2109,35 @@ EXPECT_NE(p1, p2); } +// Test that the state to disallow confirmable merges is correctly set and +// retrieved from the profile. +TEST_P(AutofillProfileTest, SetAndGetProfileDisallowConfirmableMergestate) { + AutofillProfile p; + EXPECT_EQ(p.disallow_settings_visible_updates(), false); + + p.set_disallow_settings_visible_updates(true); + EXPECT_EQ(p.disallow_settings_visible_updates(), true); +} + +TEST_P(AutofillProfileTest, LockStateInAssignmentAndComparisonOperator) { + AutofillProfile p1; + p1.set_disallow_settings_visible_updates(true); + + AutofillProfile p2; + EXPECT_EQ(p2.disallow_settings_visible_updates(), false); + + p2 = p1; + + // Check that the lock state was assigned correctly to p2. + EXPECT_EQ(p2.disallow_settings_visible_updates(), true); + + // Now test that the comparison returns false if the lock state is not the + // same. + ASSERT_EQ(p1, p2); + p2.set_disallow_settings_visible_updates(false); + EXPECT_NE(p1, p2); +} + TEST_P(AutofillProfileTest, SetClientValidityFromBitfieldValue_Email) { AutofillProfile profile;
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index 376366b..2c0895b 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -105,6 +105,7 @@ s->BindInt64(index++, profile.GetClientValidityBitfieldValue()); s->BindBool(index++, profile.is_client_validity_states_updated()); s->BindString(index++, profile.profile_label()); + s->BindBool(index++, profile.disallow_settings_visible_updates()); } void AddAutofillProfileDetailsFromStatement(const sql::Statement& s, @@ -127,6 +128,7 @@ profile->SetClientValidityFromBitfieldValue(s.ColumnInt64(index++)); profile->set_is_client_validity_states_updated(s.ColumnBool(index++)); profile->set_profile_label(s.ColumnString(index++)); + profile->set_disallow_settings_visible_updates(s.ColumnBool(index++)); } void BindEncryptedCardToColumn(sql::Statement* s, @@ -799,6 +801,8 @@ case 95: *update_compatible_version = false; return MigrateToVersion95AddVirtualCardMetadata(); + case 96: + return MigrateToVersion96AddAutofillProfileDisallowConfirmableMergesColumn(); } return true; } @@ -1141,8 +1145,9 @@ "(guid, company_name, street_address, dependent_locality, city, state," " zipcode, sorting_code, country_code, use_count, use_date, " " date_modified, origin, language_code, validity_bitfield, " - " is_client_validity_states_updated, label) " - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")); + " is_client_validity_states_updated, label, " + " disallow_settings_visible_updates) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")); BindAutofillProfileToStatement(profile, AutofillClock::Now(), &s); if (!s.Run()) @@ -1173,14 +1178,14 @@ " use_count=?, use_date=?, date_modified=?, origin=?, " " language_code=?, validity_bitfield=?, " " is_client_validity_states_updated=?, " - " label=? " + " label=?, disallow_settings_visible_updates=? " "WHERE guid=?")); BindAutofillProfileToStatement(profile, update_modification_date ? AutofillClock::Now() : old_profile->modification_date(), &s); - s.BindString(17, profile.guid()); + s.BindString(18, profile.guid()); bool result = s.Run(); DCHECK_GT(db_->GetLastChangeCount(), 0); @@ -1224,7 +1229,8 @@ "SELECT guid, company_name, street_address, dependent_locality, city," " state, zipcode, sorting_code, country_code, use_count, use_date," " date_modified, origin, language_code, validity_bitfield," - " is_client_validity_states_updated, label " + " is_client_validity_states_updated, label," + " disallow_settings_visible_updates " "FROM autofill_profiles " "WHERE guid=?")); s.BindString(0, guid); @@ -3503,6 +3509,18 @@ } bool AutofillTable:: + MigrateToVersion96AddAutofillProfileDisallowConfirmableMergesColumn() { + if (!db_->DoesTableExist("autofill_profiles")) + InitProfileAddressesTable(); + + return db_->DoesColumnExist("autofill_profiles", + "disallow_settings_visible_updates") || + db_->Execute( + "ALTER TABLE autofill_profiles ADD COLUMN " + "disallow_settings_visible_updates INTEGER NOT NULL DEFAULT 0"); +} + +bool AutofillTable:: MigrateToVersion89AddInstrumentIdColumnToMaskedCreditCard() { // Add the new instrument_id column to the masked_credit_cards table and set // the default value to 0. @@ -3844,25 +3862,27 @@ bool AutofillTable::InitProfilesTable() { if (!db_->DoesTableExist("autofill_profiles")) { - if (!db_->Execute("CREATE TABLE autofill_profiles ( " - "guid VARCHAR PRIMARY KEY, " - "company_name VARCHAR, " - "street_address VARCHAR, " - "dependent_locality VARCHAR, " - "city VARCHAR, " - "state VARCHAR, " - "zipcode VARCHAR, " - "sorting_code VARCHAR, " - "country_code VARCHAR, " - "date_modified INTEGER NOT NULL DEFAULT 0, " - "origin VARCHAR DEFAULT '', " - "language_code VARCHAR, " - "use_count INTEGER NOT NULL DEFAULT 0, " - "use_date INTEGER NOT NULL DEFAULT 0, " - "validity_bitfield UNSIGNED NOT NULL DEFAULT 0, " - "is_client_validity_states_updated BOOL NOT NULL DEFAULT " - "FALSE, " - "label VARCHAR) ")) { + if (!db_->Execute( + "CREATE TABLE autofill_profiles ( " + "guid VARCHAR PRIMARY KEY, " + "company_name VARCHAR, " + "street_address VARCHAR, " + "dependent_locality VARCHAR, " + "city VARCHAR, " + "state VARCHAR, " + "zipcode VARCHAR, " + "sorting_code VARCHAR, " + "country_code VARCHAR, " + "date_modified INTEGER NOT NULL DEFAULT 0, " + "origin VARCHAR DEFAULT '', " + "language_code VARCHAR, " + "use_count INTEGER NOT NULL DEFAULT 0, " + "use_date INTEGER NOT NULL DEFAULT 0, " + "validity_bitfield UNSIGNED NOT NULL DEFAULT 0, " + "is_client_validity_states_updated BOOL NOT NULL DEFAULT " + "FALSE, " + "label VARCHAR, " + "disallow_settings_visible_updates INTEGER NOT NULL DEFAULT 0)")) { NOTREACHED(); return false; }
diff --git a/components/autofill/core/browser/webdata/autofill_table.h b/components/autofill/core/browser/webdata/autofill_table.h index 66e026a..f72a8413 100644 --- a/components/autofill/core/browser/webdata/autofill_table.h +++ b/components/autofill/core/browser/webdata/autofill_table.h
@@ -102,6 +102,9 @@ // A flag indicating whether the validity states of // different fields according to the client validity api is // updated or not. Added in version 80. +// disallow_settings_visible_updates +// If true, a profile does not qualify to get merged with +// a profile observed in a form submission. // // autofill_profile_addresses // guid The guid string that identifies the profile to which @@ -719,6 +722,7 @@ bool MigrateToVersion93AddAutofillProfileLabelColumn(); bool MigrateToVersion94AddPromoCodeColumnsToOfferData(); bool MigrateToVersion95AddVirtualCardMetadata(); + bool MigrateToVersion96AddAutofillProfileDisallowConfirmableMergesColumn(); // Max data length saved in the table, AKA the maximum length allowed for // form data.
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc index fbbba2e..1013feef 100644 --- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
@@ -1299,6 +1299,7 @@ home_profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, u"MAGIC ###"); home_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, u"US"); home_profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, u"18181234567"); + home_profile.set_disallow_settings_visible_updates(true); home_profile.set_language_code("en"); home_profile.SetClientValidityFromBitfieldValue(6); home_profile.set_is_client_validity_states_updated(true);
diff --git a/components/browser_ui/photo_picker/android/BUILD.gn b/components/browser_ui/photo_picker/android/BUILD.gn index dc18ede..02a83a91 100644 --- a/components/browser_ui/photo_picker/android/BUILD.gn +++ b/components/browser_ui/photo_picker/android/BUILD.gn
@@ -26,7 +26,9 @@ "java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java", "java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTask.java", "java/src/org/chromium/components/browser_ui/photo_picker/ImageDecoder.java", + "java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDelegateBase.java", "java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java", + "java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerFeatures.java", "java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerToolbar.java", "java/src/org/chromium/components/browser_ui/photo_picker/PickerAdapter.java", "java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmap.java", @@ -56,7 +58,10 @@ } generate_jni("photo_picker_jni_headers") { - sources = [ "java/src/org/chromium/components/browser_ui/photo_picker/ImageDecoder.java" ] + sources = [ + "java/src/org/chromium/components/browser_ui/photo_picker/ImageDecoder.java", + "java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerFeatures.java", + ] } android_aidl("photo_picker_aidl") {
diff --git a/components/browser_ui/photo_picker/android/features.cc b/components/browser_ui/photo_picker/android/features.cc index a517698..b71197e8 100644 --- a/components/browser_ui/photo_picker/android/features.cc +++ b/components/browser_ui/photo_picker/android/features.cc
@@ -4,11 +4,29 @@ #include "components/browser_ui/photo_picker/android/features.h" +#include "components/browser_ui/photo_picker/android/photo_picker_jni_headers/PhotoPickerFeatures_jni.h" + namespace photo_picker { namespace features { +namespace { + +// Array of features exposed through the Java Features brdige class. Entries in +// this array may either refer to features defined in the header of this file or +// in other locations in the code base (e.g. content_features.h), and must be +// replicated in the same order in PhotoPickerFeatures.java. +const base::Feature* kFeaturesExposedToJava[] = { + &kPhotoPickerVideoSupport, +}; + +} // namespace + const base::Feature kPhotoPickerVideoSupport{"PhotoPickerVideoSupport", base::FEATURE_DISABLED_BY_DEFAULT}; +static jlong JNI_PhotoPickerFeatures_GetFeature(JNIEnv* env, jint ordinal) { + return reinterpret_cast<jlong>(kFeaturesExposedToJava[ordinal]); +} + } // namespace features } // namespace photo_picker
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java index 62d6a55..c556e4c 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java
@@ -49,6 +49,9 @@ // A tag for logging error messages. private static final String TAG = "ImageDecoderHost"; + // The feature param for determining whether the PhotoPicker should animate thumbnails. + private static final String FEATURE_PARAM_ANIMATE_THUMBNAILS = "animate_thumbnails"; + // The current context. private final Context mContext; @@ -80,7 +83,7 @@ private int mFailedVideoDecodesUnknown; // Whether animated thumbnails should be generated for video clips. - private final boolean mAnimatedThumbnailsSupported; + private boolean mAnimatedThumbnailsSupported; // A worker task for asynchronously handling video decode requests. private DecodeVideoTask mWorkerTask; @@ -234,18 +237,17 @@ * The DecoderServiceHost constructor. * @param callback The callback to use when communicating back to the client. * @param context The current context. - * @param animatedThumbnailsSupported Whether animated thumbnails should be generated for video - * clips. */ - public DecoderServiceHost( - DecoderStatusCallback callback, Context context, boolean animatedThumbnailsSupported) { + public DecoderServiceHost(DecoderStatusCallback callback, Context context) { mCallbacks.add(callback); - mAnimatedThumbnailsSupported = animatedThumbnailsSupported; if (sStatusCallbackForTesting != null) { mCallbacks.add(sStatusCallbackForTesting); } mContext = context; mContentResolver = mContext.getContentResolver(); + mAnimatedThumbnailsSupported = + PhotoPickerFeatures.PHOTO_PICKER_VIDEO_SUPPORT.getFieldTrialParamByFeatureAsBoolean( + FEATURE_PARAM_ANIMATE_THUMBNAILS, false); } /** @@ -282,6 +284,7 @@ DecoderServiceParams params = new DecoderServiceParams( uri, width, fullWidth, fileType, /*firstFrame=*/true, callback); mPendingRequests.add(params); + if (params.mFileType == PickerBitmap.TileTypes.VIDEO && mAnimatedThumbnailsSupported) { // Decoding requests for videos are requests for first frames only. Add another // low-priority request for decoding the rest of the frames. @@ -602,4 +605,9 @@ public static void setStatusCallback(DecoderStatusCallback callback) { sStatusCallbackForTesting = callback; } + + @VisibleForTesting + void setAnimatedThumbnailsSupportedForTesting(boolean supported) { + mAnimatedThumbnailsSupported = supported; + } }
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java index 9363b63..1d1a57b6 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHostTest.java
@@ -23,6 +23,7 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.base.test.util.UrlUtils; +import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; import java.io.File; @@ -63,6 +64,7 @@ @Before public void setUp() throws Exception { mContext = InstrumentationRegistry.getTargetContext(); + NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); TestThreadUtils.runOnUiThreadBlocking(() -> { DecoderServiceHost.setIntentSupplier( @@ -143,8 +145,7 @@ lowerPri = new DecoderServiceHost.DecoderServiceParams(uri, width, fullWidth, PickerBitmap.TileTypes.VIDEO, /* firstFrame= */ true, callback); - DecoderServiceHost host = - new DecoderServiceHost(this, mContext, /* animatedThumbnailsSupported = */ true); + DecoderServiceHost host = new DecoderServiceHost(this, mContext); Assert.assertTrue("Still images have priority over requests for initial video frame", host.mRequestComparator.compare(higherPri, lowerPri) < 0); @@ -203,8 +204,8 @@ @LargeTest @MinAndroidSdkLevel(Build.VERSION_CODES.O) // Video is only supported on O+. public void testDecodingOrder() throws Throwable { - DecoderServiceHost host = - new DecoderServiceHost(this, mContext, /* animatedThumbnailsSupported = */ true); + DecoderServiceHost host = new DecoderServiceHost(this, mContext); + host.setAnimatedThumbnailsSupportedForTesting(true); host.bind(); waitForDecoder(); @@ -269,8 +270,8 @@ @LargeTest @MinAndroidSdkLevel(Build.VERSION_CODES.O) // Video is only supported on O+. public void testDecodingOrderNoAnimationSupported() throws Throwable { - DecoderServiceHost host = - new DecoderServiceHost(this, mContext, /* animatedThumbnailsSupported = */ false); + DecoderServiceHost host = new DecoderServiceHost(this, mContext); + host.setAnimatedThumbnailsSupportedForTesting(false); host.bind(); waitForDecoder(); @@ -331,8 +332,8 @@ @LargeTest @MinAndroidSdkLevel(Build.VERSION_CODES.O) // Video is only supported on O+. public void testDecodingSizes() throws Throwable { - DecoderServiceHost host = - new DecoderServiceHost(this, mContext, /* animatedThumbnailsSupported = */ true); + DecoderServiceHost host = new DecoderServiceHost(this, mContext); + host.setAnimatedThumbnailsSupportedForTesting(true); host.bind(); waitForDecoder(); @@ -411,8 +412,7 @@ @Test @LargeTest public void testCancelation() throws Throwable { - DecoderServiceHost host = - new DecoderServiceHost(this, mContext, /* animatedThumbnailsSupported = */ true); + DecoderServiceHost host = new DecoderServiceHost(this, mContext); host.bind(); waitForDecoder(); @@ -448,8 +448,7 @@ @Test @LargeTest public void testNoConnectionFailureMode() throws Throwable { - DecoderServiceHost host = - new DecoderServiceHost(this, mContext, /* animatedThumbnailsSupported = */ true); + DecoderServiceHost host = new DecoderServiceHost(this, mContext); // Try decoding without a connection to the decoder. String green = "green100x100.jpg"; @@ -463,8 +462,7 @@ @Test @LargeTest public void testFileNotFoundFailureMode() throws Throwable { - DecoderServiceHost host = - new DecoderServiceHost(this, mContext, /* animatedThumbnailsSupported = */ true); + DecoderServiceHost host = new DecoderServiceHost(this, mContext); host.bind(); waitForDecoder();
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDelegateBase.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDelegateBase.java new file mode 100644 index 0000000..30b9217 --- /dev/null +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDelegateBase.java
@@ -0,0 +1,21 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.browser_ui.photo_picker; + +import org.chromium.ui.base.PhotoPickerDelegate; + +/** + * A shared base implementation of {@link PhotoPickerDelegate}. + * + * Routes video support queries to the feature flag. + */ +public abstract class PhotoPickerDelegateBase implements PhotoPickerDelegate { + protected PhotoPickerDelegateBase() {} + + @Override + public boolean supportsVideos() { + return PhotoPickerFeatures.PHOTO_PICKER_VIDEO_SUPPORT.isEnabled(); + } +}
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java index 7854543..544c6ff 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java
@@ -84,21 +84,18 @@ * @param listener The listener object that gets notified when an action is taken. * @param multiSelectionAllowed Whether the photo picker should allow multiple items to be * selected. - * @param animatedThumbnailsSupported Whether animated thumbnails should be generated for video - * clips. * @param mimeTypes A list of mime types to show in the dialog. */ public PhotoPickerDialog(WindowAndroid windowAndroid, ContentResolver contentResolver, - PhotoPickerListener listener, boolean multiSelectionAllowed, - boolean animatedThumbnailsSupported, List<String> mimeTypes) { + PhotoPickerListener listener, boolean multiSelectionAllowed, List<String> mimeTypes) { super(windowAndroid.getContext().get(), R.style.Theme_Chromium_Fullscreen); mWindowAndroid = windowAndroid; mListenerWrapper = new PhotoPickerListenerWrapper(listener); // Initialize the main content view. - mCategoryView = new PickerCategoryView(windowAndroid, contentResolver, - multiSelectionAllowed, animatedThumbnailsSupported, this); + mCategoryView = + new PickerCategoryView(windowAndroid, contentResolver, multiSelectionAllowed, this); mCategoryView.initialize(this, mListenerWrapper, mimeTypes); setView(mCategoryView); }
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java index a8b9ac8c..902c5c58 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java
@@ -37,6 +37,7 @@ import org.chromium.components.browser_ui.widget.RecyclerViewTestUtils; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate.SelectionObserver; +import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TouchCommon; import org.chromium.ui.base.ActivityWindowAndroid; @@ -128,6 +129,7 @@ @Before public void setUp() throws Exception { + NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); mWindowAndroid = TestThreadUtils.runOnUiThreadBlocking( () -> { return new ActivityWindowAndroid(getActivity()); }); TestThreadUtils.runOnUiThreadBlocking(() -> { @@ -272,9 +274,9 @@ TestThreadUtils.runOnUiThreadBlocking(new Callable<PhotoPickerDialog>() { @Override public PhotoPickerDialog call() { - final PhotoPickerDialog dialog = new PhotoPickerDialog(mWindowAndroid, - contentResolver, PhotoPickerDialogTest.this, multiselect, - /* animatedThumbnailsSupported = */ true, mimeTypes); + final PhotoPickerDialog dialog = + new PhotoPickerDialog(mWindowAndroid, contentResolver, + PhotoPickerDialogTest.this, multiselect, mimeTypes); dialog.show(); return dialog; }
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerFeatures.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerFeatures.java new file mode 100644 index 0000000..c0ec0314 --- /dev/null +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerFeatures.java
@@ -0,0 +1,38 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.browser_ui.photo_picker; + +import org.chromium.base.Features; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; + +/** + * Provides an API for querying the status of Photo Picker features. + */ +@JNINamespace("photo_picker::features") +public class PhotoPickerFeatures extends Features { + public static final String PHOTO_PICKER_VIDEO_SUPPORT_NAME = "PhotoPickerVideoSupport"; + + // This list must be kept in sync with kFeaturesExposedToJava in native. + public static final PhotoPickerFeatures PHOTO_PICKER_VIDEO_SUPPORT = + new PhotoPickerFeatures(0, PHOTO_PICKER_VIDEO_SUPPORT_NAME); + + private final int mOrdinal; + + private PhotoPickerFeatures(int ordinal, String name) { + super(name); + mOrdinal = ordinal; + } + + @Override + protected long getFeaturePointer() { + return PhotoPickerFeaturesJni.get().getFeature(mOrdinal); + } + + @NativeMethods + interface Natives { + long getFeature(int ordinal); + } +}
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java index 49aaa5a..0e175fb 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java
@@ -192,20 +192,17 @@ * selection. * @param contentResolver The ContentResolver to use to retrieve image metadata from disk. * @param multiSelectionAllowed Whether to allow the user to select more than one image. - * @param animatedThumbnailsSupported Whether animated thumbnails should be generated for video - * clips. */ @SuppressWarnings("unchecked") // mSelectableListLayout public PickerCategoryView(WindowAndroid windowAndroid, ContentResolver contentResolver, - boolean multiSelectionAllowed, boolean animatedThumbnailsSupported, - PhotoPickerToolbar.PhotoPickerToolbarDelegate delegate) { + boolean multiSelectionAllowed, PhotoPickerToolbar.PhotoPickerToolbarDelegate delegate) { super(windowAndroid.getContext().get()); mWindowAndroid = windowAndroid; Context context = mWindowAndroid.getContext().get(); mContentResolver = contentResolver; mMultiSelectionAllowed = multiSelectionAllowed; - mDecoderServiceHost = new DecoderServiceHost(this, context, animatedThumbnailsSupported); + mDecoderServiceHost = new DecoderServiceHost(this, context); mDecoderServiceHost.bind(); mSelectionDelegate = new SelectionDelegate<PickerBitmap>();
diff --git a/components/cdm/renderer/widevine_key_system_properties.cc b/components/cdm/renderer/widevine_key_system_properties.cc index b49141a..f3e9336 100644 --- a/components/cdm/renderer/widevine_key_system_properties.cc +++ b/components/cdm/renderer/widevine_key_system_properties.cc
@@ -5,6 +5,7 @@ #include "components/cdm/renderer/widevine_key_system_properties.h" #include "base/feature_list.h" +#include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "media/base/media_switches.h" #include "media/media_buildflags.h" @@ -160,12 +161,16 @@ if (robustness >= Robustness::SW_SECURE_DECODE) { return EmeConfigRule::HW_SECURE_CODECS_REQUIRED; } +#elif defined(OS_WIN) + // On Windows, hardware security uses MediaFoundation-based CDM which requires + // identifier and persistent state. + if (robustness >= Robustness::HW_SECURE_CRYPTO) + return EmeConfigRule::IDENTIFIER_PERSISTENCE_AND_HW_SECURE_CODECS_REQUIRED; #else - // On other platforms, generally hardware security requires hardware secure - // codecs and an identifier. - if (robustness >= Robustness::HW_SECURE_CRYPTO) { - return EmeConfigRule::IDENTIFIER_AND_HW_SECURE_CODECS_REQUIRED; - } + // On other platforms, require hardware secure codecs for HW_SECURE_CRYPTO and + // above. + if (robustness >= Robustness::HW_SECURE_CRYPTO) + return EmeConfigRule::HW_SECURE_CODECS_REQUIRED; #endif // BUILDFLAG(IS_CHROMEOS_ASH) return EmeConfigRule::SUPPORTED;
diff --git a/components/history/content/browser/history_database_helper.h b/components/history/content/browser/history_database_helper.h index 4a97514..12f89f1 100644 --- a/components/history/content/browser/history_database_helper.h +++ b/components/history/content/browser/history_database_helper.h
@@ -13,7 +13,7 @@ struct HistoryDatabaseParams; -// Returns a HistoryDatabaseParams for |history_dir|. +// Returns a HistoryDatabaseParams for `history_dir`. HistoryDatabaseParams HistoryDatabaseParamsForPath( const base::FilePath& history_dir);
diff --git a/components/history/core/browser/android/android_cache_database.h b/components/history/core/browser/android/android_cache_database.h index 273e8e1..c2c087c8 100644 --- a/components/history/core/browser/android/android_cache_database.h +++ b/components/history/core/browser/android/android_cache_database.h
@@ -38,27 +38,27 @@ // Clears all rows in the bookmark_cache table; returns true on success. bool ClearAllBookmarkCache(); - // Marks the given |url_ids| as bookmarked; Returns true on success. + // Marks the given `url_ids` as bookmarked; Returns true on success. bool MarkURLsAsBookmarked(const std::vector<URLID>& url_id); - // Set the given |url_id|'s favicon column to |favicon_id|. Returns true on + // Set the given `url_id`'s favicon column to `favicon_id`. Returns true on // success. bool SetFaviconID(URLID url_id, favicon_base::FaviconID favicon_id); // The search_terms table ------------------------------------------------- // - // Add a row in the search_term table with the given |term| and - // |last_visit_time|. Return the new row's id on success, otherwise 0 is + // Add a row in the search_term table with the given `term` and + // `last_visit_time`. Return the new row's id on success, otherwise 0 is // returned. SearchTermID AddSearchTerm(const std::u16string& term, const base::Time& last_visit_time); - // Updates the |id|'s row with the given |row|; returns true on success. + // Updates the `id`'s row with the given `row`; returns true on success. bool UpdateSearchTerm(SearchTermID id, const SearchTermRow& row); - // Get SearchTermRow of the given |term|; return the row id on success. + // Get SearchTermRow of the given `term`; return the row id on success. // otherwise 0 is returned. - // The found row is return in |row| if it is not NULL. + // The found row is return in `row` if it is not NULL. SearchTermID GetSearchTerm(const std::u16string& term, SearchTermRow* row); // Delete the search terms which don't exist in keyword_search_terms table.
diff --git a/components/history/core/browser/android/android_history_types.h b/components/history/core/browser/android/android_history_types.h index 81cd383a..ab37d9ef 100644 --- a/components/history/core/browser/android/android_history_types.h +++ b/components/history/core/browser/android/android_history_types.h
@@ -137,7 +137,7 @@ } URLID url_id() const { return url_id_; } - // Returns true if the given |id| has been set explicitly. + // Returns true if the given `id` has been set explicitly. bool is_value_set_explicitly(ColumnID id) const { return values_set_.find(id) != values_set_.end(); } @@ -214,7 +214,7 @@ keyword_id_ = keyword_id; } - // Returns true if the given |id| has been set explicitly. + // Returns true if the given `id` has been set explicitly. bool is_value_set_explicitly(ColumnID id) const { return values_set_.find(id) != values_set_.end(); }
diff --git a/components/history/core/browser/android/android_urls_database.h b/components/history/core/browser/android/android_urls_database.h index 37b714e..9b465e5 100644 --- a/components/history/core/browser/android/android_urls_database.h +++ b/components/history/core/browser/android/android_urls_database.h
@@ -34,24 +34,24 @@ // table was created or already exists. bool CreateAndroidURLsTable(); - // Adds a new mapping between |raw_url| and |url_id|, returns the id if it + // Adds a new mapping between `raw_url` and `url_id`, returns the id if it // succeeds, otherwise 0 is returned. AndroidURLID AddAndroidURLRow(const std::string& raw_url, URLID url_id); - // Looks up the given |url_id| in android_urls table. Returns true if success, - // and fill in the |row| if it not NULL, returns false if the |url_id| is not + // Looks up the given `url_id` in android_urls table. Returns true if success, + // and fill in the `row` if it not NULL, returns false if the `url_id` is not // found. bool GetAndroidURLRow(URLID url_id, AndroidURLRow* row); - // Deletes the rows whose url_id is in |url_ids|. Returns true if all - // |url_ids| were found and deleted, otherwise false is returned. + // Deletes the rows whose url_id is in `url_ids`. Returns true if all + // `url_ids` were found and deleted, otherwise false is returned. bool DeleteAndroidURLRows(const std::vector<URLID>& url_ids); // Deletes all the rows whose url_id doesn't exist in urls table. Returns true // on success. bool DeleteUnusedAndroidURLs(); - // Updates the row of |id| with the given |raw_url| and |url_id|. Returns true + // Updates the row of `id` with the given `raw_url` and `url_id`. Returns true // on success. bool UpdateAndroidURLRow(AndroidURLID id, const std::string& raw_url,
diff --git a/components/history/core/browser/android/sql_handler.h b/components/history/core/browser/android/sql_handler.h index 02c28d2b..a257abb 100644 --- a/components/history/core/browser/android/sql_handler.h +++ b/components/history/core/browser/android/sql_handler.h
@@ -38,30 +38,30 @@ // need be inserted or updated. class SQLHandler { public: - // |columns| is the implementation's columns. - // |column_count| is the number of column in |columns|. + // `columns` is the implementation's columns. + // `column_count` is the number of column in `columns`. SQLHandler(const HistoryAndBookmarkRow::ColumnID columns[], int column_count); virtual ~SQLHandler(); - // Updates the rows whose URLID or URL is in the given |ids_set| with new - // value stored in |row|. Return true if the update succeeds. + // Updates the rows whose URLID or URL is in the given `ids_set` with new + // value stored in `row`. Return true if the update succeeds. virtual bool Update(const HistoryAndBookmarkRow& row, const TableIDRows& ids_set) = 0; - // Inserts the given |row|, return true on success; The id of insertted row - // should be set in |row|, so other implemnetations could use it to complete + // Inserts the given `row`, return true on success; The id of insertted row + // should be set in `row`, so other implemnetations could use it to complete // the insert. virtual bool Insert(HistoryAndBookmarkRow* row) = 0; - // Deletes the rows whose id is in |ids_set|, returns false if any deletion + // Deletes the rows whose id is in `ids_set`, returns false if any deletion // failed, otherwise return true even all/some of rows are not found. virtual bool Delete(const TableIDRows& ids_set) = 0; - // Return true if |row| has a value explicitly set for at least one of the - // columns in |row| that are known to this class. + // Return true if `row` has a value explicitly set for at least one of the + // columns in `row` that are known to this class. bool HasColumnIn(const HistoryAndBookmarkRow& row); - // Returns true if |id| is one of the columns known to this class. + // Returns true if `id` is one of the columns known to this class. bool HasColumn(HistoryAndBookmarkRow::ColumnID id); private:
diff --git a/components/history/core/browser/android/visit_sql_handler.cc b/components/history/core/browser/android/visit_sql_handler.cc index 14e7db90..7451eb8 100644 --- a/components/history/core/browser/android/visit_sql_handler.cc +++ b/components/history/core/browser/android/visit_sql_handler.cc
@@ -32,7 +32,7 @@ VisitSQLHandler::~VisitSQLHandler() { } -// The created time is updated according the given |row|. +// The created time is updated according the given `row`. // We simulate updating created time by // a. Remove all visits. // b. Insert a new visit which has visit time same as created time.
diff --git a/components/history/core/browser/android/visit_sql_handler.h b/components/history/core/browser/android/visit_sql_handler.h index 39f1e54..c23335d 100644 --- a/components/history/core/browser/android/visit_sql_handler.h +++ b/components/history/core/browser/android/visit_sql_handler.h
@@ -30,16 +30,16 @@ bool Delete(const TableIDRows& ids_set) override; private: - // Add a row in visit table with the given |url_id| and |visit_time|. + // Add a row in visit table with the given `url_id` and `visit_time`. bool AddVisit(URLID url_id, const base::Time& visit_time); - // Add the given |visit_count| rows for |url_id|. The visit time of each row - // has minium difference and ends with the |last_visit_time|. + // Add the given `visit_count` rows for `url_id`. The visit time of each row + // has minium difference and ends with the `last_visit_time`. bool AddVisitRows(URLID url_id, int visit_count, const base::Time& last_visit_time); - // Delete the visits of the given |url_id|. + // Delete the visits of the given `url_id`. bool DeleteVisitsForURL(URLID url_id); URLDatabase* url_db_;
diff --git a/components/history/core/browser/browsing_history_driver.h b/components/history/core/browser/browsing_history_driver.h index c41f240a..00f6515 100644 --- a/components/history/core/browser/browsing_history_driver.h +++ b/components/history/core/browser/browsing_history_driver.h
@@ -64,7 +64,7 @@ // Whether the Clear Browsing Data UI should show a notice about the existence // of other forms of browsing history stored in user's account. The response - // is returned in a |callback|. + // is returned in a `callback`. virtual void ShouldShowNoticeAboutOtherFormsOfBrowsingHistory( const syncer::SyncService* sync_service, WebHistoryService* history_service,
diff --git a/components/history/core/browser/browsing_history_service.cc b/components/history/core/browser/browsing_history_service.cc index 336fc22..0f89304b 100644 --- a/components/history/core/browser/browsing_history_service.cc +++ b/components/history/core/browser/browsing_history_service.cc
@@ -184,10 +184,10 @@ if (web_history) { web_history_service_observation_.Observe(web_history); } else if (sync_service_) { - // If |web_history| is not available, it means that history sync is - // disabled. If |sync_service_| is not null, it means that syncing is + // If `web_history` is not available, it means that history sync is + // disabled. If `sync_service_` is not null, it means that syncing is // possible, and that history sync/web history may become enabled later, so - // attach start observing. If |sync_service_| is null then we cannot start + // attach start observing. If `sync_service_` is null then we cannot start // observing. This is okay because sync will never start for us, for example // it may be disabled by flag or we're part of an incognito/guest mode // window. @@ -216,7 +216,7 @@ scoped_refptr<QueryHistoryState> state) { state->remote_status = TIMED_OUT; - // Don't reset |web_history_request_| so we can still record histogram. + // Don't reset `web_history_request_` so we can still record histogram. // TODO(dubroy): Communicate the failure to the front end. if (!query_task_tracker_.HasTrackedTasks()) ReturnResultsToDriver(std::move(state)); @@ -463,7 +463,7 @@ // Maps a URL to the most recent entry on a particular day. std::map<GURL, HistoryEntry*> current_day_entries; - // Keeps track of the day that |current_day_entries| is holding entries for + // Keeps track of the day that `current_day_entries` is holding entries for // in order to handle removing per-day duplicates. base::Time current_day_midnight; @@ -517,7 +517,7 @@ } else if (CanRetry(state->remote_status)) { // TODO(skym): It is unclear if this is the best behavior. The UI is going // to behave incorrectly if out of order results are received. So to - // guarantee that doesn't happen, use |oldest_local| for continuation + // guarantee that doesn't happen, use `oldest_local` for continuation // calls. This will result in missing history entries for the failed calls. // crbug.com/685866 is related to this problem. state->remote_end_time_for_continuation = oldest_local;
diff --git a/components/history/core/browser/browsing_history_service.h b/components/history/core/browser/browsing_history_service.h index 30fa2bd..bf0905d 100644 --- a/components/history/core/browser/browsing_history_service.h +++ b/components/history/core/browser/browsing_history_service.h
@@ -85,7 +85,7 @@ std::u16string title; // Title of the entry. May be empty. // The time of the entry. Usually this will be the time of the most recent - // visit to |url| on a particular day as defined in the local timezone. + // visit to `url` on a particular day as defined in the local timezone. base::Time time; // The sync ID of the client on which the most recent visit occurred. @@ -144,7 +144,7 @@ void QueryHistory(const std::u16string& search_text, const QueryOptions& options); - // Removes |items| from history. + // Removes `items` from history. void RemoveVisits(const std::vector<HistoryEntry>& items); // SyncServiceObserver implementation. @@ -164,12 +164,12 @@ // Used to hold and track query state between asynchronous calls. struct QueryHistoryState; - // Moves results from |state| into |results|, merging both remote and local + // Moves results from `state` into `results`, merging both remote and local // results together and maintaining reverse chronological order. Any results // with the same URL will be merged together for each day. Often holds back - // some results in |state| from one of the two sources to ensure that they're + // some results in `state` from one of the two sources to ensure that they're // always returned to the driver in correct order. This function also updates - // the end times in |state| for both sources that the next query should be + // the end times in `state` for both sources that the next query should be // made against. static void MergeDuplicateResults(QueryHistoryState* state, std::vector<HistoryEntry>* results); @@ -186,7 +186,7 @@ // BrowsingHistoryDriver. void ReturnResultsToDriver(scoped_refptr<QueryHistoryState> state); - // Callback from |web_history_timer_| when a response from web history has + // Callback from `web_history_timer_` when a response from web history has // not been received in time. void WebHistoryTimeout(scoped_refptr<QueryHistoryState> state);
diff --git a/components/history/core/browser/browsing_history_service_unittest.cc b/components/history/core/browser/browsing_history_service_unittest.cc index 0957420..7a5e097 100644 --- a/components/history/core/browser/browsing_history_service_unittest.cc +++ b/components/history/core/browser/browsing_history_service_unittest.cc
@@ -381,9 +381,9 @@ QueryOptions options; options.begin_time = OffsetToTime(2); options.end_time = OffsetToTime(4); - // Having a |reached_beginning| value of false here seems - // counterintuitive. Seems to be for paging by |begin_time| instead of - // |count|. If the local history implementation changes, feel free to update + // Having a `reached_beginning` value of false here seems + // counterintuitive. Seems to be for paging by `begin_time` instead of + // `count`. If the local history implementation changes, feel free to update // this value, all this test cares about is that BrowsingHistoryService passes // the values through correctly. VerifyQueryResult(/*reached_beginning*/ false, @@ -654,7 +654,7 @@ // WebHistoryService will DCHECK if we destroy it before the observer in // BrowsingHistoryService is removed, so reset our first - // BrowsingHistoryService before |timeout| goes out of scope. + // BrowsingHistoryService before `timeout` goes out of scope. driver()->SetWebHistory(nullptr); ResetService(driver(), nullptr, nullptr); } @@ -716,7 +716,7 @@ // WebHistoryService will DCHECK if we destroy it before the observer in // BrowsingHistoryService is removed, so reset our first - // BrowsingHistoryService before |reversed| goes out of scope. + // BrowsingHistoryService before `reversed` goes out of scope. driver()->SetWebHistory(nullptr); ResetService(driver(), nullptr, nullptr); }
diff --git a/components/history/core/browser/download_database.cc b/components/history/core/browser/download_database.cc index 4eff6f8..d034b2af0 100644 --- a/components/history/core/browser/download_database.cc +++ b/components/history/core/browser/download_database.cc
@@ -394,11 +394,11 @@ // return 0 = kInvalidDownloadId, so GetNextDownloadId() will set // *id = kInvalidDownloadId + 1. // - // If there is at least one record but all of the |id|s are + // If there is at least one record but all of the `id`s are // <= kInvalidDownloadId, then max(id) will return <= kInvalidDownloadId, // so GetNextDownloadId() should return kInvalidDownloadId + 1. // - // Note that any records with |id <= kInvalidDownloadId| will be dropped in + // Note that any records with `id <= kInvalidDownloadId` will be dropped in // QueryDownloads(). // // SQLITE doesn't have unsigned integers. @@ -437,7 +437,7 @@ int column = 0; // SQLITE does not have unsigned integers, so explicitly handle negative - // |id|s instead of casting them to very large uint32s, which would break + // `id`s instead of casting them to very large uint32s, which would break // the max(id) logic in GetNextDownloadId(). int64_t signed_id = statement_main.ColumnInt64(column++); bool valid = ConvertIntToDownloadId(signed_id, &(info->id)); @@ -791,8 +791,8 @@ bool DownloadDatabase::CreateOrUpdateDownloadSlice( const DownloadSliceInfo& info) { // If the slice has no data, there is no need to insert it into the db. Note - // that for each slice, |received_bytes| can only go up. So if a slice is - // already in the db, its |received_bytes| should always be larger than 0. + // that for each slice, `received_bytes` can only go up. So if a slice is + // already in the db, its `received_bytes` should always be larger than 0. if (info.received_bytes == 0) return true; sql::Statement statement_replace(GetDB().GetCachedStatement(
diff --git a/components/history/core/browser/download_database.h b/components/history/core/browser/download_database.h index e64e666..a7d428c 100644 --- a/components/history/core/browser/download_database.h +++ b/components/history/core/browser/download_database.h
@@ -40,7 +40,7 @@ void QueryDownloads(std::vector<DownloadRow>* results); // Update the state of one download. Returns true if successful. - // Does not update |url|, |start_time|; uses |id| only + // Does not update `url`, `start_time`; uses `id` only // to select the row in the database table to update. bool UpdateDownload(const DownloadRow& data); @@ -48,7 +48,7 @@ // creation succeeded, false otherwise. bool CreateDownload(const DownloadRow& info); - // Remove |id| from the database. + // Remove `id` from the database. void RemoveDownload(DownloadId id); size_t CountDownloads(); @@ -61,7 +61,7 @@ bool MigrateMimeType(); // Returns true if able to successfully rewrite the invalid values for the - // |state| field from 3 to 4. Returns false if there was an error fixing the + // `state` field from 3 to 4. Returns false if there was an error fixing the // database. See http://crbug.com/140687 bool MigrateDownloadsState(); @@ -116,14 +116,14 @@ // Fixes state of the download entries. Sometimes entries with IN_PROGRESS // state are not updated during browser shutdown (particularly when crashing). // On the next start such entries are considered interrupted with - // interrupt reason |DOWNLOAD_INTERRUPT_REASON_CRASH|. This function + // interrupt reason `DOWNLOAD_INTERRUPT_REASON_CRASH`. This function // fixes such entries. void EnsureInProgressEntriesCleanedUp(); // Ensures a column exists in downloads table. bool EnsureColumnExists(const std::string& name, const std::string& type); - // Ensures a column exists in |table|. + // Ensures a column exists in `table`. bool EnsureColumnExistsInTable(const std::string& table, const std::string& name, const std::string& type); @@ -138,7 +138,7 @@ void RemoveDownloadSlices(DownloadId id); // Helper method to query the download slices for all the records in - // |download_row_map|. + // `download_row_map`. using DownloadRowMap = std::map<DownloadId, DownloadRow*>; void QueryDownloadSlices(DownloadRowMap* download_row_map);
diff --git a/components/history/core/browser/download_row.h b/components/history/core/browser/download_row.h index bef2803..cf812e5 100644 --- a/components/history/core/browser/download_row.h +++ b/components/history/core/browser/download_row.h
@@ -101,7 +101,7 @@ std::string hash; // The id of the download in the database. Is not changed by UpdateDownload(). - // Note: This field should be considered deprecated in favor of |guid| below. + // Note: This field should be considered deprecated in favor of `guid` below. // See http://crbug.com/593020. DownloadId id = kInvalidDownloadId;
diff --git a/components/history/core/browser/expire_history_backend.cc b/components/history/core/browser/expire_history_backend.cc index 26b17af..b35372a5 100644 --- a/components/history/core/browser/expire_history_backend.cc +++ b/components/history/core/browser/expire_history_backend.cc
@@ -68,9 +68,9 @@ // Reads only AUTO_SUBFRAME visits, within a computed range. The range is // computed as follows: -// * |begin_time| is read from the meta table. This value is updated whenever +// * `begin_time` is read from the meta table. This value is updated whenever // there are no more additional visits to expire by this reader. -// * |end_time| is advanced forward by a constant (kEarlyExpirationAdvanceDay), +// * `end_time` is advanced forward by a constant (kEarlyExpirationAdvanceDay), // but not past the current time. class AutoSubframeVisitsReader : public ExpiringVisitsReader { public: @@ -82,7 +82,7 @@ DCHECK(visits) << "visit vector has to exist in order to populate it"; base::Time begin_time = db->GetEarlyExpirationThreshold(); - // Advance |end_time| to expire early. + // Advance `end_time` to expire early. base::Time early_end_time = end_time + base::TimeDelta::FromDays(kEarlyExpirationAdvanceDays); @@ -213,7 +213,7 @@ main_db_->GetVisitsForURL(url_row.id(), &visits_to_delete); size_t total_visits = visits_to_delete.size(); if (!end_time.is_null() && !end_time.is_max()) { - // Remove all items that should not be deleted from |visits_to_delete|. + // Remove all items that should not be deleted from `visits_to_delete`. base::EraseIf(visits_to_delete, [=](auto& v) { return v.visit_time > end_time; }); } @@ -265,7 +265,7 @@ void ExpireHistoryBackend::ExpireHistoryForTimes( const std::vector<base::Time>& times) { - // |times| must be in reverse chronological order and have no + // `times` must be in reverse chronological order and have no // duplicates, i.e. each member must be earlier than the one before // it. DCHECK(
diff --git a/components/history/core/browser/expire_history_backend.h b/components/history/core/browser/expire_history_backend.h index e9118f42..f1309ea 100644 --- a/components/history/core/browser/expire_history_backend.h +++ b/components/history/core/browser/expire_history_backend.h
@@ -37,7 +37,7 @@ class ExpiringVisitsReader { public: virtual ~ExpiringVisitsReader() {} - // Populates |visits| from |db|, using provided |end_time| and |max_visits| + // Populates `visits` from `db`, using provided `end_time` and `max_visits` // cap. virtual bool Read(base::Time end_time, HistoryDatabase* db, VisitVector* visits, int max_visits) const = 0; @@ -74,10 +74,10 @@ // will continue until the object is deleted. void StartExpiringOldStuff(base::TimeDelta expiration_threshold); - // Deletes everything associated with a URL until |end_time|. + // Deletes everything associated with a URL until `end_time`. void DeleteURL(const GURL& url, base::Time end_time); - // Deletes everything associated with each URL in the list until |end_time|. + // Deletes everything associated with each URL in the list until `end_time`. void DeleteURLs(const std::vector<GURL>& url, base::Time end_time); // Removes all visits to restrict_urls (or all URLs if empty) in the given @@ -88,7 +88,7 @@ bool user_initiated); // Removes all visits to all URLs with the given times, updating the - // URLs accordingly. |times| must be in reverse chronological order + // URLs accordingly. `times` must be in reverse chronological order // and not contain any duplicates. void ExpireHistoryForTimes(const std::vector<base::Time>& times); @@ -152,7 +152,7 @@ std::set<GURL> deleted_favicons; }; - // Returns a vector with all visits that eventually redirect to |visits|. + // Returns a vector with all visits that eventually redirect to `visits`. VisitVector GetVisitsAndRedirectParents(const VisitVector& visits); // Deletes the visit-related stuff for all the visits in the given list, and @@ -180,7 +180,7 @@ bool is_pinned, DeleteEffects* effects); - // Deletes all favicons associated with |gurl|. + // Deletes all favicons associated with `gurl`. void DeleteIcons(const GURL& gurl, DeleteEffects* effects); // Deletes all the URLs in the given vector and handles their dependencies. @@ -197,7 +197,7 @@ // // The visits in the given vector should have already been deleted from the // database, and the list of affected URLs already be filled into - // |depenencies->affected_urls|. + // `depenencies->affected_urls`. // // Starred URLs will not be deleted. The information in the dependencies that // DeleteOneURL fills in will be updated, and this function will also delete @@ -218,9 +218,9 @@ const std::set<GURL>& restrict_urls, DeletionType type); - // Deletes the favicons listed in |effects->affected_favicons| if they are + // Deletes the favicons listed in `effects->affected_favicons` if they are // unused. Fails silently (we don't care about favicons so much, so don't want - // to stop everything if it fails). Fills |expired_favicons| with the set of + // to stop everything if it fails). Fills `expired_favicons` with the set of // favicon urls that no longer have associated visits and were therefore // expired. void DeleteFaviconsIfPossible(DeleteEffects* effects); @@ -239,8 +239,8 @@ // future. void DoExpireIteration(); - // Tries to expire the oldest |max_visits| visits from history that are older - // than |time_threshold|. The return value indicates if we think there might + // Tries to expire the oldest `max_visits` visits from history that are older + // than `time_threshold`. The return value indicates if we think there might // be more history to expire with the current time threshold (it does not // indicate success or failure). bool ExpireSomeOldHistory(base::Time end_time,
diff --git a/components/history/core/browser/expire_history_backend_unittest.cc b/components/history/core/browser/expire_history_backend_unittest.cc index da481c41..365ec078 100644 --- a/components/history/core/browser/expire_history_backend_unittest.cc +++ b/components/history/core/browser/expire_history_backend_unittest.cc
@@ -62,7 +62,7 @@ return out_time; } -// Returns whether |url| can be added to history. +// Returns whether `url` can be added to history. bool MockCanAddURLToHistory(const GURL& url) { return url.is_valid(); } @@ -99,7 +99,7 @@ // EXPECTs that each URL-specific history thing (basically, everything but // favicons) is gone, the reason being either that it was automatically - // |expired|, or manually deleted. + // `expired`, or manually deleted. void EnsureURLInfoGone(const URLRow& row, bool expired); const DeletionInfo* GetLastDeletionInfo() { @@ -109,7 +109,7 @@ } // Returns whether HistoryBackendNotifier::NotifyURLsModified was - // called for |url|. + // called for `url`. bool ModifiedNotificationSentDueToExpiry(const GURL& url); bool ModifiedNotificationSentDueToUserAction(const GURL& url); @@ -335,8 +335,8 @@ } void ExpireHistoryTest::EnsureURLInfoGone(const URLRow& row, bool expired) { - // The passed in |row| must originate from |main_db_| so that its ID will be - // set to what had been in effect in |main_db_| before the deletion. + // The passed in `row` must originate from `main_db_` so that its ID will be + // set to what had been in effect in `main_db_` before the deletion. ASSERT_NE(0, row.id()); // Verify the URL no longer exists.
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index af64c7b9..ef030a2 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -199,7 +199,7 @@ } QueuedHistoryDBTask::~QueuedHistoryDBTask() { - // Ensure that |task_| is destroyed on its origin thread. + // Ensure that `task_` is destroyed on its origin thread. origin_loop_->PostTask(FROM_HERE, base::BindOnce(&base::DeletePointer<HistoryDBTask>, base::Unretained(task_.release()))); @@ -645,12 +645,12 @@ ui::PageTransition redirect_info = ui::PAGE_TRANSITION_CHAIN_START; RedirectList redirects = request.redirects; - // In the presence of client redirects, |request.redirects| can be a partial + // In the presence of client redirects, `request.redirects` can be a partial // chain because previous calls to this function may have reported a // redirect chain already. This is fine for the visits database where we'll - // just append data but insufficient for |recent_redirects_| + // just append data but insufficient for `recent_redirects_` // (backpropagation of favicons and titles), where we'd like the full - // (extended) redirect chain. We use |extended_redirect_chain| to represent + // (extended) redirect chain. We use `extended_redirect_chain` to represent // this. RedirectList extended_redirect_chain; @@ -1714,9 +1714,9 @@ void HistoryBackend::GetRedirectsToSpecificVisit(VisitID cur_visit, RedirectList* redirects) { - // Follow redirects going to cur_visit. These are added to |redirects| in + // Follow redirects going to cur_visit. These are added to `redirects` in // the order they are found. If a redirect chain looks like A -> B -> C and - // |cur_visit| = C, redirects will be {B, A} in that order. + // `cur_visit` = C, redirects will be {B, A} in that order. if (!db_) return; @@ -1986,7 +1986,7 @@ DCHECK_EQ(iter->second.back(), page_url); return iter->second; } - // No known redirects, construct mock redirect chain containing |page_url|. + // No known redirects, construct mock redirect chain containing `page_url`. return RedirectList{page_url}; } @@ -2164,7 +2164,7 @@ QueryResults results; QueryHistoryBasic(options, &results); - // 1st pass: find URLs that are visited at one of |times|. + // 1st pass: find URLs that are visited at one of `times`. std::set<GURL> urls; for (const auto& result : results) { if (times.count(result.visit_time()) > 0) @@ -2194,7 +2194,7 @@ Commit(); DCHECK_GE(times_to_expire.back(), first_recorded_time_); - // Update |first_recorded_time_| if we expired it. + // Update `first_recorded_time_` if we expired it. if (times_to_expire.back() == first_recorded_time_) db_->GetStartDate(&first_recorded_time_); } @@ -2213,7 +2213,7 @@ } Commit(); - // Update |first_recorded_time_| if any deletion might have affected it. + // Update `first_recorded_time_` if any deletion might have affected it. if (update_first_recorded_time) db_->GetStartDate(&first_recorded_time_); } @@ -2251,7 +2251,7 @@ db_diagnostics_ = db_->GetDiagnosticInfo(error, stmt); - // Don't just do the close/delete here, as we are being called by |db| and + // Don't just do the close/delete here, as we are being called by `db` and // that seems dangerous. // TODO(https://crbug.com/854258): It is also dangerous to kill the database // by a posted task: tasks that run before KillHistoryDatabase still can try @@ -2286,7 +2286,7 @@ // databases which will be closed. expirer_.SetDatabases(nullptr, nullptr); - // Reopen a new transaction for |db_| for the sake of CloseAllDatabases(). + // Reopen a new transaction for `db_` for the sake of CloseAllDatabases(). db_->BeginTransaction(); CloseAllDatabases(); }
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h index 61723a7..c540009f 100644 --- a/components/history/core/browser/history_backend.h +++ b/components/history/core/browser/history_backend.h
@@ -68,12 +68,12 @@ class TypedURLSyncBridge; class URLDatabase; -// Returns a formatted version of |url| with the HTTP/HTTPS scheme, port, +// Returns a formatted version of `url` with the HTTP/HTTPS scheme, port, // username/password, and any trivial subdomains (e.g., "www.", "m.") removed. std::u16string FormatUrlForRedirectComparison(const GURL& url); -// Advances (if |day| >= 0) or backtracks (if |day| < 0) from |time| by -// abs(|day|) calendar days in local timezone and returns the midnight of the +// Advances (if `day` >= 0) or backtracks (if `day` < 0) from `time` by +// abs(`day`) calendar days in local timezone and returns the midnight of the // resulting day. base::Time MidnightNDaysLater(base::Time time, int days); @@ -123,7 +123,7 @@ virtual ~Delegate() = default; // Called when the database cannot be read correctly for some reason. - // |diagnostics| contains information about the underlying database + // `diagnostics` contains information about the underlying database // which can help in identifying the cause of the profile error. virtual void NotifyProfileError(sql::InitStatus init_status, const std::string& diagnostics) = 0; @@ -142,7 +142,7 @@ // http://www.google.com) and the given icon URL (e.g. // http://www.google.com/favicon.ico) have changed. HistoryService notifies // any registered callbacks. It is valid to call NotifyFaviconsChanged() - // with non-empty |page_urls| and an empty |icon_url| and vice versa. + // with non-empty `page_urls` and an empty `icon_url` and vice versa. virtual void NotifyFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url) = 0; @@ -190,11 +190,11 @@ // constructed on any thread, but all other functions including Init() must // be called on the history thread. // - // |history_dir| is the directory where the history files will be placed. + // `history_dir` is the directory where the history files will be placed. // See the definition of BroadcastNotificationsCallback above. This function // takes ownership of the callback pointer. // - // |history_client| is used to determine bookmarked URLs when deleting and + // `history_client` is used to determine bookmarked URLs when deleting and // may be null. // // This constructor is fast and does no I/O, so can be called at any time. @@ -206,7 +206,7 @@ // fails, all other functions will fail as well. (Since this runs on another // thread, we don't bother returning failure.) // - // |force_fail| can be set during unittests to unconditionally fail to init. + // `force_fail` can be set during unittests to unconditionally fail to init. void Init(bool force_fail, const HistoryDatabaseParams& history_database_params); @@ -226,7 +226,7 @@ // Clears all on-demand favicons. void ClearAllOnDemandFavicons(); - // Gets the counts and last last time of URLs that belong to |origins| in the + // Gets the counts and last last time of URLs that belong to `origins` in the // history database. Origins that are not in the history database will be in // the map with a count and time of 0. // Returns an empty map if db_ is not initialized. @@ -235,7 +235,7 @@ // Navigation ---------------------------------------------------------------- - // |request.time| must be unique with high probability. + // `request.time` must be unique with high probability. void AddPage(const HistoryAddPageArgs& request); virtual void SetPageTitle(const GURL& url, const std::u16string& title); void AddPageNoVisitForBookmark(const GURL& url, const std::u16string& title); @@ -250,8 +250,8 @@ // Querying ------------------------------------------------------------------ - // Run the |callback| on the History thread. - // |callback| should handle the null database case. + // Run the `callback` on the History thread. + // `callback` should handle the null database case. void ScheduleAutocomplete( base::OnceCallback<void(HistoryBackend*, URLDatabase*)> callback); @@ -267,22 +267,22 @@ RedirectList QueryRedirectsFrom(const GURL& url); // Similar to above function except computes a chain of redirects to the - // given URL. Stores the most recent list of redirects ending at |url| in the + // given URL. Stores the most recent list of redirects ending at `url` in the // given RedirectList. For example, if we have the redirect list A -> B -> C, // then calling this function with url=C would fill redirects with {B, A}. RedirectList QueryRedirectsTo(const GURL& url); VisibleVisitCountToHostResult GetVisibleVisitCountToHost(const GURL& url); - // Request the |result_count| most visited URLs and the chain of - // redirects leading to each of these URLs. |days_back| is the + // Request the `result_count` most visited URLs and the chain of + // redirects leading to each of these URLs. `days_back` is the // number of days of history to use. Used by TopSites. MostVisitedURLList QueryMostVisitedURLs(int result_count, int days_back); // Statistics ---------------------------------------------------------------- // Gets the number of URLs as seen in chrome://history within the time range - // [|begin_time|, |end_time|). Each URL is counted only once per day. For + // [`begin_time`, `end_time`). Each URL is counted only once per day. For // determination of the date, timestamps are converted to dates using local // time. HistoryCountResult GetHistoryCount(const base::Time& begin_time, @@ -296,21 +296,21 @@ // top-level domain (eTLD) + 1, e.g. "foo.com", "bar.co.uk") visited within // the 1-day, 7-day or 28-day span that ends at a midnight in local timezone. // - // For each of the most recent |number_of_days_to_report| midnights before - // |report_time|(inclusive), this function computes a subset of + // For each of the most recent `number_of_days_to_report` midnights before + // `report_time`(inclusive), this function computes a subset of // {1-day, 7-day, 28-day} metrics whose spanning periods all end on that // midnight. This subset of metrics to compute is specified by a bitmask - // |metric_type_bitmask|, which takes a bitwise combination of + // `metric_type_bitmask`, which takes a bitwise combination of // kEnableLast1DayMetric, kEnableLast7DayMetric and kEnableLast28DayMetric. // // All computed metrics are stored in DomainDiversityResults, which represents // a collection of DomainMetricSet's. Each DomainMetricSet contains up to 3 // metrics ending at one unique midnight in the time range of - // |number_of_days_to_report| days before |report_time|. The collection of + // `number_of_days_to_report` days before `report_time`. The collection of // DomainMetricSet is sorted reverse chronologically by the ending midnight. // - // For example, when |report_time| = 2019/11/01 00:01am, |number_of_days| = 3, - // |metric_type_bitmask| = kEnableLast28DayMetric | kEnableLast1DayMetric, + // For example, when `report_time` = 2019/11/01 00:01am, `number_of_days` = 3, + // `metric_type_bitmask` = kEnableLast28DayMetric | kEnableLast1DayMetric, // DomainDiversityResults will hold 3 DomainMetricSets, each containing 2 // metrics measuring domain visit counts spanning the following date ranges // (all dates are inclusive): @@ -321,20 +321,20 @@ DomainMetricBitmaskType metric_type_bitmask); // Gets the last time any webpage on the given host was visited within the - // time range [|begin_time|, |end_time|). If the given host has not been + // time range [`begin_time`, `end_time`). If the given host has not been // visited in the given time range, the result will have a null base::Time, // but still report success. HistoryLastVisitResult GetLastVisitToHost(const GURL& host, base::Time begin_time, base::Time end_time); - // Gets the last time |url| was visited before |end_time|. If the given URL + // Gets the last time `url` was visited before `end_time`. If the given URL // has not been visited in the past, the result will have a null base::Time, // but still report success. HistoryLastVisitResult GetLastVisitToURL(const GURL& url, base::Time end_time); - // Gets counts for total visits and days visited for pages matching |host|'s + // Gets counts for total visits and days visited for pages matching `host`'s // scheme, port, and host. Counts only user-visible visits. DailyVisitsResult GetDailyVisitsToHost(const GURL& host, base::Time begin_time, @@ -377,7 +377,7 @@ scoped_refptr<base::RefCountedMemory> bitmap_data, const gfx::Size& pixel_size); - // |page_urls| must not be empty. + // `page_urls` must not be empty. void SetFavicons(const base::flat_set<GURL>& page_urls, favicon_base::IconType icon_type, const GURL& icon_url, @@ -448,12 +448,12 @@ virtual bool GetVisitsForURL(URLID id, VisitVector* visits); - // Fetches up to |max_visits| most recent visits for the passed URL. + // Fetches up to `max_visits` most recent visits for the passed URL. virtual bool GetMostRecentVisitsForURL(URLID id, int max_visits, VisitVector* visits); - // For each element in |urls|, updates the pre-existing URLRow in the database + // For each element in `urls`, updates the pre-existing URLRow in the database // with the same ID; or ignores the element if no such row exists. Returns the // number of records successfully updated. virtual size_t UpdateURLs(const URLRows& urls); @@ -475,7 +475,7 @@ bool GetURLByID(URLID url_id, URLRow* url_row); // Returns the sync controller delegate for syncing typed urls. The returned - // delegate is owned by |this| object. + // delegate is owned by `this` object. base::WeakPtr<syncer::ModelTypeControllerDelegate> GetTypedURLSyncControllerDelegate(); @@ -495,9 +495,9 @@ base::Time end_time, bool user_initiated); - // Finds the URLs visited at |times| and expires all their visits within - // [|begin_time|, |end_time|). All times in |times| should be in - // [|begin_time|, |end_time|). This is used when expiration request is from + // Finds the URLs visited at `times` and expires all their visits within + // [`begin_time`, `end_time`). All times in `times` should be in + // [`begin_time`, `end_time`). This is used when expiration request is from // server side, i.e. web history deletes, where only visit times (possibly // incomplete) are transmitted to protect user's privacy. void ExpireHistoryForTimes(const std::set<base::Time>& times, @@ -505,7 +505,7 @@ base::Time end_time); // Calls ExpireHistoryBetween() once for each element in the vector. - // The fields of |ExpireHistoryArgs| map directly to the arguments of + // The fields of `ExpireHistoryArgs` map directly to the arguments of // of ExpireHistoryBetween(). void ExpireHistory(const std::vector<ExpireHistoryArgs>& expire_list); @@ -699,20 +699,20 @@ bool floc_allowed, base::Optional<std::u16string> title = base::nullopt); - // Returns a redirect chain in |redirects| for the VisitID - // |cur_visit|. |cur_visit| is assumed to be valid. Assumes that + // Returns a redirect chain in `redirects` for the VisitID + // `cur_visit`. `cur_visit` is assumed to be valid. Assumes that // this HistoryBackend object has been Init()ed successfully. void GetRedirectsFromSpecificVisit(VisitID cur_visit, RedirectList* redirects); // Similar to the above function except returns a redirect list ending - // at |cur_visit|. + // at `cur_visit`. void GetRedirectsToSpecificVisit(VisitID cur_visit, RedirectList* redirects); // Updates the visit_duration information in visits table. void UpdateVisitDuration(VisitID visit_id, const base::Time end_ts); - // Returns whether |url| is on an untyped intranet host. + // Returns whether `url` is on an untyped intranet host. bool IsUntypedIntranetHost(const GURL& url); // Querying ------------------------------------------------------------------ @@ -762,19 +762,19 @@ // Favicons ------------------------------------------------------------------ - // Returns all the page URLs in the redirect chain for |page_url|. If there - // are no known redirects for |page_url|, returns a vector with |page_url|. + // Returns all the page URLs in the redirect chain for `page_url`. If there + // are no known redirects for `page_url`, returns a vector with `page_url`. RedirectList GetCachedRecentRedirects(const GURL& page_url); - // Send notification that the favicon has changed for |page_url| and all its + // Send notification that the favicon has changed for `page_url` and all its // redirects. This should be called if the mapping between the page URL // (e.g. http://www.google.com) and the icon URL (e.g. // http://www.google.com/favicon.ico) has changed. void SendFaviconChangedNotificationForPageAndRedirects(const GURL& page_url); - // Send notification that the bitmap data for the favicon at |icon_url| has + // Send notification that the bitmap data for the favicon at `icon_url` has // changed. Sending this notification is important because the favicon at - // |icon_url| may be mapped to hundreds of page URLs. + // `icon_url` may be mapped to hundreds of page URLs. void SendFaviconChangedNotificationForIconURL(const GURL& icon_url); // Generic stuff -------------------------------------------------------------
diff --git a/components/history/core/browser/history_backend_client.h b/components/history/core/browser/history_backend_client.h index 7f8bcda..75391575 100644 --- a/components/history/core/browser/history_backend_client.h +++ b/components/history/core/browser/history_backend_client.h
@@ -30,7 +30,7 @@ // Returns the set of pinned URLs with their titles. virtual std::vector<URLAndTitle> GetPinnedURLs() = 0; - // Returns whether |url| should be considered web-safe (see + // Returns whether `url` should be considered web-safe (see // content::ChildProcessSecurityPolicy). virtual bool IsWebSafe(const GURL& url) = 0;
diff --git a/components/history/core/browser/history_backend_notifier.h b/components/history/core/browser/history_backend_notifier.h index d63a68e0..077d37c 100644 --- a/components/history/core/browser/history_backend_notifier.h +++ b/components/history/core/browser/history_backend_notifier.h
@@ -24,25 +24,25 @@ // Sends notification that the favicons for the given page URLs (e.g. // http://www.google.com) and the given icon URL (e.g. // http://www.google.com/favicon.ico) have changed. It is valid to call - // NotifyFaviconsChanged() with non-empty |page_urls| and an empty |icon_url| + // NotifyFaviconsChanged() with non-empty `page_urls` and an empty `icon_url` // and vice versa. virtual void NotifyFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url) = 0; - // Sends notification that |transition| to |row| occurred at |visit_time| - // following |redirects| (empty if there is no redirects). + // Sends notification that `transition` to `row` occurred at `visit_time` + // following `redirects` (empty if there is no redirects). virtual void NotifyURLVisited(ui::PageTransition transition, const URLRow& row, const RedirectList& redirects, base::Time visit_time) = 0; - // Sends notification that |changed_urls| have been changed or added. + // Sends notification that `changed_urls` have been changed or added. virtual void NotifyURLsModified(const URLRows& changed_urls, UrlsModifiedReason reason) = 0; // Sends notification that some or the totality of the URLs have been // deleted. - // |deletion_info| describes the urls that have been removed from history. + // `deletion_info` describes the urls that have been removed from history. virtual void NotifyURLsDeleted(DeletionInfo deletion_info) = 0; };
diff --git a/components/history/core/browser/history_backend_observer.h b/components/history/core/browser/history_backend_observer.h index f0e905ad..ead1241 100644 --- a/components/history/core/browser/history_backend_observer.h +++ b/components/history/core/browser/history_backend_observer.h
@@ -19,11 +19,11 @@ // Called when user visits an URL. // - // The |row| ID will be set to the value that is currently in effect in the - // main history database. |redirects| is the list of redirects leading up to + // The `row` ID will be set to the value that is currently in effect in the + // main history database. `redirects` is the list of redirects leading up to // the URL. If we have a redirect chain A -> B -> C and user is visiting C, - // then |redirects[0]=B| and |redirects[1]=A|. If there are no redirects, - // |redirects| is an empty vector. + // then `redirects[0]=B` and `redirects[1]=A`. If there are no redirects, + // `redirects` is an empty vector. virtual void OnURLVisited(HistoryBackend* history_backend, ui::PageTransition transition, const URLRow& row, @@ -32,9 +32,9 @@ // Called when a URL has been added or modified. // - // |changed_urls| lists the information for each of the URLs affected. The + // `changed_urls` lists the information for each of the URLs affected. The // rows will have the IDs that are currently in effect in the main history - // database. |is_from_expiration| is true if the modification is caused by + // database. `is_from_expiration` is true if the modification is caused by // automatic history expiration (the visit count got reduced by expiring some // of the visits); it is false if the modification is caused by user action. virtual void OnURLsModified(HistoryBackend* history_backend, @@ -43,12 +43,12 @@ // Called when one or more of URLs are deleted. // - // |all_history| is set to true, if all the URLs are deleted. - // When set to true, |deleted_rows| and |favicon_urls| are + // `all_history` is set to true, if all the URLs are deleted. + // When set to true, `deleted_rows` and `favicon_urls` are // undefined. - // |expired| is set to true, if the URL deletion is due to expiration. - // |deleted_rows| list of the deleted URLs. - // |favicon_urls| list of favicon URLs that correspond to the deleted URLs. + // `expired` is set to true, if the URL deletion is due to expiration. + // `deleted_rows` list of the deleted URLs. + // `favicon_urls` list of favicon URLs that correspond to the deleted URLs. virtual void OnURLsDeleted(HistoryBackend* history_backend, bool all_history, bool expired,
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index 77c419d..d2628d6 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -365,12 +365,12 @@ } // Adds CLIENT_REDIRECT page transition. - // |url1| is the source URL and |url2| is the destination. - // |did_replace| is true if the transition is non-user initiated and the - // navigation entry for |url2| has replaced that for |url1|. The possibly - // updated transition code of the visit records for |url1| and |url2| is - // returned by filling in |*transition1| and |*transition2|, respectively, - // unless null. |time| is a time of the redirect. + // `url1` is the source URL and `url2` is the destination. + // `did_replace` is true if the transition is non-user initiated and the + // navigation entry for `url2` has replaced that for `url1`. The possibly + // updated transition code of the visit records for `url1` and `url2` is + // returned by filling in `*transition1` and `*transition2`, respectively, + // unless null. `time` is a time of the redirect. void AddClientRedirect(const GURL& url1, const GURL& url2, bool did_replace, @@ -397,12 +397,12 @@ } // Adds SERVER_REDIRECT page transition. - // |url1| is the source URL and |url2| is the destination. - // |did_replace| is true if the transition is non-user initiated and the - // navigation entry for |url2| has replaced that for |url1|. The possibly - // updated transition code of the visit records for |url1| and |url2| is - // returned by filling in |*transition1| and |*transition2|, respectively, - // unless null. |time| is a time of the redirect. + // `url1` is the source URL and `url2` is the destination. + // `did_replace` is true if the transition is non-user initiated and the + // navigation entry for `url2` has replaced that for `url1`. The possibly + // updated transition code of the visit records for `url1` and `url2` is + // returned by filling in `*transition1` and `*transition2`, respectively, + // unless null. `time` is a time of the redirect. void AddServerRedirect(const GURL& url1, const GURL& url2, bool did_replace, @@ -444,7 +444,7 @@ return sizes_small_and_large; } - // Returns the number of icon mappings of |icon_type| to |page_url|. + // Returns the number of icon mappings of `icon_type` to `page_url`. size_t NumIconMappingsForPageURL(const GURL& page_url, IconType icon_type) { std::vector<IconMapping> icon_mappings; favicon_db()->GetIconMappingsForPageURL(page_url, {icon_type}, @@ -452,14 +452,14 @@ return icon_mappings.size(); } - // Returns the icon mappings for |page_url|. + // Returns the icon mappings for `page_url`. std::vector<IconMapping> GetIconMappingsForPageURL(const GURL& page_url) { std::vector<IconMapping> icon_mappings; favicon_db()->GetIconMappingsForPageURL(page_url, &icon_mappings); return icon_mappings; } - // Returns the favicon bitmaps for |icon_id| sorted by pixel size in + // Returns the favicon bitmaps for `icon_id` sorted by pixel size in // ascending order. Returns true if there is at least one favicon bitmap. bool GetSortedFaviconBitmaps(favicon_base::FaviconID icon_id, std::vector<FaviconBitmap>* favicon_bitmaps) { @@ -473,7 +473,7 @@ } // Returns true if there is exactly one favicon bitmap associated to - // |favicon_id|. If true, returns favicon bitmap in output parameter. + // `favicon_id`. If true, returns favicon bitmap in output parameter. bool GetOnlyFaviconBitmap(const favicon_base::FaviconID icon_id, FaviconBitmap* favicon_bitmap) { std::vector<FaviconBitmap> favicon_bitmaps; @@ -485,7 +485,7 @@ return true; } - // Creates an |edge_size|x|edge_size| bitmap of |color|. + // Creates an `edge_size`x`edge_size` bitmap of `color`. SkBitmap CreateBitmap(SkColor color, int edge_size) { SkBitmap bitmap; bitmap.allocN32Pixels(edge_size, edge_size); @@ -493,7 +493,7 @@ return bitmap; } - // Returns true if |bitmap_data| is equal to |expected_data|. + // Returns true if `bitmap_data` is equal to `expected_data`. bool BitmapDataEqual(char expected_data, scoped_refptr<base::RefCountedMemory> bitmap_data) { return bitmap_data.get() && @@ -735,7 +735,7 @@ GURL kPageURL("http://www.google.com"); GURL kFaviconURL("http://www.google.com/favicon.ico"); - // Setup: Add visit for |kPageURL|. + // Setup: Add visit for `kPageURL`. URLRow row(kPageURL); row.set_visit_count(2); row.set_typed_count(1); @@ -743,7 +743,7 @@ backend_->AddPagesWithDetails(std::vector<URLRow>(1u, row), history::SOURCE_BROWSED); - // Setup: Add favicon for |kPageURL|. + // Setup: Add favicon for `kPageURL`. std::vector<unsigned char> data; data.push_back('a'); favicon_base::FaviconID favicon = favicon_db()->AddFavicon( @@ -765,7 +765,7 @@ kPageURL, {IconType::kFavicon}, &icon_mappings)); ASSERT_EQ(1u, icon_mappings.size()); - // Delete information for |kPageURL|, then clear all browsing data. + // Delete information for `kPageURL`, then clear all browsing data. backend_->DeleteURL(kPageURL); backend_->DeleteAllHistory(); @@ -1067,7 +1067,7 @@ rows.push_back(row4); backend_->AddPagesWithDetails(rows, history::SOURCE_BROWSED); - // Verify that recent URLs have ended up in the main |db_|, while the already + // Verify that recent URLs have ended up in the main `db_`, while the already // expired URL has been ignored. URLRow stored_row1, stored_row2, stored_row3, stored_row4; EXPECT_NE(0, backend_->db_->GetRowForURL(row1.url(), &stored_row1)); @@ -1968,7 +1968,7 @@ EXPECT_FALSE(s.Step()); } -// Test that |recent_redirects_| stores the full redirect chain in case of +// Test that `recent_redirects_` stores the full redirect chain in case of // client redirects. In this case, a server-side redirect is followed by a // client-side one. TEST_F(HistoryBackendTest, RecentRedirectsForClientRedirects) { @@ -2103,8 +2103,8 @@ backend_->SetFavicons({page_url1}, IconType::kFavicon, icon_url1, bitmaps); backend_->SetFavicons({page_url2}, IconType::kFavicon, icon_url2, bitmaps); - // Map |page_url3| to |icon_url1| so that the test does not delete the - // favicon at |icon_url1|. + // Map `page_url3` to `icon_url1` so that the test does not delete the + // favicon at `icon_url1`. std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results = backend_->UpdateFaviconMappingsAndFetch({page_url3}, icon_url1, IconType::kFavicon, @@ -2206,8 +2206,8 @@ backend_->SetFavicons({page_url1}, IconType::kFavicon, icon_url1, bitmaps); backend_->SetFavicons({page_url2}, IconType::kFavicon, icon_url2, bitmaps); - // Map |page_url3| to |icon_url1| so that the test does not delete the - // favicon at |icon_url1|. + // Map `page_url3` to `icon_url1` so that the test does not delete the + // favicon at `icon_url1`. std::vector<favicon_base::FaviconRawBitmapResult> bitmap_results = backend_->UpdateFaviconMappingsAndFetch({page_url3}, icon_url1, IconType::kFavicon, @@ -2264,17 +2264,17 @@ new base::RefCountedBytes(png_bytes2), kLargeSize); ClearBroadcastedNotifications(); - // Calling MergeFavicon() with |page_url2|, |icon_url1|, |png_bytes1| and - // |kSmallSize| should cause the large favicon bitmap from |icon_url2| to - // be copied to |icon_url1|. + // Calling MergeFavicon() with `page_url2`, `icon_url1`, `png_bytes1` and + // `kSmallSize` should cause the large favicon bitmap from `icon_url2` to + // be copied to `icon_url1`. backend_->MergeFavicon(page_url2, icon_url1, IconType::kFavicon, new base::RefCountedBytes(png_bytes1), kSmallSize); ASSERT_EQ(1u, favicon_changed_notifications_page_urls().size()); EXPECT_EQ(page_url2, favicon_changed_notifications_page_urls()[0]); - // A favicon bitmap was copied to the favicon at |icon_url1|. A notification - // that the favicon at |icon_url1| has changed should be sent. + // A favicon bitmap was copied to the favicon at `icon_url1`. A notification + // that the favicon at `icon_url1` has changed should be sent. ASSERT_EQ(1u, favicon_changed_notifications_icon_urls().size()); EXPECT_EQ(icon_url1, favicon_changed_notifications_icon_urls()[0]); } @@ -2327,7 +2327,7 @@ // Setup { - // A mapping exists for |landing_page_url1|. + // A mapping exists for `landing_page_url1`. std::vector<favicon_base::FaviconRawBitmapData> favicon_bitmap_data; backend_->SetFavicons({landing_page_url1}, IconType::kFavicon, icon_url, {CreateBitmap(SK_ColorBLUE, kSmallEdgeSize)});
diff --git a/components/history/core/browser/history_database.h b/components/history/core/browser/history_database.h index b83f8370..4dd4a57 100644 --- a/components/history/core/browser/history_database.h +++ b/components/history/core/browser/history_database.h
@@ -93,7 +93,7 @@ int CountUniqueHostsVisitedLastMonth(); // Counts the number of unique domains (eLTD+1) visited within - // [|begin_time|, |end_time|). + // [`begin_time`, `end_time`). int CountUniqueDomainsVisited(base::Time begin_time, base::Time end_time); // Call to set the mode on the database to exclusive. The default locking mode @@ -172,7 +172,7 @@ private: #if defined(OS_ANDROID) - // AndroidProviderBackend uses the |db_|. + // AndroidProviderBackend uses the `db_`. friend class AndroidProviderBackend; FRIEND_TEST_ALL_PREFIXES(AndroidURLsMigrationTest, MigrateToVersion22); #endif
diff --git a/components/history/core/browser/history_querying_unittest.cc b/components/history/core/browser/history_querying_unittest.cc index 8c75bf5..25f0063 100644 --- a/components/history/core/browser/history_querying_unittest.cc +++ b/components/history/core/browser/history_querying_unittest.cc
@@ -128,7 +128,7 @@ options.end_time = results.back().visit_time(); } - // Add a couple of entries with duplicate timestamps. Use |query_text| as + // Add a couple of entries with duplicate timestamps. Use `query_text` as // the title of both entries so that they match a text query. TestEntry duplicates[] = { { "http://www.google.com/x", query_text.c_str(), 1, }, @@ -266,7 +266,7 @@ QueryHistory("some", options, &results); EXPECT_FALSE(results.reached_beginning()); - // Try |begin_time| just later than the oldest visit. + // Try `begin_time` just later than the oldest visit. options.begin_time = test_entries[0].time + base::TimeDelta::FromMicroseconds(1); QueryHistory(std::string(), options, &results); @@ -274,14 +274,14 @@ QueryHistory("some", options, &results); EXPECT_FALSE(results.reached_beginning()); - // Try |begin_time| equal to the oldest visit. + // Try `begin_time` equal to the oldest visit. options.begin_time = test_entries[0].time; QueryHistory(std::string(), options, &results); EXPECT_TRUE(results.reached_beginning()); QueryHistory("some", options, &results); EXPECT_TRUE(results.reached_beginning()); - // Try |begin_time| just earlier than the oldest visit. + // Try `begin_time` just earlier than the oldest visit. options.begin_time = test_entries[0].time - base::TimeDelta::FromMicroseconds(1); QueryHistory(std::string(), options, &results); @@ -289,14 +289,14 @@ QueryHistory("some", options, &results); EXPECT_TRUE(results.reached_beginning()); - // Test with |max_count| specified. + // Test with `max_count` specified. options.max_count = 1; QueryHistory(std::string(), options, &results); EXPECT_FALSE(results.reached_beginning()); QueryHistory("some", options, &results); EXPECT_FALSE(results.reached_beginning()); - // Test with |max_count| greater than the number of results, + // Test with `max_count` greater than the number of results, // and exactly equal to the number of results. options.max_count = 100; QueryHistory(std::string(), options, &results);
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index bc8543b..69f7bf51 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -1005,7 +1005,7 @@ std::move(history_backend_))); } - // Clear |backend_task_runner_| to make sure it's not used after Cleanup(). + // Clear `backend_task_runner_` to make sure it's not used after Cleanup(). backend_task_runner_ = nullptr; } @@ -1015,7 +1015,7 @@ TRACE_EVENT0("browser,startup", "HistoryService::Init"); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // Unit tests can inject |backend_task_runner_| before this is called. + // Unit tests can inject `backend_task_runner_` before this is called. if (!backend_task_runner_) { backend_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::WithBaseSyncPrimitives(), @@ -1186,7 +1186,7 @@ // Attempt online deletion from the history server, but ignore the result. // Deletion directives ensure that the results will eventually be deleted. // - // TODO(davidben): |callback| should not run until this operation completes + // TODO(davidben): `callback` should not run until this operation completes // too. net::PartialNetworkTrafficAnnotationTag partial_traffic_annotation = net::DefinePartialNetworkTrafficAnnotation(
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index 65ea15cc..dabb6d8 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -83,8 +83,8 @@ class HistoryService : public KeyedService { public: // Must call Init after construction. The empty constructor provided only for - // unit tests. When using the full constructor, |history_client| may only be - // null during testing, while |visit_delegate| may be null if the embedder use + // unit tests. When using the full constructor, `history_client` may only be + // null during testing, while `visit_delegate` may be null if the embedder use // another way to track visited links. HistoryService(); HistoryService(std::unique_ptr<HistoryClient> history_client, @@ -140,7 +140,7 @@ using GetCountsAndLastVisitForOriginsCallback = base::OnceCallback<void(OriginCountAndLastVisitMap)>; - // Gets the counts and most recent visit date of URLs that belong to |origins| + // Gets the counts and most recent visit date of URLs that belong to `origins` // in the history database. void GetCountsAndLastVisitForOriginsForTesting( const std::set<GURL>& origins, @@ -160,7 +160,7 @@ // should be the unique ID of the current navigation entry in the given // process. // - // |floc_allowed| indicates whether this URL visit can be included in FLoC + // `floc_allowed` indicates whether this URL visit can be included in FLoC // computation. See VisitRow::floc_allowed for details. // TODO(yaoxia): Remove the floc_allowed param from this API as well as from // HistoryAddPageArgs. This bit will never be set at this point. @@ -237,7 +237,7 @@ // Queries the basic information about the URL in the history database. If // the caller is interested in the visits (each time the URL is visited), - // set |want_visits| to true. If these are not needed, the function will be + // set `want_visits` to true. If these are not needed, the function will be // faster by setting this to false. base::CancelableTaskTracker::TaskId QueryURL( const GURL& url, @@ -288,7 +288,7 @@ base::CancelableTaskTracker* tracker); // Requests the number of user-visible visits (i.e. no redirects or subframes) - // to all urls on the same scheme/host/port as |url|. This is only valid for + // to all urls on the same scheme/host/port as `url`. This is only valid for // HTTP and HTTPS URLs. using GetVisibleVisitCountToHostCallback = base::OnceCallback<void(VisibleVisitCountToHostResult)>; @@ -298,8 +298,8 @@ GetVisibleVisitCountToHostCallback callback, base::CancelableTaskTracker* tracker); - // Request the |result_count| most visited URLs and the chain of - // redirects leading to each of these URLs. |days_back| is the + // Request the `result_count` most visited URLs and the chain of + // redirects leading to each of these URLs. `days_back` is the // number of days of history to use. Used by TopSites. using QueryMostVisitedURLsCallback = base::OnceCallback<void(MostVisitedURLList)>; @@ -313,7 +313,7 @@ // Statistics ---------------------------------------------------------------- // Gets the number of URLs as seen in chrome://history within the time range - // [|begin_time|, |end_time|). Each URL is counted only once per day. For + // [`begin_time`, `end_time`). Each URL is counted only once per day. For // determination of the date, timestamps are converted to dates using local // time. using GetHistoryCountCallback = base::OnceCallback<void(HistoryCountResult)>; @@ -328,10 +328,10 @@ void CountUniqueHostsVisitedLastMonth(GetHistoryCountCallback callback, base::CancelableTaskTracker* tracker); - // For each of the continuous |number_of_days_to_report| midnights - // immediately preceding |report_time| (inclusive), report (a subset of) the + // For each of the continuous `number_of_days_to_report` midnights + // immediately preceding `report_time` (inclusive), report (a subset of) the // last 1-day, 7-day and 28-day domain visit counts ending at that midnight. - // The subset of metric types to report is specified by |metric_type_bitmask|. + // The subset of metric types to report is specified by `metric_type_bitmask`. void GetDomainDiversity(base::Time report_time, int number_of_days_to_report, DomainMetricBitmaskType metric_type_bitmask, @@ -341,7 +341,7 @@ using GetLastVisitCallback = base::OnceCallback<void(HistoryLastVisitResult)>; // Gets the last time any webpage on the given host was visited within the - // time range [|begin_time|, |end_time|). If the given host has not been + // time range [`begin_time`, `end_time`). If the given host has not been // visited in the given time range, the callback will be called with a null // base::Time. base::CancelableTaskTracker::TaskId GetLastVisitToHost( @@ -351,7 +351,7 @@ GetLastVisitCallback callback, base::CancelableTaskTracker* tracker); - // Gets the last time |url| was visited before |end_time|. If the given URL + // Gets the last time `url` was visited before `end_time`. If the given URL // has not been visited in the past, the callback will be called with a null // base::Time. base::CancelableTaskTracker::TaskId GetLastVisitToURL( @@ -383,10 +383,10 @@ // Removes all visits in the selected time range (including the // start time), updating the URLs accordingly. This deletes any // associated data. This function also deletes the associated - // favicons, if they are no longer referenced. |callback| runs when + // favicons, if they are no longer referenced. `callback` runs when // the expiration is complete. You may use null Time values to do an // unbounded delete in either direction. - // If |restrict_urls| is not empty, only visits to the URLs in this set are + // If `restrict_urls` is not empty, only visits to the URLs in this set are // removed. void ExpireHistoryBetween(const std::set<GURL>& restrict_urls, base::Time begin_time, @@ -397,7 +397,7 @@ // Removes all visits to specified URLs in specific time ranges. // This is the equivalent ExpireHistoryBetween() once for each element in the - // vector. The fields of |ExpireHistoryArgs| map directly to the arguments of + // vector. The fields of `ExpireHistoryArgs` map directly to the arguments of // of ExpireHistoryBetween(). void ExpireHistory(const std::vector<ExpireHistoryArgs>& expire_list, base::OnceClosure callback, @@ -410,7 +410,7 @@ base::CancelableTaskTracker* tracker); // Mark all favicons as out of date that have been modified at or after - // |begin| and before |end|. Calls |callback| when done. + // `begin` and before `end`. Calls `callback` when done. void SetFaviconsOutOfDateBetween(base::Time begin, base::Time end, base::OnceClosure callback, @@ -429,7 +429,7 @@ // visits and handles deletion of synced visits if appropriate. void DeleteLocalAndRemoteUrl(WebHistoryService* web_history, const GURL& url); - // Processes the given |delete_directive| and sends it to the + // Processes the given `delete_directive` and sends it to the // SyncChangeProcessor (if it exists). void ProcessLocalDeleteDirective( const sync_pb::HistoryDeleteDirectiveSpecifics& delete_directive); @@ -485,11 +485,11 @@ // Deletes all search terms for the specified keyword. void DeleteAllSearchTermsForKeyword(KeywordID keyword_id); - // Deletes any search term corresponding to |url|. + // Deletes any search term corresponding to `url`. void DeleteKeywordSearchTermForURL(const GURL& url); - // Deletes all URL and search term entries matching the given |term| and - // |keyword_id|. + // Deletes all URL and search term entries matching the given `term` and + // `keyword_id`. void DeleteMatchingURLsForKeyword(KeywordID keyword_id, const std::u16string& term); @@ -500,10 +500,10 @@ // Clusters ------------------------------------------------------------------ - // Add a |ClusterVisitRow|. + // Add a `ClusterVisitRow`. void AddClusterVisit(const ClusterVisitRow& row); - // Get all |ClusterVisitRow|s and map them to |ClusterVisit|s. + // Get all `ClusterVisitRow`s and map them to `ClusterVisit`s. using GetClusterVisitsCallback = base::OnceCallback<void(std::vector<ClusterVisit>)>; base::CancelableTaskTracker::TaskId GetClusterVisits( @@ -520,7 +520,7 @@ // Generic Stuff ------------------------------------------------------------- // Schedules a HistoryDBTask for running on the history backend. See - // HistoryDBTask for details on what this does. Takes ownership of |task|. + // HistoryDBTask for details on what this does. Takes ownership of `task`. virtual base::CancelableTaskTracker::TaskId ScheduleDBTask( const base::Location& from_here, std::unique_ptr<HistoryDBTask> task, @@ -543,7 +543,7 @@ // Testing ------------------------------------------------------------------- - // Runs |flushed| after the backend has processed all other pre-existing + // Runs `flushed` after the backend has processed all other pre-existing // tasks. void FlushForTest(base::OnceClosure flushed); @@ -566,8 +566,8 @@ // instead. // // Note that this routine (and AddPageWithDetails()) always adds a single - // visit using the |last_visit| timestamp, and a PageTransition type of LINK, - // if |visit_source| != SYNCED. + // visit using the `last_visit` timestamp, and a PageTransition type of LINK, + // if `visit_source` != SYNCED. void AddPageWithDetails(const GURL& url, const std::u16string& title, int visit_count, @@ -590,7 +590,7 @@ std::unique_ptr<syncer::ModelTypeControllerDelegate> GetTypedURLSyncControllerDelegate(); - // Override |backend_task_runner_| for testing; needs to be called before + // Override `backend_task_runner_` for testing; needs to be called before // Init. void set_backend_task_runner_for_testing( scoped_refptr<base::SequencedTaskRunner> task_runner) { @@ -638,7 +638,7 @@ // still in memory (pending requests may be holding a reference to us). void Cleanup(); - // Low-level Init(). Same as the public version, but adds a |no_db| parameter + // Low-level Init(). Same as the public version, but adds a `no_db` parameter // that is only set by unittests which causes the backend to not init its DB. bool Init(bool no_db, const HistoryDatabaseParams& history_database_params); @@ -655,23 +655,23 @@ // Observers ---------------------------------------------------------------- // Notify all HistoryServiceObservers registered that user is visiting a URL. - // The |row| ID will be set to the value that is currently in effect in the - // main history database. |redirects| is the list of redirects leading up to + // The `row` ID will be set to the value that is currently in effect in the + // main history database. `redirects` is the list of redirects leading up to // the URL. If we have a redirect chain A -> B -> C and user is visiting C, - // then |redirects[0]=B| and |redirects[1]=A|. If there are no redirects, - // |redirects| is an empty vector. + // then `redirects[0]=B` and `redirects[1]=A`. If there are no redirects, + // `redirects` is an empty vector. void NotifyURLVisited(ui::PageTransition transition, const URLRow& row, const RedirectList& redirects, base::Time visit_time); // Notify all HistoryServiceObservers registered that URLs have been added or - // modified. |changed_urls| contains the list of affects URLs. + // modified. `changed_urls` contains the list of affects URLs. void NotifyURLsModified(const URLRows& changed_urls, UrlsModifiedReason reason); // Notify all HistoryServiceObservers registered that URLs have been deleted. - // |deletion_info| describes the urls that have been removed from history. + // `deletion_info` describes the urls that have been removed from history. void NotifyURLsDeleted(const DeletionInfo& deletion_info); // Notify all HistoryServiceObservers registered that the @@ -683,14 +683,14 @@ void NotifyHistoryServiceBeingDeleted(); // Notify all HistoryServiceObservers registered that a keyword search term - // has been updated. |row| contains the URL information for search |term|. - // |keyword_id| associated with a URL and search term. + // has been updated. `row` contains the URL information for search `term`. + // `keyword_id` associated with a URL and search term. void NotifyKeywordSearchTermUpdated(const URLRow& row, KeywordID keyword_id, const std::u16string& term); // Notify all HistoryServiceObservers registered that keyword search term is - // deleted. |url_id| is the id of the url row. + // deleted. `url_id` is the id of the url row. void NotifyKeywordSearchTermDeleted(URLID url_id); // Favicon ------------------------------------------------------------------- @@ -700,11 +700,11 @@ // FaviconService. // Used by FaviconService to get the favicon bitmaps from the history backend - // whose edge sizes most closely match |desired_sizes| for |icon_type|. If - // |desired_sizes| has a '0' entry, the largest favicon bitmap for - // |icon_type| is returned. The returned FaviconBitmapResults will have at - // most one result for each entry in |desired_sizes|. If a favicon bitmap is - // determined to be the best candidate for multiple |desired_sizes| there will + // whose edge sizes most closely match `desired_sizes` for `icon_type`. If + // `desired_sizes` has a '0' entry, the largest favicon bitmap for + // `icon_type` is returned. The returned FaviconBitmapResults will have at + // most one result for each entry in `desired_sizes`. If a favicon bitmap is + // determined to be the best candidate for multiple `desired_sizes` there will // be fewer results. base::CancelableTaskTracker::TaskId GetFavicon( const GURL& icon_url, @@ -713,18 +713,18 @@ favicon_base::FaviconResultsCallback callback, base::CancelableTaskTracker* tracker); - // Used by the FaviconService to get favicons mapped to |page_url| for - // |icon_types| whose edge sizes most closely match |desired_sizes|. If - // |desired_sizes| has a '0' entry, the largest favicon bitmap for - // |icon_types| is returned. The returned FaviconBitmapResults will have at - // most one result for each entry in |desired_sizes|. If a favicon bitmap is - // determined to be the best candidate for multiple |desired_sizes| there - // will be fewer results. If |fallback_to_host| is true, the host of - // |page_url| will be used to search the favicon database if an exact match + // Used by the FaviconService to get favicons mapped to `page_url` for + // `icon_types` whose edge sizes most closely match `desired_sizes`. If + // `desired_sizes` has a '0' entry, the largest favicon bitmap for + // `icon_types` is returned. The returned FaviconBitmapResults will have at + // most one result for each entry in `desired_sizes`. If a favicon bitmap is + // determined to be the best candidate for multiple `desired_sizes` there + // will be fewer results. If `fallback_to_host` is true, the host of + // `page_url` will be used to search the favicon database if an exact match // cannot be found. Generally, code showing an icon for a full/previously - // visited URL should set |fallback_to_host|=false. Otherwise, if only a host + // visited URL should set `fallback_to_host`=false. Otherwise, if only a host // is available, and any icon matching the host is permissible, use - // |fallback_to_host|=true. + // `fallback_to_host`=true. base::CancelableTaskTracker::TaskId GetFaviconsForURL( const GURL& page_url, const favicon_base::IconTypeSet& icon_types, @@ -734,14 +734,14 @@ base::CancelableTaskTracker* tracker); // Used by FaviconService to find the first favicon bitmap whose width and - // height are greater than that of |minimum_size_in_pixels|. This searches - // for icons by IconType. Each element of |icon_types| is a bitmask of + // height are greater than that of `minimum_size_in_pixels`. This searches + // for icons by IconType. Each element of `icon_types` is a bitmask of // IconTypes indicating the types to search for. - // If the largest icon of |icon_types[0]| is not larger than - // |minimum_size_in_pixel|, the next icon types of - // |icon_types| will be searched and so on. - // If no icon is larger than |minimum_size_in_pixel|, the largest one of all - // icon types in |icon_types| is returned. + // If the largest icon of `icon_types[0]` is not larger than + // `minimum_size_in_pixel`, the next icon types of + // `icon_types` will be searched and so on. + // If no icon is larger than `minimum_size_in_pixel`, the largest one of all + // icon types in `icon_types` is returned. // This feature is especially useful when some types of icon is preferred as // long as its size is larger than a specific value. base::CancelableTaskTracker::TaskId GetLargestFaviconForURL( @@ -752,20 +752,20 @@ base::CancelableTaskTracker* tracker); // Used by the FaviconService to get the favicon bitmap which most closely - // matches |desired_size| from the favicon with |favicon_id| from the history - // backend. If |desired_size| is 0, the largest favicon bitmap for - // |favicon_id| is returned. + // matches `desired_size` from the favicon with `favicon_id` from the history + // backend. If `desired_size` is 0, the largest favicon bitmap for + // `favicon_id` is returned. base::CancelableTaskTracker::TaskId GetFaviconForID( favicon_base::FaviconID favicon_id, int desired_size, favicon_base::FaviconResultsCallback callback, base::CancelableTaskTracker* tracker); - // Maps |page_urls| to the favicon at |icon_url| if there is an entry in the - // database for |icon_url| and |icon_type|. This occurs when there is a - // mapping from a different page URL to |icon_url|. The favicon bitmaps whose - // edge sizes most closely match |desired_sizes| from the favicons which were - // just mapped to |page_urls| are returned. If |desired_sizes| has a '0' + // Maps `page_urls` to the favicon at `icon_url` if there is an entry in the + // database for `icon_url` and `icon_type`. This occurs when there is a + // mapping from a different page URL to `icon_url`. The favicon bitmaps whose + // edge sizes most closely match `desired_sizes` from the favicons which were + // just mapped to `page_urls` are returned. If `desired_sizes` has a '0' // entry, the largest favicon bitmap is returned. base::CancelableTaskTracker::TaskId UpdateFaviconMappingsAndFetch( const base::flat_set<GURL>& page_urls, @@ -775,28 +775,28 @@ favicon_base::FaviconResultsCallback callback, base::CancelableTaskTracker* tracker); - // Deletes favicon mappings for each URL in |page_urls| and their redirects. + // Deletes favicon mappings for each URL in `page_urls` and their redirects. void DeleteFaviconMappings(const base::flat_set<GURL>& page_urls, favicon_base::IconType icon_type); - // Used by FaviconService to set a favicon for |page_url| and |icon_url| with - // |pixel_size|. + // Used by FaviconService to set a favicon for `page_url` and `icon_url` with + // `pixel_size`. // Example: - // |page_url|: www.google.com - // 2 favicons in history for |page_url|: + // `page_url`: www.google.com + // 2 favicons in history for `page_url`: // www.google.com/a.ico 16x16 // www.google.com/b.ico 32x32 - // MergeFavicon(|page_url|, www.google.com/a.ico, ..., ..., 16x16) + // MergeFavicon(`page_url`, www.google.com/a.ico, ..., ..., 16x16) // // Merging occurs in the following manner: - // 1) |page_url| is set to map to only to |icon_url|. In order to not lose - // data, favicon bitmaps mapped to |page_url| but not to |icon_url| are - // copied to the favicon at |icon_url|. - // For the example above, |page_url| will only be mapped to a.ico. + // 1) `page_url` is set to map to only to `icon_url`. In order to not lose + // data, favicon bitmaps mapped to `page_url` but not to `icon_url` are + // copied to the favicon at `icon_url`. + // For the example above, `page_url` will only be mapped to a.ico. // The 32x32 favicon bitmap at b.ico is copied to a.ico - // 2) |bitmap_data| is added to the favicon at |icon_url|, overwriting any - // favicon bitmaps of |pixel_size|. - // For the example above, |bitmap_data| overwrites the 16x16 favicon + // 2) `bitmap_data` is added to the favicon at `icon_url`, overwriting any + // favicon bitmaps of `pixel_size`. + // For the example above, `bitmap_data` overwrites the 16x16 favicon // bitmap for a.ico. // TODO(pkotwicz): Remove once no longer required by sync. void MergeFavicon(const GURL& page_url, @@ -806,39 +806,39 @@ const gfx::Size& pixel_size); // Used by the FaviconService to replace the favicon bitmaps mapped to all - // URLs in |page_urls| for |icon_type|. - // Use MergeFavicon() if |bitmaps| is incomplete, and favicon bitmaps in the + // URLs in `page_urls` for `icon_type`. + // Use MergeFavicon() if `bitmaps` is incomplete, and favicon bitmaps in the // database should be preserved if possible. For instance, favicon bitmaps // from sync are 1x only. MergeFavicon() is used to avoid deleting the 2x - // favicon bitmap if it is present in the history backend. |page_urls| must + // favicon bitmap if it is present in the history backend. `page_urls` must // not be empty. void SetFavicons(const base::flat_set<GURL>& page_urls, favicon_base::IconType icon_type, const GURL& icon_url, const std::vector<SkBitmap>& bitmaps); - // Causes each page in |page_urls_to_write| to be associated to the same - // icon as the page |page_url_to_read| for icon types matching |icon_types|. - // No-op if |page_url_to_read| has no mappings for |icon_types|. + // Causes each page in `page_urls_to_write` to be associated to the same + // icon as the page `page_url_to_read` for icon types matching `icon_types`. + // No-op if `page_url_to_read` has no mappings for `icon_types`. void CloneFaviconMappingsForPages( const GURL& page_url_to_read, const favicon_base::IconTypeSet& icon_types, const base::flat_set<GURL>& page_urls_to_write); // Figures out whether an on-demand favicon can be written for provided - // |page_url| and returns the result via |callback|. The result is false if - // there is an existing cached favicon for |icon_type| or if there is a - // non-expired icon of *any* type for |page_url|. + // `page_url` and returns the result via `callback`. The result is false if + // there is an existing cached favicon for `icon_type` or if there is a + // non-expired icon of *any* type for `page_url`. void CanSetOnDemandFavicons(const GURL& page_url, favicon_base::IconType icon_type, base::OnceCallback<void(bool)> callback); // Same as SetFavicons with three differences: // 1) It will be a no-op if CanSetOnDemandFavicons() returns false. - // 2) If |icon_url| is known to the database, |bitmaps| will be ignored (i.e. - // the icon won't be overwritten) but the mappings from |page_url| to - // |icon_url| will be stored (conditioned to point 1 above). - // 3) If |icon_url| is stored, it will be marked as "on-demand". + // 2) If `icon_url` is known to the database, `bitmaps` will be ignored (i.e. + // the icon won't be overwritten) but the mappings from `page_url` to + // `icon_url` will be stored (conditioned to point 1 above). + // 3) If `icon_url` is stored, it will be marked as "on-demand". // // On-demand favicons are those that are fetched without visiting their page. // For this reason, their life-time cannot be bound to the life-time of the @@ -860,7 +860,7 @@ // of date. void SetFaviconsOutOfDateForPage(const GURL& page_url); - // Mark that the on-demand favicon at |icon_url| was requested now. This + // Mark that the on-demand favicon at `icon_url` was requested now. This // postpones the automatic eviction of the favicon from the database. Not all // calls end up in a write into the DB: // - it is no-op if the bitmaps are not stored using SetOnDemandFavicons(); @@ -890,7 +890,7 @@ // Called when the favicons for the given page URLs (e.g. // http://www.google.com) and the given icon URL (e.g. // http://www.google.com/favicon.ico) have changed. It is valid to call - // NotifyFaviconsChanged() with non-empty |page_urls| and an empty |icon_url| + // NotifyFaviconsChanged() with non-empty `page_urls` and an empty `icon_url` // and vice versa. void NotifyFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url); @@ -902,7 +902,7 @@ scoped_refptr<base::SequencedTaskRunner> backend_task_runner_; // This class has most of the implementation. You MUST communicate with this - // class ONLY through |backend_task_runner_|. + // class ONLY through `backend_task_runner_`. // // This pointer will be null once Cleanup() has been called, meaning no // more tasks should be scheduled.
diff --git a/components/history/core/browser/history_service_observer.h b/components/history/core/browser/history_service_observer.h index 45d79550..6f5cd13 100644 --- a/components/history/core/browser/history_service_observer.h +++ b/components/history/core/browser/history_service_observer.h
@@ -20,11 +20,11 @@ // Called when user visits an URL. // - // The |row| ID will be set to the value that is currently in effect in the - // main history database. |redirects| is the list of redirects leading up to + // The `row` ID will be set to the value that is currently in effect in the + // main history database. `redirects` is the list of redirects leading up to // the URL. If we have a redirect chain A -> B -> C and user is visiting C, - // then |redirects[0]=B| and |redirects[1]=A|. If there are no redirects, - // |redirects| is an empty vector. + // then `redirects[0]=B` and `redirects[1]=A`. If there are no redirects, + // `redirects` is an empty vector. virtual void OnURLVisited(HistoryService* history_service, ui::PageTransition transition, const URLRow& row, @@ -33,7 +33,7 @@ // Called when a URL has been added or modified. // - // |changed_urls| lists the information for each of the URLs affected. The + // `changed_urls` lists the information for each of the URLs affected. The // rows will have the IDs that are currently in effect in the main history // database. virtual void OnURLsModified(HistoryService* history_service, @@ -47,27 +47,27 @@ // Called when one or more URLs are deleted. // - // |deletion_info| describes the urls that have been removed from history. + // `deletion_info` describes the urls that have been removed from history. virtual void OnURLsDeleted(HistoryService* history_service, const DeletionInfo& deletion_info) {} - // Is called to notify when |history_service| has finished loading. + // Is called to notify when `history_service` has finished loading. virtual void OnHistoryServiceLoaded(HistoryService* history_service) {} - // Is called to notify when |history_service| is being deleted. + // Is called to notify when `history_service` is being deleted. virtual void HistoryServiceBeingDeleted(HistoryService* history_service) {} // Sent when a keyword search term is updated. // - // |row| contains the URL information for search |term|. - // |keyword_id| associated with a URL and search term. + // `row` contains the URL information for search `term`. + // `keyword_id` associated with a URL and search term. virtual void OnKeywordSearchTermUpdated(HistoryService* history_service, const URLRow& row, KeywordID keyword_id, const std::u16string& term) {} // Sent when a keyword search term is deleted. - // |url_id| is the id of the url row. + // `url_id` is the id of the url row. virtual void OnKeywordSearchTermDeleted(HistoryService* history_service, URLID url_id) {}
diff --git a/components/history/core/browser/history_service_unittest.cc b/components/history/core/browser/history_service_unittest.cc index 3cc333bc..91993fe2 100644 --- a/components/history/core/browser/history_service_unittest.cc +++ b/components/history/core/browser/history_service_unittest.cc
@@ -760,8 +760,8 @@ base::Time query_time = base::Time::Now(); - // Make sure |query_time| is at least some time past the midnight so that - // some domain visits can be inserted between |query_time| and midnight + // Make sure `query_time` is at least some time past the midnight so that + // some domain visits can be inserted between `query_time` and midnight // for testing. query_time = std::max(query_time.LocalMidnight() + base::TimeDelta::FromMinutes(10), @@ -791,7 +791,7 @@ GetTimeInThePast(query_time, 1, 8)); AddPageAtTime(history, "http://ak/", GetTimeInThePast(query_time, 1, 14)); - // Should return empty result if |begin_time| == |end_time|. + // Should return empty result if `begin_time` == `end_time`. DomainDiversityResults res = GetDomainDiversityHelper( history, query_time, query_time, history::kEnableLast1DayMetric | history::kEnableLast7DayMetric |
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index d68f385..f0fff2fc 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -161,12 +161,12 @@ } // Returns a pointer to the beginning of an array of all matching indices - // for entries with the given URL. The array will be |*num_matches| long. - // |num_matches| can be NULL if the caller is not interested in the number of + // for entries with the given URL. The array will be `*num_matches` long. + // `num_matches` can be NULL if the caller is not interested in the number of // results (commonly it will only be interested in the first one and can test // the pointer for NULL). // - // When there is no match, it will return NULL and |*num_matches| will be 0. + // When there is no match, it will return NULL and `*num_matches` will be 0. const size_t* MatchesForURL(const GURL& url, size_t* num_matches) const; // Swaps the current result with another. This allows ownership to be @@ -190,11 +190,11 @@ // memory when possible. typedef std::map<GURL, base::StackVector<size_t, 4>> URLToResultIndices; - // Inserts an entry into the |url_to_results_| map saying that the given URL + // Inserts an entry into the `url_to_results_` map saying that the given URL // is at the given index in the results_. void AddURLUsageAtIndex(const GURL& url, size_t index); - // Adds |delta| to each index in url_to_results_ in the range [begin,end] + // Adds `delta` to each index in url_to_results_ in the range [begin,end] // (this is inclusive). This is used when inserting or deleting. void AdjustResultMap(size_t begin, size_t end, ptrdiff_t delta); @@ -227,7 +227,7 @@ base::Time begin_time; base::Time end_time; - // Sets the query time to the last |days_ago| days to the present time. + // Sets the query time to the last `days_ago` days to the present time. void SetRecentDayRange(int days_ago); // The maximum number of results to return. The results will be sorted with @@ -276,7 +276,7 @@ ~QueryURLResult(); // Indicates whether the call to HistoryBackend::QueryURL was successful - // or not. If false, then both |row| and |visits| fields are undefined. + // or not. If false, then both `row` and `visits` fields are undefined. bool success = false; URLRow row; VisitVector visits; @@ -288,7 +288,7 @@ // HistoryBackend::GetVisibleVisitCountToHost. struct VisibleVisitCountToHostResult { // Indicates whether the call to HistoryBackend::GetVisibleVisitCountToHost - // was successful or not. If false, then both |count| and |first_visit| are + // was successful or not. If false, then both `count` and `first_visit` are // undefined. bool success = false; int count = 0; @@ -423,7 +423,7 @@ // HistoryBackend::GetHistoryCount or // HistoryBackend::CountUniqueHostsVisitedLastMonth. struct HistoryCountResult { - // Indicates whether the call was successful or not. If false, then |count| + // Indicates whether the call was successful or not. If false, then `count` // is undefined. bool success = false; int count = 0; @@ -481,9 +481,9 @@ struct HistoryLastVisitResult { // Indicates whether the call was successful or not. This can happen if there // are internal database errors or the query was called with invalid - // arguments. |success| will be true and |last_visit| will be null if - // the host was never visited before. |last_visit| will always be null if - // |success| is false. + // arguments. `success` will be true and `last_visit` will be null if + // the host was never visited before. `last_visit` will always be null if + // `success` is false. bool success = false; base::Time last_visit; }; @@ -506,8 +506,8 @@ ExpireHistoryArgs(const ExpireHistoryArgs& other); ~ExpireHistoryArgs(); - // Sets |begin_time| and |end_time| to the beginning and end of the day (in - // local time) on which |time| occurs. + // Sets `begin_time` and `end_time` to the beginning and end of the day (in + // local time) on which `time` occurs. void SetTimeRangeForOneDay(base::Time time); std::set<GURL> urls; @@ -515,7 +515,7 @@ base::Time end_time; }; -// Represents the time range of a history deletion. If |IsValid()| is false, +// Represents the time range of a history deletion. If `IsValid()` is false, // the time range doesn't apply to this deletion e.g. because only a list of // urls was deleted. class DeletionTimeRange { @@ -555,11 +555,11 @@ }; // Describes the urls that have been removed due to a history deletion. -// If |IsAllHistory()| returns true, all urls haven been deleted. -// In this case, |deleted_rows()| and |favicon_urls()| are undefined. -// Otherwise |deleted_rows()| contains the urls where all visits have been +// If `IsAllHistory()` returns true, all urls haven been deleted. +// In this case, `deleted_rows()` and `favicon_urls()` are undefined. +// Otherwise `deleted_rows()` contains the urls where all visits have been // removed from history. -// If |expired()| returns true, this deletion is due to a regularly performed +// If `expired()` returns true, this deletion is due to a regularly performed // history expiration. Otherwise it is an explicit deletion due to a user // action. class DeletionInfo { @@ -581,15 +581,15 @@ DeletionInfo(DeletionInfo&& other) noexcept; DeletionInfo& operator=(DeletionInfo&& rhs) noexcept; - // If IsAllHistory() returns true, all URLs are deleted and |deleted_rows()| - // and |favicon_urls()| are undefined. + // If IsAllHistory() returns true, all URLs are deleted and `deleted_rows()` + // and `favicon_urls()` are undefined. bool IsAllHistory() const { return time_range_.IsAllTime(); } - // If time_range.IsValid() is true, |restrict_urls| (or all URLs if empty) + // If time_range.IsValid() is true, `restrict_urls` (or all URLs if empty) // between time_range.begin() and time_range.end() have been removed. const DeletionTimeRange& time_range() const { return time_range_; } - // Restricts deletions within |time_range()|. + // Restricts deletions within `time_range()`. const base::Optional<std::set<GURL>>& restrict_urls() const { return restrict_urls_; } @@ -598,11 +598,11 @@ bool is_from_expiration() const { return is_from_expiration_; } // Returns the list of the deleted URLs. - // Undefined if |IsAllHistory()| returns true. + // Undefined if `IsAllHistory()` returns true. const URLRows& deleted_rows() const { return deleted_rows_; } // Returns the list of favicon URLs that correspond to the deleted URLs. - // Undefined if |IsAllHistory()| returns true. + // Undefined if `IsAllHistory()` returns true. const std::set<GURL>& favicon_urls() const { return favicon_urls_; } // Returns a map from origins with deleted urls to a count of remaining URLs @@ -664,7 +664,7 @@ // Context signals about a page visit collected during the page lifetime. // This struct encapsulates data that's shared between UKM and the on-device -// storage for |HistoryCluster| metadata, recorded to both when the page +// storage for `HistoryCluster` metadata, recorded to both when the page // lifetime ends. This is to ensure that History actually has the visit row // already written. struct ClusterVisitContextSignals { @@ -684,7 +684,7 @@ // True if the page was NOT a bookmark when the navigation was committed and // was MADE a bookmark during the page's lifetime. In other words: - // If |is_existing_bookmark| is true, that implies |is_new_bookmark| is false. + // If `is_existing_bookmark` is true, that implies `is_new_bookmark` is false. bool is_new_bookmark = false; // True if the page has been explicitly added (by the user) to the list of @@ -712,15 +712,15 @@ int page_end_reason = 0; }; -// A |VisitRow| along with its corresponding |URLRow| and -// |ClusterVisitContextSignals|. This is used to cluster visits. +// A `VisitRow` along with its corresponding `URLRow` and +// `ClusterVisitContextSignals`. This is used to cluster visits. struct ClusterVisit { URLRow url_row; VisitRow visit_row; ClusterVisitContextSignals context_signals; }; -// The DB representation of |ClusterVisit|. +// The DB representation of `ClusterVisit`. struct ClusterVisitRow { ClusterVisitRow() = default; explicit ClusterVisitRow(const ClusterVisit& cluster_visit)
diff --git a/components/history/core/browser/in_memory_history_backend.h b/components/history/core/browser/in_memory_history_backend.h index 7e203eb..c6ae62c 100644 --- a/components/history/core/browser/in_memory_history_backend.h +++ b/components/history/core/browser/in_memory_history_backend.h
@@ -7,7 +7,7 @@ // low-latency operations, such as in-line autocomplete. // // The in-memory cache provides the following guarantees: -// (1.) It will always contain URLRows that either have a |typed_count| > 0; or +// (1.) It will always contain URLRows that either have a `typed_count` > 0; or // that have a corresponding search term, in which case information about // the search term is also stored. // (2.) It will be an actual subset, i.e., it will contain verbatim data, and @@ -47,7 +47,7 @@ ~InMemoryHistoryBackend() override; // Initializes the backend from the history database pointed to by the - // full path in |history_filename|. + // full path in `history_filename`. bool Init(const base::FilePath& history_filename); // Does initialization work when this object is attached to the history
diff --git a/components/history/core/browser/keyword_search_term.h b/components/history/core/browser/keyword_search_term.h index 295dfeb6..a8c88f4e 100644 --- a/components/history/core/browser/keyword_search_term.h +++ b/components/history/core/browser/keyword_search_term.h
@@ -27,8 +27,8 @@ // recency_in_seconds + recency_decay_unit_in_seconds // This score combines frequency and recency of the visit favoring ones that // are more frequent and more recent (see go/local-zps-frecency-ranking). - // |recency_decay_unit_sec| is the number of seconds until the recency - // component of the score decays to half. |frequency_exponent| is factor by + // `recency_decay_unit_sec` is the number of seconds until the recency + // component of the score decays to half. `frequency_exponent` is factor by // which the frequency of the visit is exponentiated. double GetFrecency(base::Time now, int recency_decay_unit_sec,
diff --git a/components/history/core/browser/sync/delete_directive_handler.cc b/components/history/core/browser/sync/delete_directive_handler.cc index 1246872..ec80d27 100644 --- a/components/history/core/browser/sync/delete_directive_handler.cc +++ b/components/history/core/browser/sync/delete_directive_handler.cc
@@ -70,7 +70,7 @@ return (time - base::Time::UnixEpoch()).InMicroseconds(); } -// Converts global IDs in |global_id_directive| to times. +// Converts global IDs in `global_id_directive` to times. void GetTimesFromGlobalIds( const sync_pb::GlobalIdDirective& global_id_directive, std::set<base::Time>* times) { @@ -158,8 +158,8 @@ const syncer::SyncDataList& global_id_directives); // Process a list of time range directives, all history entries within the - // time ranges are deleted. |time_range_directives| should be sorted by - // |start_time_usec| and |end_time_usec| already. + // time ranges are deleted. `time_range_directives` should be sorted by + // `start_time_usec` and `end_time_usec` already. void ProcessTimeRangeDeleteDirectives( HistoryBackend* history_backend, const syncer::SyncDataList& time_range_directives);
diff --git a/components/history/core/browser/sync/delete_directive_handler.h b/components/history/core/browser/sync/delete_directive_handler.h index cdf2b1fc..efea393f 100644 --- a/components/history/core/browser/sync/delete_directive_handler.h +++ b/components/history/core/browser/sync/delete_directive_handler.h
@@ -48,17 +48,17 @@ void OnBackendLoaded(); // Create delete directives for the deletion of visits identified by - // |global_ids| (which may be empty), in the time range specified by - // |begin_time| and |end_time|. + // `global_ids` (which may be empty), in the time range specified by + // `begin_time` and `end_time`. bool CreateDeleteDirectives(const std::set<int64_t>& global_ids, base::Time begin_time, base::Time end_time); bool CreateUrlDeleteDirective(const GURL& url); - // Sends the given |delete_directive| to SyncChangeProcessor (if it exists). + // Sends the given `delete_directive` to SyncChangeProcessor (if it exists). // Returns any error resulting from sending the delete directive to sync. - // NOTE: the given |delete_directive| is not processed to remove local + // NOTE: the given `delete_directive` is not processed to remove local // history entries that match. Caller still needs to call other // interfaces, e.g. HistoryService::ExpireHistoryBetween(), to delete // local history entries. @@ -85,7 +85,7 @@ enum PostProcessingAction { KEEP_AFTER_PROCESSING, DROP_AFTER_PROCESSING }; // Callback when history backend finishes deleting visits according to - // |delete_directives|. + // `delete_directives`. void FinishProcessing(PostProcessingAction post_processing_action, const syncer::SyncDataList& delete_directives);
diff --git a/components/history/core/browser/sync/history_delete_directives_model_type_controller.h b/components/history/core/browser/sync/history_delete_directives_model_type_controller.h index 16801b46..fe78e6c 100644 --- a/components/history/core/browser/sync/history_delete_directives_model_type_controller.h +++ b/components/history/core/browser/sync/history_delete_directives_model_type_controller.h
@@ -25,7 +25,7 @@ : public syncer::SyncableServiceBasedModelTypeController, public syncer::SyncServiceObserver { public: - // |sync_service| and |history_service| must not be null and must outlive this + // `sync_service` and `history_service` must not be null and must outlive this // object. HistoryDeleteDirectivesModelTypeController( const base::RepeatingClosure& dump_stack,
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.cc b/components/history/core/browser/sync/typed_url_sync_bridge.cc index 91cad61..7d86e30 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge.cc
@@ -124,7 +124,7 @@ // Iterate through entity_data and check for all the urls that // sync already knows about. MergeURLWithSync() will remove urls that - // are the same as the synced ones from |new_db_urls|. + // are the same as the synced ones from `new_db_urls`. for (const std::unique_ptr<EntityChange>& entity_change : entity_data) { DCHECK(entity_change->data().specifics.has_typed_url()); const TypedUrlSpecifics& specifics = @@ -199,7 +199,7 @@ entity_change->storage_key()); if (!history_backend_->GetURLByID(url_id, &url_row)) { // Ignoring the case that there is no matching URLRow with URLID - // |url_id|. + // `url_id`. continue; } @@ -263,7 +263,7 @@ URLID url_id = TypedURLSyncMetadataDatabase::StorageKeyToURLID(key); if (!history_backend_->GetURLByID(url_id, &url_row)) { - // Ignoring the case which no matching URLRow with URLID |url_id|. + // Ignoring the case which no matching URLRow with URLID `url_id`. DLOG(ERROR) << "Could not find URL for id: " << url_id; continue; } @@ -776,7 +776,7 @@ bool is_existing_url = history_backend_->GetURL(untyped_url.url(), &untyped_url); if (is_existing_url) { - // Add a new entry to |local_typed_urls|, and set the iterator to it. + // Add a new entry to `local_typed_urls`, and set the iterator to it. VisitVector untyped_visits; if (!FixupURLAndGetVisits(&untyped_url, &untyped_visits)) { return; @@ -786,7 +786,7 @@ // Store row info that will be used to update sync's visits. (*local_typed_urls)[untyped_url.url()] = untyped_url; - // Set iterator |it| to point to this entry. + // Set iterator `it` to point to this entry. it = local_typed_urls->find(untyped_url.url()); DCHECK(it != local_typed_urls->end()); // Continue with merge below. @@ -822,7 +822,7 @@ // Empty URLs should be filtered out by ShouldIgnoreUrl() previously. DCHECK(!it->second.url().spec().empty()); - // Initialize fields in |new_url| to the same values as the fields in + // Initialize fields in `new_url` to the same values as the fields in // the existing URLRow in the history DB. This is needed because we // overwrite the existing value in WriteToHistoryBackend(), but some of // the values in that structure are not synced (like typed_count). @@ -927,7 +927,7 @@ // If the URL has no typed visits any more we should get rid of it. It is // possible that this URL never had typed visits and thus it has no sync // entity and no sync metadata. We do not need to check for this case - // as all the code below is no-op if there is no sync metadata for |row|. + // as all the code below is no-op if there is no sync metadata for `row`. if (is_from_expiration) { // Only remove its metadata as we do not sync up deletions for expired // entities (see the comment in OnURLsDeleted()). @@ -943,7 +943,7 @@ void TypedURLSyncBridge::ExpireMetadataForURL(const URLRow& row) { std::string storage_key = GetStorageKeyFromURLRow(row); // The following functions need to tolerate if there exists no metadata - // for |storage_key| as we might call this function multiple times for a given + // for `storage_key` as we might call this function multiple times for a given // url. sync_metadata_database_->ClearSyncMetadata(syncer::TYPED_URLS, storage_key); change_processor()->UntrackEntityForStorageKey(storage_key);
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.h b/components/history/core/browser/sync/typed_url_sync_bridge.h index af10e38..4e535d5 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge.h +++ b/components/history/core/browser/sync/typed_url_sync_bridge.h
@@ -26,7 +26,7 @@ class TypedURLSyncBridge : public syncer::ModelTypeSyncBridge, public HistoryBackendObserver { public: - // |sync_metadata_store| is owned by |history_backend|, and must outlive + // `sync_metadata_store` is owned by `history_backend`, and must outlive // TypedURLSyncBridge. TypedURLSyncBridge( HistoryBackend* history_backend, @@ -88,7 +88,7 @@ typedef std::map<GURL, URLRow> TypedURLMap; // This is a helper map used to associate visit vectors from the history db - // to the typed urls in the above map |TypedURLMap|. + // to the typed urls in the above map `TypedURLMap`. typedef std::map<GURL, VisitVector> URLVisitVectorMap; // Bitfield returned from MergeUrls to specify the result of a merge. @@ -98,14 +98,14 @@ static const MergeResult DIFF_LOCAL_ROW_CHANGED = 1 << 1; static const MergeResult DIFF_LOCAL_VISITS_ADDED = 1 << 2; - // Merges the URL information in |typed_url| with the URL information from the - // history database in |url| and |visits|, and returns a bitmask with the + // Merges the URL information in `typed_url` with the URL information from the + // history database in `url` and `visits`, and returns a bitmask with the // results of the merge: - // DIFF_UPDATE_NODE - changes have been made to |new_url| and |visits| which + // DIFF_UPDATE_NODE - changes have been made to `new_url` and `visits` which // should be persisted to the sync node. - // DIFF_LOCAL_ROW_CHANGED - The history data in |new_url| should be persisted + // DIFF_LOCAL_ROW_CHANGED - The history data in `new_url` should be persisted // to the history DB. - // DIFF_LOCAL_VISITS_ADDED - |new_visits| contains a list of visits that + // DIFF_LOCAL_VISITS_ADDED - `new_visits` contains a list of visits that // should be written to the history DB for this URL. Deletions are not // written to the DB - each client is left to age out visits on their own. static MergeResult MergeUrls(const sync_pb::TypedUrlSpecifics& typed_url, @@ -115,16 +115,16 @@ std::vector<VisitInfo>* new_visits); // Diffs the set of visits between the history DB and the sync DB, using the - // sync DB as the canonical copy. Result is the set of |new_visits| and - // |removed_visits| that can be applied to the history DB to make it match - // the sync DB version. |removed_visits| can be null if the caller does not + // sync DB as the canonical copy. Result is the set of `new_visits` and + // `removed_visits` that can be applied to the history DB to make it match + // the sync DB version. `removed_visits` can be null if the caller does not // care about which visits to remove. static void DiffVisits(const VisitVector& history_visits, const sync_pb::TypedUrlSpecifics& sync_specifics, std::vector<VisitInfo>* new_visits, VisitVector* removed_visits); - // Fills |new_url| with formatted data from |typed_url|. + // Fills `new_url` with formatted data from `typed_url`. static void UpdateURLRowFromTypedUrlSpecifics( const sync_pb::TypedUrlSpecifics& typed_url, URLRow* new_url); @@ -133,7 +133,7 @@ // pass it to the processor so that it can start tracking changes. void LoadMetadata(); - // Compares |server_typed_url| from the server against local history to decide + // Compares `server_typed_url` from the server against local history to decide // how to merge any existing data, and updates appropriate data containers to // write to server and backend. void MergeURLWithSync(const sync_pb::TypedUrlSpecifics& server_typed_url, @@ -146,9 +146,9 @@ // Given a typed URL in the sync DB, looks for an existing entry in the // local history DB and generates a list of visits to add to the // history DB to bring it up to date (avoiding duplicates). - // Updates the passed |visits_to_add| and |visits_to_remove| vectors with the + // Updates the passed `visits_to_add` and `visits_to_remove` vectors with the // visits to add to/remove from the history DB, and adds a new entry to either - // |updated_urls| or |new_urls| depending on whether the URL already existed + // `updated_urls` or `new_urls` depending on whether the URL already existed // in the history DB. void UpdateFromSync(const sync_pb::TypedUrlSpecifics& typed_url, TypedURLVisitVector* visits_to_add, @@ -157,14 +157,14 @@ URLRows* new_urls); // Utility routine that (a) updates an existing sync node or (b) creates a - // new one for the passed |typed_url| if one does not already exist or (c) - // removes metadata for |row| if |is_from_expiration| is true and the |row| + // new one for the passed `typed_url` if one does not already exist or (c) + // removes metadata for `row` if `is_from_expiration` is true and the `row` // has no more typed visits. void UpdateSyncFromLocal(URLRow row, bool is_from_expiration, syncer::MetadataChangeList* metadata_change_list); - // Deletes metadata for an expired URL |row| but does not send up the deletion + // Deletes metadata for an expired URL `row` but does not send up the deletion // to the server (each client expires them independently). It is an no-op when // called on an url with already expired metadata. void ExpireMetadataForURL(const URLRow& row); @@ -201,21 +201,21 @@ // function compensates for the fact that the history DB has rather poor data // integrity (duplicate visits, visit timestamps that don't match the // last_visit timestamp, huge data sets that exhaust memory when fetched, - // expired visits that are not deleted by |ExpireHistoryBackend|, etc) by - // modifying the passed |url| object and |visits| vector. The order of - // |visits| will be from the oldest to the newest order. + // expired visits that are not deleted by `ExpireHistoryBackend`, etc) by + // modifying the passed `url` object and `visits` vector. The order of + // `visits` will be from the oldest to the newest order. // Returns false in two cases. // 1. we could not fetch the visits for the passed URL, DB error. // 2. No visits for the passed url, or all the visits are expired. bool FixupURLAndGetVisits(URLRow* url, VisitVector* visits); - // Create an EntityData by URL |row| and its visits |visits|. + // Create an EntityData by URL `row` and its visits `visits`. std::unique_ptr<syncer::EntityData> CreateEntityData( const URLRow& row, const VisitVector& visits); // Get all the typed urls and visits from the history db, after filtering - // them, put them into |url_to_visit| and |url_to_urlrow|. + // them, put them into `url_to_visit` and `url_to_urlrow`. // Return false if cannot get urls from HistoryBackend. bool GetValidURLsAndVisits(URLVisitVectorMap* url_to_visit, TypedURLMap* url_to_urlrow);
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc index babb09f..7f8c4dd 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -143,7 +143,7 @@ } // Create a new row object and the typed visit çorresponding with the time at -// |last_visit| in the |visits| vector. +// `last_visit` in the `visits` vector. URLRow MakeTypedUrlRow(const std::string& url, const std::string& title, int typed_count, @@ -161,11 +161,11 @@ history_url.set_last_visit(last_visit_time); if (typed_count > 0) { - // Add a typed visit for time |last_visit_time|. + // Add a typed visit for time `last_visit_time`. visits->push_back(VisitRow(history_url.id(), last_visit_time, 0, ui::PAGE_TRANSITION_TYPED, 0, true, false)); } else { - // Add a non-typed visit for time |last_visit_time|. + // Add a non-typed visit for time `last_visit_time`. visits->push_back(VisitRow(history_url.id(), last_visit_time, 0, ui::PAGE_TRANSITION_RELOAD, 0, false, false)); } @@ -197,7 +197,7 @@ visits->push_back(VisitRow(history_url.id(), typed_visit_time, 0, ui::PAGE_TRANSITION_TYPED, 0, true, false)); - // Add a non-typed visit for time |last_visit|. + // Add a non-typed visit for time `last_visit`. visits->push_back(VisitRow(history_url.id(), reload_visit_time, 0, ui::PAGE_TRANSITION_RELOAD, 0, false, false)); return history_url; @@ -323,7 +323,7 @@ fake_history_backend_->Closing(); } - // Starts sync for |typed_url_sync_bridge_| with |initial_data| as the + // Starts sync for `typed_url_sync_bridge_` with `initial_data` as the // initial sync data. void StartSyncing(const std::vector<TypedUrlSpecifics>& specifics) { ON_CALL(mock_processor_, IsTrackingMetadata()).WillByDefault(Return(true)); @@ -415,7 +415,7 @@ void RemoveObserver() { bridge()->history_backend_observation_.Reset(); } - // Fills |specifics| with the sync data for |url| and |visits|. + // Fills `specifics` with the sync data for `url` and `visits`. static bool WriteToTypedUrlSpecifics(const URLRow& url, const VisitVector& visits, TypedUrlSpecifics* specifics) { @@ -1150,7 +1150,7 @@ URLRow url_row = url_rows.front(); VisitVector visits; - // Add |kMaxTypedUrlVisits| + 10 visits to the url. The 10 oldest + // Add `kMaxTypedUrlVisits` + 10 visits to the url. The 10 oldest // non-typed visits are expected to be skipped. int i = 1; for (; i <= kMaxTypedUrlVisits - 20; ++i)
diff --git a/components/history/core/browser/sync/typed_url_sync_metadata_database.cc b/components/history/core/browser/sync/typed_url_sync_metadata_database.cc index 1f76bce86..241e3d0 100644 --- a/components/history/core/browser/sync/typed_url_sync_metadata_database.cc +++ b/components/history/core/browser/sync/typed_url_sync_metadata_database.cc
@@ -131,15 +131,15 @@ "SELECT storage_key FROM typed_url_sync_metadata ORDER BY storage_key")); while (sorted_metadata_rowids.Step()) { URLID metadata_rowid = sorted_metadata_rowids.ColumnInt64(0); - // Both collections are sorted, we check whether |metadata_rowid| is valid + // Both collections are sorted, we check whether `metadata_rowid` is valid // by iterating both at the same time. - // First, skip all valid IDs that are omitted in |sorted_metadata_rowids|. + // First, skip all valid IDs that are omitted in `sorted_metadata_rowids`. while (valid_rowids_iter != sorted_valid_rowids.end() && *valid_rowids_iter < metadata_rowid) { valid_rowids_iter++; } - // Now, is |metadata_rowid| invalid? + // Now, is `metadata_rowid` invalid? if (valid_rowids_iter == sorted_valid_rowids.end() || *valid_rowids_iter != metadata_rowid) { invalid_metadata_rowids.push_back(metadata_rowid);
diff --git a/components/history/core/browser/sync/typed_url_sync_metadata_database.h b/components/history/core/browser/sync/typed_url_sync_metadata_database.h index e49c9c5..b3d10bdc 100644 --- a/components/history/core/browser/sync/typed_url_sync_metadata_database.h +++ b/components/history/core/browser/sync/typed_url_sync_metadata_database.h
@@ -32,7 +32,7 @@ TypedURLSyncMetadataDatabase(); ~TypedURLSyncMetadataDatabase() override; - // Read all the stored metadata for typed URL and fill |metadata_batch| + // Read all the stored metadata for typed URL and fill `metadata_batch` // with it. bool GetAllSyncMetadata(syncer::MetadataBatch* metadata_batch); @@ -63,7 +63,7 @@ bool InitSyncTable(); // Cleans up orphaned metadata for typed URLs, i.e. deletes all metadata - // entries for rowids not present in |sorted_valid_rowids| (which must be + // entries for rowids not present in `sorted_valid_rowids` (which must be // sorted in ascending order). Returns true if the clean up finishes without // any DB error. bool CleanTypedURLOrphanedMetadataForMigrationToVersion40( @@ -71,10 +71,10 @@ private: // Read all sync_pb::EntityMetadata for typed URL and fill - // |metadata_records| with it. + // `metadata_records` with it. bool GetAllSyncEntityMetadata(syncer::MetadataBatch* metadata_batch); - // Read sync_pb::ModelTypeState for typed URL and fill |state| with it. + // Read sync_pb::ModelTypeState for typed URL and fill `state` with it. bool GetModelTypeState(sync_pb::ModelTypeState* state); DISALLOW_COPY_AND_ASSIGN(TypedURLSyncMetadataDatabase);
diff --git a/components/history/core/browser/top_sites.h b/components/history/core/browser/top_sites.h index 481728b..58661166 100644 --- a/components/history/core/browser/top_sites.h +++ b/components/history/core/browser/top_sites.h
@@ -86,7 +86,7 @@ // Returns the set of prepopulated pages. virtual PrepopulatedPageList GetPrepopulatedPages() = 0; - // Called when user has navigated to |url|. + // Called when user has navigated to `url`. virtual void OnNavigationCommitted(const GURL& url) = 0; // Add Observer to the list.
diff --git a/components/history/core/browser/top_sites_database.cc b/components/history/core/browser/top_sites_database.cc index 3da74a9..cc2d038d 100644 --- a/components/history/core/browser/top_sites_database.cc +++ b/components/history/core/browser/top_sites_database.cc
@@ -160,7 +160,7 @@ sql::Statement update_statement(db->GetUniqueStatement( base::StringPrintf(kAdjustRankSql, kTableName).c_str())); - // Update any rows where |next_rank| doesn't match |url_rank|. + // Update any rows where `next_rank` doesn't match `url_rank`. int next_rank = 0; bool adjusted = false; while (select_statement.Step()) { @@ -246,7 +246,7 @@ // Prevent reentrant calls. db->reset_error_callback(); - // After this call, the |db| handle is poisoned so that future calls will + // After this call, the `db` handle is poisoned so that future calls will // return errors until the handle is re-opened. RecoverAndFixup(db, db_path);
diff --git a/components/history/core/browser/top_sites_database.h b/components/history/core/browser/top_sites_database.h index f97d43a..14a720a6 100644 --- a/components/history/core/browser/top_sites_database.h +++ b/components/history/core/browser/top_sites_database.h
@@ -33,7 +33,7 @@ // Returns true on success. If false, no other functions should be called. bool Init(const base::FilePath& db_name); - // Updates the database according to the changes recorded in |delta|. + // Updates the database according to the changes recorded in `delta`. void ApplyDelta(const TopSitesDelta& delta); // Returns a list of all URLs currently in the table. @@ -61,7 +61,7 @@ // was successful. bool UpgradeToVersion4(); - // Sets a top site for the URL. |new_rank| is the position of the URL in the + // Sets a top site for the URL. `new_rank` is the position of the URL in the // list of top sites, zero-based. // If the URL is not in the table, adds it. If it is, updates its rank and // shifts the ranks of other URLs if necessary. Should be called within an @@ -75,7 +75,7 @@ // Returns true if the database query succeeds. bool UpdateSite(const MostVisitedURL& url); - // Returns |url|'s current rank or kRankOfNonExistingURL if not present. + // Returns `url`'s current rank or kRankOfNonExistingURL if not present. int GetURLRank(const MostVisitedURL& url); // Sets the rank for a given URL. The URL must be in the database. Should be
diff --git a/components/history/core/browser/top_sites_impl.cc b/components/history/core/browser/top_sites_impl.cc index 8d27ae60..59c89ab3 100644 --- a/components/history/core/browser/top_sites_impl.cc +++ b/components/history/core/browser/top_sites_impl.cc
@@ -46,7 +46,7 @@ task_runner->PostTask(FROM_HERE, base::BindOnce(std::move(callback), urls)); } -// Checks if the titles stored in |old_list| and |new_list| have changes. +// Checks if the titles stored in `old_list` and `new_list` have changes. bool DoTitlesDiffer(const MostVisitedURLList& old_list, const MostVisitedURLList& new_list) { // If the two lists have different sizes, the most visited titles are @@ -419,7 +419,7 @@ void TopSitesImpl::OnGotMostVisitedURLs(MostVisitedURLList sites) { DCHECK(thread_checker_.CalledOnValidThread()); - // Set |top_sites_| directly so that SetTopSites() diffs correctly. + // Set `top_sites_` directly so that SetTopSites() diffs correctly. top_sites_ = sites; SetTopSites(std::move(sites), CALL_LOCATION_FROM_ON_GOT_MOST_VISITED_URLS);
diff --git a/components/history/core/browser/top_sites_impl.h b/components/history/core/browser/top_sites_impl.h index 168912b2d..6d65a76 100644 --- a/components/history/core/browser/top_sites_impl.h +++ b/components/history/core/browser/top_sites_impl.h
@@ -111,11 +111,11 @@ // Generates the diff of things that happened between "old" and "new." // // The URLs that are in "new" but not "old" will be have their index from - // "new" placed in |added_urls|. The URLs that are in "old" but not "new" will - // have their index from "old" placed in |deleted_urls|. + // "new" placed in `added_urls`. The URLs that are in "old" but not "new" will + // have their index from "old" placed in `deleted_urls`. // // URLs that appear in both lists but have different indices will have their - // index from "new" placed in |moved_urls|. + // index from "new" placed in `moved_urls`. static void DiffMostVisited(const MostVisitedURLList& old_list, const MostVisitedURLList& new_list, TopSitesDelta* delta); @@ -123,15 +123,15 @@ // Adds prepopulated pages to TopSites. Returns true if any pages were added. bool AddPrepopulatedPages(MostVisitedURLList* urls) const; - // Takes |urls|, produces it's copy in |out| after removing blocked urls. + // Takes `urls`, produces it's copy in `out` after removing blocked urls. // Also ensures we respect the maximum number TopSites URLs. MostVisitedURLList ApplyBlockedUrls(const MostVisitedURLList& urls); // Returns an MD5 hash of the URL. Hashing is required for blocking urls. static std::string GetURLHash(const GURL& url); - // Updates URLs in |cache_| and the db (in the background). The URLs in - // |new_top_sites| replace those in |cache_|. All mutations to cache_ *must* + // Updates URLs in `cache_` and the db (in the background). The URLs in + // `new_top_sites` replace those in `cache_`. All mutations to cache_ *must* // go through this. Should be called from the UI thread. void SetTopSites(MostVisitedURLList new_top_sites, const CallLocation location); @@ -167,15 +167,15 @@ scoped_refptr<TopSitesBackend> backend_; - // Lock used to access |thread_safe_cache_|. + // Lock used to access `thread_safe_cache_`. mutable base::Lock lock_; // The top sites data. MostVisitedURLList top_sites_; // Copy of the top sites data that may be accessed on any thread (assuming - // you hold |lock_|). The data in |thread_safe_cache_| has blocked urls - // applied (|top_sites_| does not). + // you hold `lock_`). The data in `thread_safe_cache_` has blocked urls + // applied (`top_sites_` does not). MostVisitedURLList thread_safe_cache_ GUARDED_BY(lock_); // Task tracker for history and backend requests.
diff --git a/components/history/core/browser/top_sites_impl_unittest.cc b/components/history/core/browser/top_sites_impl_unittest.cc index 6fb350a..fe86326 100644 --- a/components/history/core/browser/top_sites_impl_unittest.cc +++ b/components/history/core/browser/top_sites_impl_unittest.cc
@@ -47,7 +47,7 @@ const char kPrepopulatedPageURL[] = "http://www.google.com/int/chrome/welcome.html"; -// Returns whether |url| can be added to history. +// Returns whether `url` can be added to history. bool MockCanAddURLToHistory(const GURL& url) { return url.is_valid() && !url.SchemeIs(kApplicationScheme); } @@ -59,7 +59,7 @@ public: TopSitesQuerier() : number_of_callbacks_(0), waiting_(false) {} - // Queries top sites. If |wait| is true a nested run loop is run until the + // Queries top sites. If `wait` is true a nested run loop is run until the // callback is notified. void QueryTopSites(TopSitesImpl* top_sites, bool wait) { int start_number_of_callbacks = number_of_callbacks_; @@ -149,7 +149,7 @@ } // Returns true if the TopSitesQuerier contains the prepopulate data starting - // at |start_index|. + // at `start_index`. void ContainsPrepopulatePages(const TopSitesQuerier& querier, size_t start_index) { PrepopulatedPageList prepopulate_pages = GetPrepopulatedPages(); @@ -308,7 +308,7 @@ SetTopSites(list_1); EXPECT_FALSE(observer.is_notified()); - // Change |url_2|'s title to |title_1| in list_2. The two lists are different + // Change `url_2`'s title to `title_1` in list_2. The two lists are different // in titles now. TopSites should notify its observers. list_2.pop_back(); list_2.emplace_back(url_2, title_1);
diff --git a/components/history/core/browser/url_database.cc b/components/history/core/browser/url_database.cc index 9987f00..98d056b 100644 --- a/components/history/core/browser/url_database.cc +++ b/components/history/core/browser/url_database.cc
@@ -378,7 +378,7 @@ int min_typed, bool allow_base, URLRow* info) { - // Select URLs that start with |base| and are prefixes of |url|. All parts + // Select URLs that start with `base` and are prefixes of `url`. All parts // of this query except the substr() call can be done using the index. We // could do this query with a couple of LIKE or GLOB statements as well, but // those wouldn't use the index, and would run into problems with "wildcard" @@ -732,7 +732,7 @@ sql.append(name); sql.append( "(" - // The id uses AUTOINCREMENT is for sync propose. Sync uses this |id| as + // The id uses AUTOINCREMENT is for sync propose. Sync uses this `id` as // an unique key to identify the URLs. If here did not use AUTOINCREMENT, // and Sync was not working somehow, a ROWID could be deleted and re-used // during this period. Once Sync come back, Sync would use ROWIDs and
diff --git a/components/history/core/browser/url_database.h b/components/history/core/browser/url_database.h index a258c829..34f6a4f 100644 --- a/components/history/core/browser/url_database.h +++ b/components/history/core/browser/url_database.h
@@ -72,7 +72,7 @@ bool UpdateURLRow(URLID url_id, const URLRow& info); // Adds a line to the URL database with the given information and returns the - // newly generated ID for the row (the |id| in |info| is ignored). A row with + // newly generated ID for the row (the `id` in `info` is ignored). A row with // the given URL must not exist. Returns 0 on error. // // This does NOT add a row to the full text search database. Use @@ -82,8 +82,8 @@ } // Either adds a new row to the URL table with the given information (with the - // the |id| as specified in |info|), or updates the pre-existing row with this - // |id| if there is one already. This is also known as an "upsert" or "merge" + // the `id` as specified in `info`), or updates the pre-existing row with this + // `id` if there is one already. This is also known as an "upsert" or "merge" // operation. Returns true on success. bool InsertOrUpdateURLRowByID(const URLRow& info); @@ -154,7 +154,7 @@ // Fills the given array with URLs matching the given prefix. They will be // sorted by typed count, then by visit count, then by visit date (most recent - // first) up to the given maximum number. If |typed_only| is true, only urls + // first) up to the given maximum number. If `typed_only` is true, only urls // that have been typed once are returned. For caller convenience, returns // whether any results were found. bool AutocompleteForPrefix(const std::string& prefix, @@ -163,16 +163,16 @@ URLRows* results); // Returns true if the database holds some past typed navigation to a URL on - // the provided hostname. If the return value is true and |scheme| is not - // nullptr, |scheme| holds the scheme of one of the corresponding entries in + // the provided hostname. If the return value is true and `scheme` is not + // nullptr, `scheme` holds the scheme of one of the corresponding entries in // the database. bool IsTypedHost(const std::string& host, std::string* scheme); - // Tries to find the shortest URL beginning with |base| that strictly - // prefixes |url|, and has minimum visit_ and typed_counts as specified. - // If found, fills in |info| and returns true; otherwise returns false, - // leaving |info| unchanged. - // We allow matches of exactly |base| iff |allow_base| is true. + // Tries to find the shortest URL beginning with `base` that strictly + // prefixes `url`, and has minimum visit_ and typed_counts as specified. + // If found, fills in `info` and returns true; otherwise returns false, + // leaving `info` unchanged. + // We allow matches of exactly `base` iff `allow_base` is true. bool FindShortestURLFromBase(const std::string& base, const std::string& url, int min_visits, @@ -183,11 +183,11 @@ // History search ------------------------------------------------------------ // Performs a brute force search over the database to find any URLs or titles - // which match the |query| string, using the default text matching algorithm. - // Returns any matches in |results|. + // which match the `query` string, using the default text matching algorithm. + // Returns any matches in `results`. bool GetTextMatches(const std::u16string& query, URLRows* results); - // Same as GetTextMatches, using |algorithm| as the text matching + // Same as GetTextMatches, using `algorithm` as the text matching // algorithm. bool GetTextMatchesWithAlgorithm(const std::u16string& query, query_parser::MatchingAlgorithm algorithm, @@ -201,7 +201,7 @@ const std::u16string& term); // Looks up a keyword search term given a url id. Returns all the search terms - // in |rows|. Returns true on success. + // in `rows`. Returns true on success. bool GetKeywordSearchTermRow(URLID url_id, KeywordSearchTermRow* row); // Looks up all keyword search terms given a term, Fills the rows with data. @@ -221,22 +221,22 @@ int max_count, std::vector<KeywordSearchTermVisit>* matches); - // Returns the most recent (i.e., no older than |age_threshold|) normalized + // Returns the most recent (i.e., no older than `age_threshold`) normalized // search terms (i.e., search terms in lower case with whitespaces collapsed) // for the specified keyword. std::vector<NormalizedKeywordSearchTermVisit> GetMostRecentNormalizedKeywordSearchTerms(KeywordID keyword_id, base::Time age_threshold); - // Deletes all searches matching |term|. + // Deletes all searches matching `term`. bool DeleteKeywordSearchTerm(const std::u16string& term); - // Deletes any search corresponding to |normalized_term|. + // Deletes any search corresponding to `normalized_term`. bool DeleteKeywordSearchTermForNormalizedTerm( KeywordID keyword_id, const std::u16string& normalized_term); - // Deletes any search corresponding to |url_id|. + // Deletes any search corresponding to `url_id`. bool DeleteKeywordSearchTermForURL(URLID url_id); // This is a cover for VisitDatabase::GetVisitsForURL(). It's here to avoid @@ -289,7 +289,7 @@ // Inserts the given URL row into the URLs table, using the regular table // if is_temporary is false, or the temporary URL table if is temporary is - // true. The current |id| of |info| will be ignored in both cases and a new ID + // true. The current `id` of `info` will be ignored in both cases and a new ID // will be generated, which will also constitute the return value, except in // case of an error, when the return value is 0. The temporary table may only // be used in between CreateTemporaryURLTable() and CommitTemporaryURLTable(). @@ -350,11 +350,11 @@ // Returns the date threshold for considering an history item as significant. base::Time AutocompleteAgeThreshold(); -// Return true if |row| qualifies as an autocomplete candidate. If |threshold| +// Return true if `row` qualifies as an autocomplete candidate. If `threshold` // is_null() then this function determines a new time threshold each time it is // called. Since getting system time can be costly (such as for cases where // this function will be called in a loop over many history items), you can -// provide a non-null |threshold| by simply initializing |threshold| with +// provide a non-null `threshold` by simply initializing `threshold` with // AutocompleteAgeThreshold() (or any other desired time in the past). bool RowQualifiesAsSignificant(const URLRow& row, const base::Time& threshold);
diff --git a/components/history/core/browser/url_database_unittest.cc b/components/history/core/browser/url_database_unittest.cc index 4a6dff7..d1db494 100644 --- a/components/history/core/browser/url_database_unittest.cc +++ b/components/history/core/browser/url_database_unittest.cc
@@ -343,7 +343,7 @@ ASSERT_TRUE(SetKeywordSearchTermsForURL(url_id3, keyword_id, keyword2)); - // We should get 2 rows for |keyword|. + // We should get 2 rows for `keyword`. std::vector<KeywordSearchTermRow> rows; ASSERT_TRUE(GetKeywordSearchTermRows(keyword, &rows)); ASSERT_EQ(2u, rows.size()); @@ -358,7 +358,7 @@ EXPECT_EQ(url_id2, rows[0].url_id); } - // We should get 1 row for |keyword2|. + // We should get 1 row for `keyword2`. rows.clear(); ASSERT_TRUE(GetKeywordSearchTermRows(keyword2, &rows)); ASSERT_EQ(1u, rows.size());
diff --git a/components/history/core/browser/url_utils.cc b/components/history/core/browser/url_utils.cc index 307c894..d38f49e 100644 --- a/components/history/core/browser/url_utils.cc +++ b/components/history/core/browser/url_utils.cc
@@ -41,7 +41,7 @@ ++ch2; } int pri_diff = GetURLCharPriority(*ch1) - GetURLCharPriority(*ch2); - // We want false to be returned if |pri_diff| > 0. + // We want false to be returned if `pri_diff` > 0. return (pri_diff != 0) ? pri_diff < 0 : *ch1 < *ch2; } @@ -55,18 +55,18 @@ return false; std::pair<std::string::const_iterator, std::string::const_iterator> first_diff = std::mismatch(p1.begin(), p1.end(), p2.begin()); - // Necessary condition: |p1| is a string prefix of |p2|. + // Necessary condition: `p1` is a string prefix of `p2`. if (first_diff.first != p1.end()) - return false; // E.g.: (|p1| = "/test", |p2| = "/exam") => false. + return false; // E.g.: (`p1` = "/test", `p2` = "/exam") => false. - // |p1| is string prefix. + // `p1` is string prefix. if (first_diff.second == p2.end()) // Is exact match? return true; // E.g.: ("/test", "/test") => true. - // |p1| is strict string prefix, check full match of last path component. + // `p1` is strict string prefix, check full match of last path component. if (!p1.empty() && *p1.rbegin() == '/') // Ends in '/'? return true; // E.g.: ("/test/", "/test/stuff") => true. - // Finally, |p1| does not end in "/": check first extra character in |p2|. + // Finally, `p1` does not end in "/": check first extra character in `p2`. // E.g.: ("/test", "/test/stuff") => true; ("/test", "/testing") => false. return *(first_diff.second) == '/'; }
diff --git a/components/history/core/browser/url_utils.h b/components/history/core/browser/url_utils.h index ba4f4aa5c..4721b65 100644 --- a/components/history/core/browser/url_utils.h +++ b/components/history/core/browser/url_utils.h
@@ -15,30 +15,30 @@ // that represent valid URLs, so that if the pre-path (scheme, host, and port) // parts are equal, then the path parts are compared by treating path components // (delimited by "/") as separate tokens that form units of comparison. -// For example, let us compare |s1| and |s2|, with -// |s1| = "http://www.google.com:80/base/test/ab/cd?query/stuff" -// |s2| = "http://www.google.com:80/base/test-case/yz#ref/stuff" +// For example, let us compare `s1` and `s2`, with +// `s1` = "http://www.google.com:80/base/test/ab/cd?query/stuff" +// `s2` = "http://www.google.com:80/base/test-case/yz#ref/stuff" // The pre-path parts "http://www.google.com:80/" match. We treat the paths as -// |s1| => ["base", "test", "ab", "cd"] -// |s2| => ["base", "test-case", "yz"] +// `s1` => ["base", "test", "ab", "cd"] +// `s2` => ["base", "test-case", "yz"] // Components 1 "base" are identical. Components 2 yield "test" < "test-case", -// so we consider |s1| < |s2|, and return true. Note that naive string -// comparison would yield the opposite (|s1| > |s2|), since '/' > '-' in ASCII. +// so we consider `s1` < `s2`, and return true. Note that naive string +// comparison would yield the opposite (`s1` > `s2`), since '/' > '-' in ASCII. // Note that path can be terminated by "?query" or "#ref". The post-path parts // are compared in an arbitrary (but consistent) way. bool CanonicalURLStringCompare(const std::string& s1, const std::string& s2); -// Returns whether |url1| and |url2| have the same scheme, host, and port. +// Returns whether `url1` and `url2` have the same scheme, host, and port. bool HaveSameSchemeHostAndPort(const GURL&url1, const GURL& url2); -// Treats |path1| and |path2| as lists of path components (e.g., ["a", "bb"] -// for "/a/bb"). Returns whether |path1|'s list is a prefix of |path2|'s list. +// Treats `path1` and `path2` as lists of path components (e.g., ["a", "bb"] +// for "/a/bb"). Returns whether `path1`'s list is a prefix of `path2`'s list. // This is used to define "URL prefix". Note that "test" does not count as a // prefix of "testing", even though "test" is a (string) prefix of "testing". bool IsPathPrefix(const std::string& p1, const std::string& p2); -// Converts |url| from HTTP to HTTPS, and vice versa, then returns the result. -// If |url| is neither HTTP nor HTTPS, returns an empty URL. +// Converts `url` from HTTP to HTTPS, and vice versa, then returns the result. +// If `url` is neither HTTP nor HTTPS, returns an empty URL. GURL ToggleHTTPAndHTTPS(const GURL& url); // Returns the host of the given URL, canonicalized as it would be for
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc index 6cf62226..e7c04dc0 100644 --- a/components/history/core/browser/visit_database.cc +++ b/components/history/core/browser/visit_database.cc
@@ -172,7 +172,7 @@ VisitVector* visits) { std::set<URLID> found_urls; - // Keeps track of the day that |found_urls| is holding the URLs for, in order + // Keeps track of the day that `found_urls` is holding the URLs for, in order // to handle removing per-day duplicates. base::Time found_urls_midnight;
diff --git a/components/history/core/browser/visit_database.h b/components/history/core/browser/visit_database.h index 352adaa..42485f4 100644 --- a/components/history/core/browser/visit_database.h +++ b/components/history/core/browser/visit_database.h
@@ -62,7 +62,7 @@ // and match the set of options passed, sorted in ascending order of date. // // Returns true if there are more results available, i.e. if the number of - // results was restricted by |options.max_count|. + // results was restricted by `options.max_count`. bool GetVisibleVisitsForURL(URLID url_id, const QueryOptions& options, VisitVector* visits); @@ -70,8 +70,8 @@ // Fills the vector with all visits with times in the given list. // // The results will be in no particular order. Also, no duplicate - // detection is performed, so if |times| has duplicate times, - // |visits| may have duplicate visits. + // detection is performed, so if `times` has duplicate times, + // `visits` may have duplicate visits. bool GetVisitsForTimes(const std::vector<base::Time>& times, VisitVector* visits); @@ -79,7 +79,7 @@ // time can be is_null(), in which case the times in that direction are // unbounded. // - // If |max_results| is non-zero, up to that many results will be returned. If + // If `max_results` is non-zero, up to that many results will be returned. If // there are more results than that, the oldest ones will be returned. (This // is used for history expiration.) // @@ -93,7 +93,7 @@ // to the given vector. Either time can be is_null(), in which case the times // in that direction are unbounded. // - // If |max_results| is non-zero, up to that many results will be returned. If + // If `max_results` is non-zero, up to that many results will be returned. If // there are more results than that, the oldest ones will be returned. (This // is used for history expiration.) // @@ -114,15 +114,15 @@ // begin time is inclusive, the end time is exclusive. Either time can be // is_null(), in which case the times in that direction are unbounded. // - // Up to |max_count| visits will be returned. If there are more visits than - // that, the most recent |max_count| will be returned. If 0, all visits in the + // Up to `max_count` visits will be returned. If there are more visits than + // that, the most recent `max_count` will be returned. If 0, all visits in the // range will be computed. // // Only one visit for each URL will be returned, and it will be the most // recent one in the time range. // // Returns true if there are more results available, i.e. if the number of - // results was restricted by |options.max_count|. + // results was restricted by `options.max_count`. bool GetVisibleVisitsInRange(const QueryOptions& options, VisitVector* visits); @@ -133,16 +133,16 @@ // the found visit. When no visit is found, the row will be unchanged. VisitID GetMostRecentVisitForURL(URLID url_id, VisitRow* visit_row); - // Returns the |max_results| most recent visit sessions for |url_id|. + // Returns the `max_results` most recent visit sessions for `url_id`. // // Returns false if there's a failure preparing the statement. True - // otherwise. (No results are indicated with an empty |visits| + // otherwise. (No results are indicated with an empty `visits` // vector.) bool GetMostRecentVisitsForURL(URLID url_id, int max_results, VisitVector* visits); - // Finds a redirect coming from the given |from_visit|. If a redirect is + // Finds a redirect coming from the given `from_visit`. If a redirect is // found, it fills the visit ID and URL into the out variables and returns // true. If there is no redirect from the given visit, returns false. // @@ -157,13 +157,13 @@ GURL* to_url); // Similar to the above function except finds a redirect going to a given - // |to_visit|. + // `to_visit`. bool GetRedirectToVisit(VisitID to_visit, VisitID* from_visit, GURL* from_url); // Gets the number of user-visible visits to all URLs on the same - // scheme/host/port as |url|, as well as the time of the earliest visit. + // scheme/host/port as `url`, as well as the time of the earliest visit. // "User-visible" is defined as in GetVisibleVisitsInRange() above, i.e. // excluding redirects and subframes. // This function is only valid for HTTP and HTTPS URLs; all other schemes @@ -173,7 +173,7 @@ base::Time* first_visit); // Gets the number of URLs as seen in chrome://history within the time - // range [|begin_time|, |end_time|). "User-visible" is defined as in + // range [`begin_time`, `end_time`). "User-visible" is defined as in // GetVisibleVisitsInRange() above, i.e. excluding redirects and subframes. // Each URL is counted only once per day. For determination of the date, // timestamps are converted to dates using local time. Returns false if @@ -183,8 +183,8 @@ int* count); // Gets the last time any webpage on the given host was visited within the - // time range [|begin_time|, |end_time|). If the given host has not been - // visited in the given time range, this will return true and |last_visit| + // time range [`begin_time`, `end_time`). If the given host has not been + // visited in the given time range, this will return true and `last_visit` // will be set to base::Time(). False will be returned if the host is not a // valid HTTP or HTTPS url or for other database errors. bool GetLastVisitToHost(const GURL& host, @@ -192,15 +192,15 @@ base::Time end_time, base::Time* last_visit); - // Gets the last time |url| was visited before |end_time|. If the given |url| - // has no past visits, this will return true and |last_visit| will be set to - // base::Time(). False will be returned if |url| is not a valid HTTP or HTTPS + // Gets the last time `url` was visited before `end_time`. If the given `url` + // has no past visits, this will return true and `last_visit` will be set to + // base::Time(). False will be returned if `url` is not a valid HTTP or HTTPS // url or for other database errors. bool GetLastVisitToURL(const GURL& url, base::Time end_time, base::Time* last_visit); - // Gets counts for total visits and days visited for pages matching |host|'s + // Gets counts for total visits and days visited for pages matching `host`'s // scheme, port, and host. Counts only user-visible visits. DailyVisitsResult GetDailyVisitsToHost(const GURL& host, base::Time begin_time, @@ -236,7 +236,7 @@ static bool FillVisitVector(sql::Statement& statement, VisitVector* visits); // Convenience to fill a VisitVector while respecting the set of options. - // |statement| should order the query descending by visit_time to ensure + // `statement` should order the query descending by visit_time to ensure // correct duplicate management behavior. Assumes that statement.step() // hasn't happened yet. static bool FillVisitVectorWithOptions(sql::Statement& statement,
diff --git a/components/history/core/browser/visit_database_unittest.cc b/components/history/core/browser/visit_database_unittest.cc index fe1bc14f..4fb0925 100644 --- a/components/history/core/browser/visit_database_unittest.cc +++ b/components/history/core/browser/visit_database_unittest.cc
@@ -554,19 +554,19 @@ EXPECT_TRUE(GetHistoryCount(Time(), Time::Max(), &result)); EXPECT_EQ(5, result); - // Narrowing the range to exclude |first_day_1| will still return 5, - // because |first_day_1| is not unique. + // Narrowing the range to exclude `first_day_1` will still return 5, + // because `first_day_1` is not unique. EXPECT_TRUE( GetHistoryCount(two_days_ago + TimeDelta::FromHours(2), today, &result)); EXPECT_EQ(5, result); - // Narrowing the range to exclude |second_day_4| will return 4, - // because |second_day_4| is unique. + // Narrowing the range to exclude `second_day_4` will return 4, + // because `second_day_4` is unique. EXPECT_TRUE(GetHistoryCount(two_days_ago, yesterday + TimeDelta::FromHours(3), &result)); EXPECT_EQ(4, result); - // Narrowing the range to exclude both |first_day_1| and |second_day_4| will + // Narrowing the range to exclude both `first_day_1` and `second_day_4` will // still return 4. EXPECT_TRUE(GetHistoryCount(two_days_ago + TimeDelta::FromHours(2), yesterday + TimeDelta::FromHours(3), &result)); @@ -582,7 +582,7 @@ // TimeDelta::FromDays(1) to move one day, as this simply removes 24 hours and // thus does not work correctly with DST shifts. Instead, we'll go back // 1 second (i.e. somewhere in the middle of the previous day), and use - // |LocalMidnight()| to round down to the beginning of the day in the local + // `LocalMidnight()` to round down to the beginning of the day in the local // time, taking timezones and DST into account. This is necessary to achieve // the same equivalence class on days as the DATE(..., 'localtime') function // in SQL. @@ -824,7 +824,7 @@ base::Time::FromTimeT(1000), &last_visit)); EXPECT_EQ(last_visit, base::Time::FromTimeT(200)); } - // Test getting the older visit using an |end_time| of 150. + // Test getting the older visit using an `end_time` of 150. { base::Time last_visit; EXPECT_TRUE(GetLastVisitToURL(GURL("https://foo.com/bar/baz"),
diff --git a/components/history/core/browser/visitsegment_database.cc b/components/history/core/browser/visitsegment_database.cc index e1b6b6011..9dc5fc2 100644 --- a/components/history/core/browser/visitsegment_database.cc +++ b/components/history/core/browser/visitsegment_database.cc
@@ -329,7 +329,7 @@ SegmentID to_segment_id = GetSegmentNamed(new_name); if (to_segment_id) { - // |new_name| is already in use, so merge. + // `new_name` is already in use, so merge. success = success && MergeSegments(/*from_segment_id=*/id, to_segment_id); } else { // Trivial rename of the segment. @@ -355,8 +355,8 @@ return false; // For each time slot where there are visits for the absorbed segment - // (|from_segment_id|), add them to the absorbing/staying segment - // (|to_segment_id|). + // (`from_segment_id`), add them to the absorbing/staying segment + // (`to_segment_id`). sql::Statement select( GetDB().GetCachedStatement(SQL_FROM_HERE, "SELECT time_slot, visit_count FROM "
diff --git a/components/history/core/browser/visitsegment_database.h b/components/history/core/browser/visitsegment_database.h index 629f1e1..a3b5aef 100644 --- a/components/history/core/browser/visitsegment_database.h +++ b/components/history/core/browser/visitsegment_database.h
@@ -35,9 +35,9 @@ // is no segment with that name. SegmentID GetSegmentNamed(const std::string& segment_name); - // Update the segment identified by |out_segment_id| with the provided URL ID. + // Update the segment identified by `out_segment_id` with the provided URL ID. // The URL identifies the page that will now represent the segment. If url_id - // is non zero, it is assumed to be the row id of |url|. + // is non zero, it is assumed to be the row id of `url`. bool UpdateSegmentRepresentationURL(SegmentID segment_id, URLID url_id); @@ -50,9 +50,9 @@ bool IncreaseSegmentVisitCount(SegmentID segment_id, base::Time ts, int amount); - // Computes the segment usage since |from_time|. If |url_filter| is non-null, + // Computes the segment usage since `from_time`. If `url_filter` is non-null, // then only URLs for which it returns true will be included. - // Returns the highest-scored segments up to |max_result_count|. + // Returns the highest-scored segments up to `max_result_count`. std::vector<std::unique_ptr<PageUsageData>> QuerySegmentUsage( base::Time from_time, int max_result_count, @@ -79,16 +79,16 @@ // Runs ComputeSegmentName() to recompute 'name'. If multiple segments have // the same name, they are merged by: - // 1. Choosing one arbitrary |segment_id| and updating all references. - // 2. Merging duplicate |segment_usage| entries (add up visit counts). + // 1. Choosing one arbitrary `segment_id` and updating all references. + // 2. Merging duplicate `segment_usage` entries (add up visit counts). // 3. Deleting old data for the absorbed segment. bool MigrateVisitSegmentNames(); private: - // Updates the |name| column for a single segment. Returns true on success. + // Updates the `name` column for a single segment. Returns true on success. bool RenameSegment(SegmentID segment_id, const std::string& new_name); // Merges two segments such that data is aggregated, all former references to - // |from_segment_id| are updated to |to_segment_id| and |from_segment_id| is + // `from_segment_id` are updated to `to_segment_id` and `from_segment_id` is // deleted. Returns true on success. bool MergeSegments(SegmentID from_segment_id, SegmentID to_segment_id);
diff --git a/components/history/core/browser/web_history_service.cc b/components/history/core/browser/web_history_service.cc index 5f64ac3..8c19fcd 100644 --- a/components/history/core/browser/web_history_service.cc +++ b/components/history/core/browser/web_history_service.cc
@@ -111,7 +111,7 @@ UMA_HISTOGRAM_BOOLEAN("WebHistory.OAuthTokenCompletion", false); std::move(callback_).Run(this, false); - // It is valid for the callback to delete |this|, so do not access any + // It is valid for the callback to delete `this`, so do not access any // members below here. return; } @@ -210,7 +210,7 @@ } is_pending_ = false; std::move(callback_).Run(this, true); - // It is valid for the callback to delete |this|, so do not access any + // It is valid for the callback to delete `this`, so do not access any // members below here. } @@ -283,7 +283,7 @@ } // Returns a URL for querying the history server for a query specified by -// |options|. |version_info|, if not empty, should be a token that was received +// `options`. `version_info`, if not empty, should be a token that was received // from the server in response to a write operation. It is used to help ensure // read consistency after a write. GURL GetQueryUrl(const std::u16string& text_query, @@ -292,9 +292,9 @@ GURL url = GURL(kHistoryQueryHistoryUrl); url = net::AppendQueryParameter(url, "titles", "1"); - // Take |begin_time|, |end_time|, and |max_count| from the original query + // Take `begin_time`, `end_time`, and `max_count` from the original query // options, and convert them to the equivalent URL parameters. Note that - // QueryOptions uses exclusive |end_time| while the history.google.com API + // QueryOptions uses exclusive `end_time` while the history.google.com API // uses it inclusively, so we subtract 1us during conversion. base::Time end_time = @@ -325,7 +325,7 @@ // Creates a DictionaryValue to hold the parameters for a deletion. // Ownership is passed to the caller. -// |url| may be empty, indicating a time-range deletion. +// `url` may be empty, indicating a time-range deletion. std::unique_ptr<base::DictionaryValue> CreateDeletion( const std::string& min_time, const std::string& max_time, @@ -616,7 +616,7 @@ } // If there is no response_value, then for our purposes, the request has - // failed, despite receiving a true |success| value. This can happen if + // failed, despite receiving a true `success` value. This can happen if // the user is offline. std::move(callback).Run(success && response_value, enabled_value); }
diff --git a/components/history/core/browser/web_history_service.h b/components/history/core/browser/web_history_service.h index 55a2ee3..f10d26ef 100644 --- a/components/history/core/browser/web_history_service.h +++ b/components/history/core/browser/web_history_service.h
@@ -104,9 +104,9 @@ void AddObserver(WebHistoryServiceObserver* observer); void RemoveObserver(WebHistoryServiceObserver* observer); - // Searches synced history for visits matching |text_query|. The timeframe to - // search, along with other options, is specified in |options|. If - // |text_query| is empty, all visits in the timeframe will be returned. + // Searches synced history for visits matching `text_query`. The timeframe to + // search, along with other options, is specified in `options`. If + // `text_query` is empty, all visits in the timeframe will be returned. // This method is the equivalent of HistoryService::QueryHistory. // The caller takes ownership of the returned Request. If it is destroyed, the // request is cancelled. @@ -139,7 +139,7 @@ const net::PartialNetworkTrafficAnnotationTag& partial_traffic_annotation); - // Sets the state of audio history recording to |new_enabled_value|. + // Sets the state of audio history recording to `new_enabled_value`. virtual void SetAudioHistoryEnabled( bool new_enabled_value, AudioWebHistoryCallback callback, @@ -171,44 +171,44 @@ partial_traffic_annotation); // Extracts a JSON-encoded HTTP response into a DictionaryValue. - // If |request|'s HTTP response code indicates failure, or if the response + // If `request`'s HTTP response code indicates failure, or if the response // body is not JSON, a null pointer is returned. static std::unique_ptr<base::DictionaryValue> ReadResponse(Request* request); - // Called by |request| when a web history query has completed. Unpacks the - // response and calls |callback|, which is the original callback that was + // Called by `request` when a web history query has completed. Unpacks the + // response and calls `callback`, which is the original callback that was // passed to QueryHistory(). static void QueryHistoryCompletionCallback( WebHistoryService::QueryWebHistoryCallback callback, WebHistoryService::Request* request, bool success); - // Called by |request| when a request to delete history from the server has - // completed. Unpacks the response and calls |callback|, which is the original + // Called by `request` when a request to delete history from the server has + // completed. Unpacks the response and calls `callback`, which is the original // callback that was passed to ExpireHistory(). void ExpireHistoryCompletionCallback( WebHistoryService::ExpireWebHistoryCallback callback, WebHistoryService::Request* request, bool success); - // Called by |request| when a request to get or set audio history from the - // server has completed. Unpacks the response and calls |callback|, which is + // Called by `request` when a request to get or set audio history from the + // server has completed. Unpacks the response and calls `callback`, which is // the original callback that was passed to AudioHistory(). void AudioHistoryCompletionCallback( WebHistoryService::AudioWebHistoryCallback callback, WebHistoryService::Request* request, bool success); - // Called by |request| when a web and app activity query has completed. - // Unpacks the response and calls |callback|, which is the original callback + // Called by `request` when a web and app activity query has completed. + // Unpacks the response and calls `callback`, which is the original callback // that was passed to QueryWebAndAppActivity(). void QueryWebAndAppActivityCompletionCallback( WebHistoryService::QueryWebAndAppActivityCallback callback, WebHistoryService::Request* request, bool success); - // Called by |request| when a query for other forms of browsing history has - // completed. Unpacks the response and calls |callback|, which is the original + // Called by `request` when a query for other forms of browsing history has + // completed. Unpacks the response and calls `callback`, which is the original // callback that was passed to QueryOtherFormsOfBrowsingHistory(). void QueryOtherFormsOfBrowsingHistoryCompletionCallback( WebHistoryService::QueryWebAndAppActivityCallback callback,
diff --git a/components/history/core/browser/web_history_service_unittest.cc b/components/history/core/browser/web_history_service_unittest.cc index d7cae239..1e1caae6 100644 --- a/components/history/core/browser/web_history_service_unittest.cc +++ b/components/history/core/browser/web_history_service_unittest.cc
@@ -179,7 +179,7 @@ void TestingWebHistoryService::SetAudioHistoryCallback( bool success, bool new_enabled_value) { EXPECT_TRUE(success); - // |new_enabled_value| should be equal to whatever the audio history value + // `new_enabled_value` should be equal to whatever the audio history value // was just set to. EXPECT_EQ(expected_audio_history_value_, new_enabled_value); }
diff --git a/components/history/core/common/thumbnail_score.h b/components/history/core/common/thumbnail_score.h index 7ab7750..ba62d42 100644 --- a/components/history/core/common/thumbnail_score.h +++ b/components/history/core/common/thumbnail_score.h
@@ -48,7 +48,7 @@ // Whether the thumbnail was taken with height greater than // width or width greater than height and the aspect ratio less than - // kTooWideAspectRatio. In cases where we don't have |good_clipping|, + // kTooWideAspectRatio. In cases where we don't have `good_clipping`, // the thumbnails are either clipped from the horizontal center of the // window, or are otherwise weirdly stretched. bool good_clipping; @@ -57,7 +57,7 @@ // displaying the top of the page. Most pages are more recognizable // by their headers then by a set of random text half way down the // page; i.e. most MediaWiki sites would be indistinguishable by - // thumbnails with |at_top| set to false. + // thumbnails with `at_top` set to false. bool at_top; // Whether this thumbnail was taken after load was completed. @@ -95,7 +95,7 @@ static const double kThumbnailDegradePerHour; // If a thumbnail is taken with the aspect ratio greater than or equal to - // this value, |good_clipping| is to false. + // this value, `good_clipping` is to false. static const double kTooWideAspectRatio; // Checks whether we should consider updating a new thumbnail based on
diff --git a/components/history/core/test/database_test_utils.h b/components/history/core/test/database_test_utils.h index 72e55d7..b5e1e08 100644 --- a/components/history/core/test/database_test_utils.h +++ b/components/history/core/test/database_test_utils.h
@@ -13,11 +13,11 @@ namespace history { -// Sets |dir| to the path of the history data directory. Returns true on success -// or false, in which case |dir| is undefined. +// Sets `dir` to the path of the history data directory. Returns true on success +// or false, in which case `dir` is undefined. WARN_UNUSED_RESULT bool GetTestDataHistoryDir(base::FilePath* dir); -// Create the test database at |db_path| from the golden file at |ascii_path| in +// Create the test database at `db_path` from the golden file at `ascii_path` in // the "history" subdir of the components test data dir. WARN_UNUSED_RESULT bool CreateDatabaseFromSQL(const base::FilePath& db_path, const char* ascii_path);
diff --git a/components/history/core/test/fake_web_history_service.cc b/components/history/core/test/fake_web_history_service.cc index 99f9c67c..561098a 100644 --- a/components/history/core/test/fake_web_history_service.cc +++ b/components/history/core/test/fake_web_history_service.cc
@@ -212,7 +212,7 @@ base::Time end, size_t count, bool* more_results_left) { - // Make sure that |visits_| is sorted in reverse chronological order before we + // Make sure that `visits_` is sorted in reverse chronological order before we // return anything. This means that the most recent results are returned // first. std::sort(visits_.begin(), visits_.end(), @@ -222,7 +222,7 @@ *more_results_left = false; std::vector<Visit> result; for (const Visit& visit : visits_) { - // |begin| is inclusive, |end| is exclusive. + // `begin` is inclusive, `end` is exclusive. if (visit.timestamp >= begin && visit.timestamp < end) { // We found another valid result, but cannot return it because we've // reached max count.
diff --git a/components/history/core/test/fake_web_history_service.h b/components/history/core/test/fake_web_history_service.h index b49588a4..d9478f3 100644 --- a/components/history/core/test/fake_web_history_service.h +++ b/components/history/core/test/fake_web_history_service.h
@@ -18,8 +18,8 @@ // A fake WebHistoryService for testing. // -// Use |AddSyncedVisit| to fill the fake server-side database of synced visits. -// Use |SetupFakeResponse| to influence whether the requests should succeed +// Use `AddSyncedVisit` to fill the fake server-side database of synced visits. +// Use `SetupFakeResponse` to influence whether the requests should succeed // or fail, and with which error code. // // Note: The behavior of this class is only defined for some WebHistoryService @@ -33,7 +33,7 @@ ~FakeWebHistoryService() override; // Sets up the behavior of the fake response returned when calling - // |WebHistoryService::QueryHistory|; whether it will succeed, and with + // `WebHistoryService::QueryHistory`; whether it will succeed, and with // which response code. void SetupFakeResponse(bool emulate_success, int emulate_response_code); @@ -63,11 +63,11 @@ std::string icon_url; }; - // Returns up to |count| results from |visits_| between |begin| and |end. + // Returns up to `count` results from `visits_` between `begin` and `end`. // Results are sorted from most recent to least recent, prioritizing more - // recent results when some need to be omitted. |more_results_left| will be - // set to true only if there are results from |visits_| that were not included - // because of |count| limitations, but were also within time range. Virtual to + // recent results when some need to be omitted. `more_results_left` will be + // set to true only if there are results from `visits_` that were not included + // because of `count` limitations, but were also within time range. Virtual to // allow subclasses to modify. virtual std::vector<FakeWebHistoryService::Visit> GetVisitsBetween( base::Time begin,
diff --git a/components/history/core/test/history_service_test_util.h b/components/history/core/test/history_service_test_util.h index 971ae4e..d3f94c3 100644 --- a/components/history/core/test/history_service_test_util.h +++ b/components/history/core/test/history_service_test_util.h
@@ -17,8 +17,8 @@ namespace history { class HistoryService; -// Creates a new HistoryService that stores its data in |history_dir|. If -// |create_db| is false, the HistoryService will fail to initialize its +// Creates a new HistoryService that stores its data in `history_dir`. If +// `create_db` is false, the HistoryService will fail to initialize its // database; this is useful for testing error conditions. This method spins the // runloop before returning to ensure that any initialization-related tasks are // run.
diff --git a/components/history/core/test/history_unittest_base.h b/components/history/core/test/history_unittest_base.h index b3e0968..26ae0d9 100644 --- a/components/history/core/test/history_unittest_base.h +++ b/components/history/core/test/history_unittest_base.h
@@ -19,9 +19,9 @@ public: ~HistoryUnitTestBase() override; - // Executes the sql from the file |sql_path| in the database at |db_path|. - // |sql_path| is the SQL script file name with full path. - // |db_path| is the db file name with full path. + // Executes the sql from the file `sql_path` in the database at `db_path`. + // `sql_path` is the SQL script file name with full path. + // `db_path` is the db file name with full path. static void ExecuteSQLScript(const base::FilePath& sql_path, const base::FilePath& db_path);
diff --git a/components/history/ios/browser/history_database_helper.h b/components/history/ios/browser/history_database_helper.h index 3093efe3..1f5df5e9 100644 --- a/components/history/ios/browser/history_database_helper.h +++ b/components/history/ios/browser/history_database_helper.h
@@ -13,7 +13,7 @@ struct HistoryDatabaseParams; -// Returns a HistoryDatabaseParams for |history_dir|. +// Returns a HistoryDatabaseParams for `history_dir`. HistoryDatabaseParams HistoryDatabaseParamsForPath( const base::FilePath& history_dir);
diff --git a/components/history/metrics/domain_diversity_reporter.cc b/components/history/metrics/domain_diversity_reporter.cc index 244c69d3..b5c7dd4e 100644 --- a/components/history/metrics/domain_diversity_reporter.cc +++ b/components/history/metrics/domain_diversity_reporter.cc
@@ -84,7 +84,7 @@ int number_of_days_to_report = 7; // If the last report time is too far back in the past, simply use the - // highest possible value for |number_of_days_to_report| and skip its + // highest possible value for `number_of_days_to_report` and skip its // computation. This avoids calling LocalMidnight() on some very old // timestamp that may cause unexpected behaviors on certain // platforms/timezones (see https://crbug.com/1048145). @@ -98,9 +98,9 @@ time_current_report_triggered.LocalMidnight() - time_last_report_triggered.LocalMidnight(); - // Due to daylight saving time, |report_time_range| may not be a multiple + // Due to daylight saving time, `report_time_range` may not be a multiple // of 24 hours. A small time offset is therefore added to - // |report_time_range| so that the resulting time range is guaranteed to + // `report_time_range` so that the resulting time range is guaranteed to // be at least the correct number of days times 24. The number of days to // report is capped at 7 days. number_of_days_to_report = std::min( @@ -134,7 +134,7 @@ history::DomainDiversityResults result) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // An empty DomainDiversityResults indicates that |db_| is null in + // An empty DomainDiversityResults indicates that `db_` is null in // HistoryBackend. if (result.empty()) return;
diff --git a/components/history/metrics/domain_diversity_reporter.h b/components/history/metrics/domain_diversity_reporter.h index 8fe0ba3..0316c7f 100644 --- a/components/history/metrics/domain_diversity_reporter.h +++ b/components/history/metrics/domain_diversity_reporter.h
@@ -29,7 +29,7 @@ base::Clock* clock); ~DomainDiversityReporter() override; - // Registers Profile preferences in |registry|. + // Registers Profile preferences in `registry`. static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); // Invokes ComputeDomainMetrics() if history backend is already loaded.
diff --git a/components/history/metrics/domain_diversity_reporter_unittest.cc b/components/history/metrics/domain_diversity_reporter_unittest.cc index 299c99b..bd0dd1a 100644 --- a/components/history/metrics/domain_diversity_reporter_unittest.cc +++ b/components/history/metrics/domain_diversity_reporter_unittest.cc
@@ -103,10 +103,10 @@ TestClock& test_clock() { return test_clock_; } protected: - // A |task_environment_| configured to MOCK_TIME so tests can + // A `task_environment_` configured to MOCK_TIME so tests can // FastForwardAndWait() when waiting for a specific timeout (delayed task) - // to fire. DomainDiversityReporter internally uses a |test_clock_| instead of - // |task_environment_|'s clock because it needs to test very specific times + // to fire. DomainDiversityReporter internally uses a `test_clock_` instead of + // `task_environment_`'s clock because it needs to test very specific times // rather than just advance in deltas from Now(). base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME};
diff --git a/components/history_clusters/core/memories_features.cc b/components/history_clusters/core/memories_features.cc index 32b12a4..044a5633 100644 --- a/components/history_clusters/core/memories_features.cc +++ b/components/history_clusters/core/memories_features.cc
@@ -18,6 +18,13 @@ kRemoteModelForDebugging, "MemoriesRemoteModelEndpointExperimentName"); } +bool DebugLoggingEnabled() { + // Do debug logging if the kDebug feature is enabled. Additionally, remote + // endpoint for debugging users are implied to be in debug mode. + return base::FeatureList::IsEnabled(kDebug) || + RemoteModelEndpointForDebugging().is_valid(); +} + bool StoreVisitsInHistoryDb() { return base::GetFieldTrialParamByFeatureAsBool( kMemories, "MemoriesStoreVisitsInHistoryDb", false);
diff --git a/components/history_clusters/core/memories_features.h b/components/history_clusters/core/memories_features.h index b4ee73a..4f2f0ba99 100644 --- a/components/history_clusters/core/memories_features.h +++ b/components/history_clusters/core/memories_features.h
@@ -20,6 +20,9 @@ // remote model debug endpoint is disabled. std::string ExperimentNameForRemoteModelEndpoint(); +// Returns true if debug logs should be generated and shown in WebUI inspector. +bool DebugLoggingEnabled(); + // If enabled, completed visits are persisted to the history DB and read back // when clustering. If disabled, completed visits are kept in-memory and used // these in-memory visits are used when clustering.
diff --git a/components/history_clusters/core/memories_remote_model_helper.cc b/components/history_clusters/core/memories_remote_model_helper.cc index 2e4f206d41..9b098c20 100644 --- a/components/history_clusters/core/memories_remote_model_helper.cc +++ b/components/history_clusters/core/memories_remote_model_helper.cc
@@ -10,8 +10,7 @@ #include "base/bind.h" #include "base/json/json_writer.h" #include "base/ranges/algorithm.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "components/history_clusters/core/memories_features.h" @@ -23,19 +22,15 @@ const size_t kMaxExpectedResponseSize = 1024 * 1024; -// Best effort attempt to clean a serialized protobuff for debug prints. -std::string CleanSerializedProto(const std::string& serialized) { - auto copy = serialized; - base::ranges::replace_if( - copy, [](char c) { return !std::isalnum(c); }, ' '); - copy = base::CollapseWhitespaceASCII(copy, true); - return copy; -} - +// Also writes one line of debug information per visit to `debug_string`, if +// the parameter is non-nullptr. proto::GetClustersRequest CreateRequestProto( - const std::vector<history::ClusterVisit>& visits) { + const std::vector<history::ClusterVisit>& visits, + base::Optional<DebugLoggerCallback> debug_logger) { proto::GetClustersRequest request; request.set_experiment_name(ExperimentNameForRemoteModelEndpoint()); + + base::ListValue debug_visits_list; for (auto& visit : visits) { proto::Visit* request_visit = request.add_visits(); request_visit->set_visit_id(visit.visit_row.visit_id); @@ -51,6 +46,38 @@ // |foreground_time_secs| // |site_engagement_score| // |is_from_google_search| + + if (debug_logger) { + base::DictionaryValue debug_visit; + debug_visit.SetStringKey("visitId", + base::NumberToString(request_visit->visit_id())); + debug_visit.SetStringKey("url", request_visit->url()); + debug_visit.SetStringKey( + "navigationTimeMs", + base::NumberToString(request_visit->navigation_time_ms())); + debug_visit.SetStringKey( + "pageEndReason", + base::NumberToString(request_visit->page_end_reason())); + debug_visit.SetStringKey( + "pageTransition", + base::NumberToString(request_visit->page_transition())); + debug_visits_list.Append(std::move(debug_visit)); + } + } + + if (debug_logger) { + debug_logger->Run("MemoriesRemoteModelHelper CreateRequestProto:"); + + base::DictionaryValue debug_value; + debug_value.SetStringKey("experiment_name", request.experiment_name()); + debug_value.SetKey("visits", std::move(debug_visits_list)); + + std::string debug_string; + if (base::JSONWriter::WriteWithOptions( + debug_value, base::JSONWriter::OPTIONS_PRETTY_PRINT, + &debug_string)) { + debug_logger->Run(debug_string); + } } return request; } @@ -80,8 +107,10 @@ } Memories ParseResponseProto(const std::vector<history::ClusterVisit>& visits, - const proto::GetClustersResponse& response_proto) { + const proto::GetClustersResponse& response_proto, + base::Optional<DebugLoggerCallback> debug_logger) { Memories result; + base::ListValue debug_clusters_list; for (const proto::Cluster& cluster : response_proto.clusters()) { auto memory = mojom::Memory::New(); memory->id = base::UnguessableToken::Create(); @@ -93,6 +122,25 @@ memory->top_visits.push_back(CreateVisitMojom(visits, visit_id)); } + if (debug_logger) { + base::DictionaryValue debug_cluster; + debug_cluster.SetStringKey("id", memory->id.ToString()); + + base::ListValue debug_keywords; + for (const std::string& keyword : cluster.keywords()) { + debug_keywords.Append(keyword); + } + debug_cluster.SetKey("keywords", std::move(debug_keywords)); + + base::ListValue debug_visit_ids; + for (int64_t visit_id : cluster.visit_ids()) { + debug_visit_ids.Append(base::NumberToString(visit_id)); + } + debug_cluster.SetKey("visit_ids", std::move(debug_visit_ids)); + + debug_clusters_list.Append(std::move(debug_cluster)); + } + // TODO(manukh) fill out: // |related_searches| // |related_tab_groups| @@ -102,6 +150,18 @@ result.emplace_back(std::move(memory)); } + + if (debug_logger) { + debug_logger->Run("MemoriesRemoteModelHelper ParseResponseProto Clusters:"); + + std::string debug_string; + if (base::JSONWriter::WriteWithOptions( + debug_clusters_list, base::JSONWriter::OPTIONS_PRETTY_PRINT, + &debug_string)) { + debug_logger->Run(debug_string); + } + } + return result; } @@ -109,7 +169,7 @@ MemoriesRemoteModelHelper::MemoriesRemoteModelHelper( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<void(const std::string&)> debug_logger) + base::Optional<DebugLoggerCallback> debug_logger) : url_loader_(nullptr), url_loader_factory_(url_loader_factory), debug_logger_(debug_logger) {} @@ -128,16 +188,13 @@ // It's weird but the endpoint only accepts JSON, so wrap our serialized proto // like this: {"data":"<base64-encoded-proto-serialization>"} - proto::GetClustersRequest request_proto = CreateRequestProto(visits); + proto::GetClustersRequest request_proto = + CreateRequestProto(visits, debug_logger_); const std::string serialized_request_proto = request_proto.SerializeAsString(); std::string request_proto_base64; base::Base64Encode(serialized_request_proto, &request_proto_base64); - debug_logger_.Run(base::StringPrintf( - "MemoriesRemoteModelHelper::GetMemories request = %s", - CleanSerializedProto(serialized_request_proto).c_str())); - base::DictionaryValue container_value; container_value.SetStringPath("data", request_proto_base64); @@ -150,19 +207,18 @@ url_loader_->DownloadToString( url_loader_factory_.get(), base::BindOnce( - [](base::RepeatingCallback<void(const std::string&)> debug_logger, + [](base::Optional<DebugLoggerCallback> debug_logger, const std::vector<history::ClusterVisit>& visits, std::unique_ptr<std::string> response) { - debug_logger.Run(base::StringPrintf( - "MemoriesRemoteModelHelper::GetMemories response = %s", - response ? CleanSerializedProto(*response).c_str() - : "nullptr")); if (!response) { + if (debug_logger) { + debug_logger->Run("MemoriesRemoteModelHelper response nullptr"); + } return history_clusters::Memories(); } proto::GetClustersResponse response_proto; response_proto.ParseFromString(*response); - return ParseResponseProto(visits, response_proto); + return ParseResponseProto(visits, response_proto, debug_logger); }, debug_logger_, visits) .Then(std::move(callback)),
diff --git a/components/history_clusters/core/memories_remote_model_helper.h b/components/history_clusters/core/memories_remote_model_helper.h index 2a66570..79b1123 100644 --- a/components/history_clusters/core/memories_remote_model_helper.h +++ b/components/history_clusters/core/memories_remote_model_helper.h
@@ -11,6 +11,7 @@ #include "base/callback.h" #include "base/memory/scoped_refptr.h" +#include "base/optional.h" #include "components/history/core/browser/history_types.h" #include "components/history_clusters/core/memories.mojom.h" #include "services/network/public/cpp/resource_request.h" @@ -22,14 +23,16 @@ using Memories = std::vector<mojom::MemoryPtr>; using MemoriesCallback = base::OnceCallback<void(Memories)>; +using DebugLoggerCallback = base::RepeatingCallback<void(const std::string&)>; // A helper class to communicate with the remote model. Forms requests from // |ClusterVisit|s and parses the response into |mojom::MemoryPtr|s. class MemoriesRemoteModelHelper { public: + // Pass in a defined `debug_logger` to enable debug logging from this class. MemoriesRemoteModelHelper( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<void(const std::string&)> debug_logger); + base::Optional<DebugLoggerCallback> debug_logger); ~MemoriesRemoteModelHelper(); // POSTs |visits| to |endpoint_| and invokes |callback| with the retrieved @@ -54,8 +57,10 @@ // Used to make requests. const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; - // Used to log debug messages. - base::RepeatingCallback<void(const std::string&)> debug_logger_; + // This should be set to base::nullopt if debug logging is disabled. + // This is base::Optional, so we can skip the expense of constructing the log + // messages if the logger is disabled. + base::Optional<DebugLoggerCallback> debug_logger_; }; } // namespace history_clusters
diff --git a/components/history_clusters/core/memories_service.cc b/components/history_clusters/core/memories_service.cc index aa30729c..a64df48 100644 --- a/components/history_clusters/core/memories_service.cc +++ b/components/history_clusters/core/memories_service.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/feature_list.h" +#include "base/optional.h" #include "base/strings/utf_string_conversions.h" #include "components/history_clusters/core/memories_features.h" #include "components/query_parser/query_parser.h" @@ -61,13 +62,14 @@ history::HistoryService* history_service, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) : history_service_(history_service) { - // Can't do this in initialization list, because |weak_ptr_factory_| usage. - // TODO(tommycli): Investigate if we can simplify some lifetime issues with - // using free-lambdas within |remote_model_helper_|. + base::Optional<DebugLoggerCallback> debug_logger; + if (DebugLoggingEnabled()) { + debug_logger = base::BindRepeating(&MemoriesService::NotifyDebugMessage, + weak_ptr_factory_.GetWeakPtr()); + } + remote_model_helper_ = std::make_unique<MemoriesRemoteModelHelper>( - url_loader_factory, - base::BindRepeating(&MemoriesService::NotifyDebugMessage, - weak_ptr_factory_.GetWeakPtr())); + url_loader_factory, debug_logger); remote_model_helper_weak_factory_ = std::make_unique<base::WeakPtrFactory<MemoriesRemoteModelHelper>>( remote_model_helper_.get()); @@ -86,6 +88,8 @@ } void MemoriesService::NotifyDebugMessage(const std::string& message) const { + DCHECK(DebugLoggingEnabled()) << "Callers must ensure logging is enabled."; + for (Observer& obs : observers_) { obs.OnMemoriesDebugMessage(message); }
diff --git a/components/history_clusters/core/memories_service.h b/components/history_clusters/core/memories_service.h index 3eb07af..ff054535 100644 --- a/components/history_clusters/core/memories_service.h +++ b/components/history_clusters/core/memories_service.h
@@ -47,7 +47,8 @@ void AddObserver(Observer* obs); void RemoveObserver(Observer* obs); - // Notifies the observers of a debug message being available. + // Notifies the observers of a debug message being available. Caller is + // responsible for checking that logging is enabled before calling this. void NotifyDebugMessage(const std::string& message) const; // TODO(manukh) |MemoriesService| should be responsible for constructing the
diff --git a/components/management_strings.grdp b/components/management_strings.grdp index 81e44b7..d0b6d04 100644 --- a/components/management_strings.grdp +++ b/components/management_strings.grdp
@@ -116,6 +116,9 @@ <message name="IDS_MANAGEMENT_REPORT_PRINT_JOBS" desc="Message stating that administrators can see printing history associated with user, device, and printer."> Printing history </message> + <message name="IDS_MANAGEMENT_REPORT_DLP_EVENTS" desc="Message show the users of DLP reporting enabled devices that events are being reported."> + Actions taken with data flagged as confidential + </message> <message name="IDS_MANAGEMENT_CROSTINI" desc="Message stating that administrators can see Crostini usage"> Linux apps installed and when they were last used </message>
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_REPORT_DLP_EVENTS.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_REPORT_DLP_EVENTS.png.sha1 new file mode 100644 index 0000000..f1a38802 --- /dev/null +++ b/components/management_strings_grdp/IDS_MANAGEMENT_REPORT_DLP_EVENTS.png.sha1
@@ -0,0 +1 @@ +e1f529576660b4167f1bbc0e9942313a5a8d87cb \ No newline at end of file
diff --git a/components/media_message_center/media_notification_view_modern_impl.cc b/components/media_message_center/media_notification_view_modern_impl.cc index a05ab1c..60575da8 100644 --- a/components/media_message_center/media_notification_view_modern_impl.cc +++ b/components/media_message_center/media_notification_view_modern_impl.cc
@@ -67,7 +67,9 @@ constexpr int kTitleArtistLineHeight = 20; constexpr gfx::Size kMediaButtonSize = {24, 24}; constexpr gfx::Size kPlayPauseButtonSize = {32, 32}; -constexpr int kMediaButtonIconSize = 18; +constexpr int kMediaButtonIconSize = 14; +constexpr int kPlayPauseIconSize = 20; +constexpr int kMediaButtonBorderThickness = 1; // An image view with a rounded rectangle vignette class MediaArtworkView : public views::ImageView { @@ -147,6 +149,104 @@ return nullptr; } +const std::u16string GetAccessibleNameForMediaAction( + MediaSessionAction action) { + switch (action) { + case MediaSessionAction::kPreviousTrack: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PREVIOUS_TRACK); + case MediaSessionAction::kSeekBackward: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_BACKWARD); + case MediaSessionAction::kPlay: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PLAY); + case MediaSessionAction::kPause: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PAUSE); + case MediaSessionAction::kSeekForward: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_FORWARD); + case MediaSessionAction::kNextTrack: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_NEXT_TRACK); + case MediaSessionAction::kEnterPictureInPicture: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_ENTER_PIP); + case MediaSessionAction::kExitPictureInPicture: + return l10n_util::GetStringUTF16( + IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_EXIT_PIP); + case MediaSessionAction::kStop: + case MediaSessionAction::kSkipAd: + case MediaSessionAction::kSeekTo: + case MediaSessionAction::kScrubTo: + case MediaSessionAction::kSwitchAudioDevice: + case MediaSessionAction::kToggleMicrophone: + case MediaSessionAction::kToggleCamera: + case MediaSessionAction::kHangUp: + NOTREACHED(); + break; + } + + return std::u16string(); +} + +class MediaButton : public views::ImageButton { + public: + MediaButton(PressedCallback callback, int icon_size, gfx::Size button_size) + : ImageButton(callback), icon_size_(icon_size) { + SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER); + SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); + SetFocusBehavior(views::View::FocusBehavior::ALWAYS); + SetFlipCanvasOnPaintForRTLUI(false); + SetPreferredSize(button_size); + SetBorder(views::CreateRoundedRectBorder( + kMediaButtonBorderThickness, + std::min(button_size.width(), button_size.height()) / 2, + SK_ColorWHITE)); + } + + void SetButtonColor(SkColor foreground_color, SkColor disabled_color) { + foreground_color_ = foreground_color; + disabled_color_ = disabled_color; + + GetBorder()->set_color(IsMouseHovered() ? foreground_color + : disabled_color_); + views::SetImageFromVectorIconWithColor( + this, *GetVectorIconForMediaAction(GetActionFromButtonTag(*this)), + icon_size_, foreground_color_); + + SchedulePaint(); + } + + void set_tag(int tag) { + views::ImageButton::set_tag(tag); + + SetTooltipText( + GetAccessibleNameForMediaAction(GetActionFromButtonTag(*this))); + SetAccessibleName( + GetAccessibleNameForMediaAction(GetActionFromButtonTag(*this))); + views::SetImageFromVectorIconWithColor( + this, *GetVectorIconForMediaAction(GetActionFromButtonTag(*this)), + icon_size_, foreground_color_); + } + + void OnMouseEntered(const ui::MouseEvent& event) override { + GetBorder()->set_color(foreground_color_); + SchedulePaint(); + } + + void OnMouseExited(const ui::MouseEvent& event) override { + GetBorder()->set_color(disabled_color_); + SchedulePaint(); + } + + private: + SkColor foreground_color_ = gfx::kPlaceholderColor; + SkColor disabled_color_ = gfx::kPlaceholderColor; + int icon_size_; +}; + } // anonymous namespace // static @@ -212,41 +312,27 @@ // regardless of the local UI direction. media_controls_container->SetMirrored(false); - CreateMediaButton( - media_controls_container.get(), MediaSessionAction::kPreviousTrack, - l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PREVIOUS_TRACK)); - CreateMediaButton( - media_controls_container.get(), MediaSessionAction::kSeekBackward, - l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_BACKWARD)); + CreateMediaButton(media_controls_container.get(), + MediaSessionAction::kPreviousTrack); + CreateMediaButton(media_controls_container.get(), + MediaSessionAction::kSeekBackward); { - auto play_pause_button = views::CreateVectorToggleImageButton( - views::Button::PressedCallback()); + auto play_pause_button = std::make_unique<MediaButton>( + views::Button::PressedCallback(), kPlayPauseIconSize, + kPlayPauseButtonSize); play_pause_button->SetCallback( base::BindRepeating(&MediaNotificationViewModernImpl::ButtonPressed, base::Unretained(this), play_pause_button.get())); play_pause_button->set_tag(static_cast<int>(MediaSessionAction::kPlay)); - play_pause_button->SetPreferredSize(kPlayPauseButtonSize); - play_pause_button->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); - play_pause_button->SetTooltipText(l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PLAY)); - play_pause_button->SetToggledTooltipText(l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_PAUSE)); - play_pause_button->SetFlipCanvasOnPaintForRTLUI(false); play_pause_button_ = media_controls_container->AddChildView(std::move(play_pause_button)); } - CreateMediaButton( - media_controls_container.get(), MediaSessionAction::kSeekForward, - l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_SEEK_FORWARD)); - CreateMediaButton( - media_controls_container.get(), MediaSessionAction::kNextTrack, - l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_NEXT_TRACK)); + CreateMediaButton(media_controls_container.get(), + MediaSessionAction::kSeekForward); + CreateMediaButton(media_controls_container.get(), + MediaSessionAction::kNextTrack); media_controls_container_ = buttons_container->AddChildView(std::move(media_controls_container)); @@ -364,27 +450,13 @@ { // The picture-in-picture button appears directly under the media // labels. - auto picture_in_picture_button = views::CreateVectorToggleImageButton( - views::Button::PressedCallback()); + auto picture_in_picture_button = std::make_unique<MediaButton>( + views::Button::PressedCallback(), kPipButtonIconSize, kPipButtonSize); picture_in_picture_button->SetCallback(base::BindRepeating( &MediaNotificationViewModernImpl::ButtonPressed, base::Unretained(this), picture_in_picture_button.get())); picture_in_picture_button->set_tag( static_cast<int>(MediaSessionAction::kEnterPictureInPicture)); - picture_in_picture_button->SetPreferredSize(kPipButtonSize); - picture_in_picture_button->SetFocusBehavior( - views::View::FocusBehavior::ALWAYS); - picture_in_picture_button->SetTooltipText(l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_ENTER_PIP)); - picture_in_picture_button->SetToggledTooltipText( - l10n_util::GetStringUTF16( - IDS_MEDIA_MESSAGE_CENTER_MEDIA_NOTIFICATION_ACTION_EXIT_PIP)); - picture_in_picture_button->SetFlipCanvasOnPaintForRTLUI(false); - views::SetImageFromVectorIconWithColor( - picture_in_picture_button.get(), - *GetVectorIconForMediaAction( - MediaSessionAction::kEnterPictureInPicture), - kPipButtonIconSize, SK_ColorBLACK); picture_in_picture_button_ = util_buttons_container->AddChildView( std::move(picture_in_picture_button)); } @@ -426,7 +498,6 @@ bool playing = session_info && session_info->playback_state == media_session::mojom::MediaPlaybackState::kPlaying; - play_pause_button_->SetToggled(playing); MediaSessionAction action = playing ? MediaSessionAction::kPause : MediaSessionAction::kPlay; @@ -436,7 +507,6 @@ session_info && session_info->picture_in_picture_state == media_session::mojom::MediaPictureInPictureState::kInPictureInPicture; - picture_in_picture_button_->SetToggled(in_picture_in_picture); action = in_picture_in_picture ? MediaSessionAction::kExitPictureInPicture : MediaSessionAction::kEnterPictureInPicture; @@ -562,19 +632,13 @@ void MediaNotificationViewModernImpl::CreateMediaButton( views::View* parent_view, - MediaSessionAction action, - const std::u16string& accessible_name) { - auto button = - views::CreateVectorImageButton(views::Button::PressedCallback()); + MediaSessionAction action) { + auto button = std::make_unique<MediaButton>( + views::Button::PressedCallback(), kMediaButtonIconSize, kMediaButtonSize); button->SetCallback( base::BindRepeating(&MediaNotificationViewModernImpl::ButtonPressed, base::Unretained(this), button.get())); button->set_tag(static_cast<int>(action)); - button->SetPreferredSize(kMediaButtonSize); - button->SetAccessibleName(accessible_name); - button->SetTooltipText(accessible_name); - button->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); - button->SetFlipCanvasOnPaintForRTLUI(false); parent_view->AddChildView(std::move(button)); } @@ -604,23 +668,8 @@ // Update the colors for the toggle buttons (play/pause and // picture-in-picture) - views::SetImageFromVectorIconWithColor( - play_pause_button_, - *GetVectorIconForMediaAction(MediaSessionAction::kPlay), - kMediaButtonIconSize, foreground); - views::SetToggledImageFromVectorIconWithColor( - play_pause_button_, - *GetVectorIconForMediaAction(MediaSessionAction::kPause), - kMediaButtonIconSize, foreground, disabled_icon_color); - - views::SetImageFromVectorIconWithColor( - picture_in_picture_button_, - *GetVectorIconForMediaAction(MediaSessionAction::kEnterPictureInPicture), - kPipButtonIconSize, foreground); - views::SetToggledImageFromVectorIconWithColor( - picture_in_picture_button_, - *GetVectorIconForMediaAction(MediaSessionAction::kExitPictureInPicture), - kPipButtonIconSize, foreground, disabled_icon_color); + play_pause_button_->SetButtonColor(foreground, disabled_icon_color); + picture_in_picture_button_->SetButtonColor(foreground, disabled_icon_color); // Update the colors for the media control buttons. for (views::View* child : media_controls_container_->children()) { @@ -628,13 +677,9 @@ if (child == play_pause_button_) continue; - views::ImageButton* button = static_cast<views::ImageButton*>(child); + MediaButton* button = static_cast<MediaButton*>(child); - views::SetImageFromVectorIconWithColor( - button, *GetVectorIconForMediaAction(GetActionFromButtonTag(*button)), - kMediaButtonIconSize, foreground); - - button->SchedulePaint(); + button->SetButtonColor(foreground, disabled_icon_color); } SchedulePaint(); @@ -650,6 +695,11 @@ item_->SeekTo(seek_progress * position_.duration()); } +views::Button* +MediaNotificationViewModernImpl::picture_in_picture_button_for_testing() const { + return picture_in_picture_button_; +} + BEGIN_METADATA(MediaNotificationViewModernImpl, views::View) END_METADATA
diff --git a/components/media_message_center/media_notification_view_modern_impl.h b/components/media_message_center/media_notification_view_modern_impl.h index 8eae911..7f00509 100644 --- a/components/media_message_center/media_notification_view_modern_impl.h +++ b/components/media_message_center/media_notification_view_modern_impl.h
@@ -19,13 +19,13 @@ namespace views { class Button; -class ToggleImageButton; } // namespace views namespace media_message_center { namespace { class MediaArtworkView; +class MediaButton; } // anonymous namespace class MediaControlsProgressView; @@ -97,9 +97,7 @@ return subtitle_label_; } - const views::Button* picture_in_picture_button_for_testing() const { - return picture_in_picture_button_; - } + views::Button* picture_in_picture_button_for_testing() const; const views::View* media_controls_container_for_testing() const { return media_controls_container_; @@ -113,8 +111,7 @@ // |accessible_name| is the text used for screen readers and the // button's tooltip. void CreateMediaButton(views::View* parent_view, - media_session::mojom::MediaSessionAction action, - const std::u16string& accessible_name); + media_session::mojom::MediaSessionAction action); void UpdateActionButtonsVisibility(); @@ -151,10 +148,10 @@ MediaArtworkView* artwork_ = nullptr; views::Label* title_label_ = nullptr; views::Label* subtitle_label_ = nullptr; - views::ToggleImageButton* picture_in_picture_button_ = nullptr; + MediaButton* picture_in_picture_button_ = nullptr; views::View* notification_controls_spacer_ = nullptr; views::View* media_controls_container_ = nullptr; - views::ToggleImageButton* play_pause_button_ = nullptr; + MediaButton* play_pause_button_ = nullptr; MediaControlsProgressView* progress_ = nullptr; };
diff --git a/components/media_message_center/media_notification_view_modern_impl_unittest.cc b/components/media_message_center/media_notification_view_modern_impl_unittest.cc index 54ff7aa..aac3d633 100644 --- a/components/media_message_center/media_notification_view_modern_impl_unittest.cc +++ b/components/media_message_center/media_notification_view_modern_impl_unittest.cc
@@ -216,21 +216,20 @@ return view()->media_controls_container_; } + views::Button* picture_in_picture_button() const { + return view()->picture_in_picture_button_for_testing(); + } + std::vector<views::Button*> media_control_buttons() const { std::vector<views::Button*> buttons; auto children = view()->media_controls_container_->children(); std::transform( children.begin(), children.end(), std::back_inserter(buttons), [](views::View* child) { return views::Button::AsButton(child); }); - buttons.push_back( - views::Button::AsButton(view()->picture_in_picture_button_)); + buttons.push_back(views::Button::AsButton(picture_in_picture_button())); return buttons; } - views::Button* picture_in_picture_button() const { - return view()->picture_in_picture_button_; - } - MediaControlsProgressView* progress_view() const { return view()->progress_; } views::Button* GetButtonForAction(MediaSessionAction action) const { @@ -525,20 +524,18 @@ EnableAction(MediaSessionAction::kPlay); { - views::ToggleImageButton* button = static_cast<views::ToggleImageButton*>( - GetButtonForAction(MediaSessionAction::kPlay)); - ASSERT_EQ(views::ToggleImageButton::kViewClassName, button->GetClassName()); - EXPECT_FALSE(button->GetToggled()); + views::Button* button = GetButtonForAction(MediaSessionAction::kPlay); + EXPECT_NE(button, nullptr); + EXPECT_EQ(button->tag(), static_cast<int>(MediaSessionAction::kPlay)); } view()->UpdateWithMediaSessionInfo( media_session::mojom::MediaSessionInfo::New()); { - views::ToggleImageButton* button = static_cast<views::ToggleImageButton*>( - GetButtonForAction(MediaSessionAction::kPlay)); - ASSERT_EQ(views::ToggleImageButton::kViewClassName, button->GetClassName()); - EXPECT_FALSE(button->GetToggled()); + views::Button* button = GetButtonForAction(MediaSessionAction::kPlay); + EXPECT_NE(button, nullptr); + EXPECT_EQ(button->tag(), static_cast<int>(MediaSessionAction::kPlay)); } } @@ -548,10 +545,9 @@ EnableAction(MediaSessionAction::kPause); { - views::ToggleImageButton* button = static_cast<views::ToggleImageButton*>( - GetButtonForAction(MediaSessionAction::kPlay)); - ASSERT_EQ(views::ToggleImageButton::kViewClassName, button->GetClassName()); - EXPECT_FALSE(button->GetToggled()); + views::Button* button = GetButtonForAction(MediaSessionAction::kPlay); + EXPECT_NE(button, nullptr); + EXPECT_EQ(button->tag(), static_cast<int>(MediaSessionAction::kPlay)); } media_session::mojom::MediaSessionInfoPtr session_info( @@ -562,10 +558,9 @@ view()->UpdateWithMediaSessionInfo(session_info.Clone()); { - views::ToggleImageButton* button = static_cast<views::ToggleImageButton*>( - GetButtonForAction(MediaSessionAction::kPause)); - ASSERT_EQ(views::ToggleImageButton::kViewClassName, button->GetClassName()); - EXPECT_TRUE(button->GetToggled()); + views::Button* button = GetButtonForAction(MediaSessionAction::kPause); + EXPECT_NE(button, nullptr); + EXPECT_EQ(button->tag(), static_cast<int>(MediaSessionAction::kPause)); } session_info->playback_state = @@ -573,10 +568,9 @@ view()->UpdateWithMediaSessionInfo(session_info.Clone()); { - views::ToggleImageButton* button = static_cast<views::ToggleImageButton*>( - GetButtonForAction(MediaSessionAction::kPlay)); - ASSERT_EQ(views::ToggleImageButton::kViewClassName, button->GetClassName()); - EXPECT_FALSE(button->GetToggled()); + views::Button* button = GetButtonForAction(MediaSessionAction::kPlay); + EXPECT_NE(button, nullptr); + EXPECT_EQ(button->tag(), static_cast<int>(MediaSessionAction::kPlay)); } }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java index 86ba123e..b6846e1e 100644 --- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java +++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
@@ -298,6 +298,15 @@ } /** + * Creates an instance of Android payment app factory. + * @return The instance, can be null for testing. + */ + @Nullable + default PaymentAppFactoryInterface createAndroidPaymentAppFactory() { + return new AndroidPaymentAppFactory(); + } + + /** * @return The context of the current activity, can be null when WebContents has been * destroyed, the activity is gone, the window is closed, etc. */ @@ -543,6 +552,12 @@ private void startPaymentAppService() { PaymentAppService service = mDelegate.getPaymentAppService(); mBrowserPaymentRequest.addPaymentAppFactories(service, /*delegate=*/this); + + String androidFactoryId = AndroidPaymentAppFactory.class.getName(); + if (!service.containsFactory(androidFactoryId)) { + service.addUniqueFactory(mDelegate.createAndroidPaymentAppFactory(), androidFactoryId); + } + service.create(/*delegate=*/this); } @@ -658,6 +673,11 @@ */ public void invokePaymentApp( PaymentApp paymentApp, PaymentResponseHelperInterface paymentResponseHelper) { + if (paymentApp.getPaymentAppType() == PaymentAppType.NATIVE_MOBILE_APP) { + PaymentDetailsUpdateServiceHelper.getInstance().initialize(new PackageManagerDelegate(), + ((AndroidPaymentApp) paymentApp).packageName(), + this /* PaymentApp.PaymentRequestUpdateEventListener */); + } mPaymentResponseHelper = paymentResponseHelper; mJourneyLogger.recordCheckoutStep(CheckoutFunnelStep.PAYMENT_HANDLER_INVOKED); // Create maps that are subsets of mMethodData and mModifiers, that contain the payment @@ -1299,6 +1319,7 @@ assert !mSpec.isDestroyed() : "mSpec should not be used after being destroyed."; mSpec.retry(errors); mBrowserPaymentRequest.onRetry(errors); + PaymentDetailsUpdateServiceHelper.getInstance().reset(); } /** The component part of the {@link PaymentRequest#canMakePayment} implementation. */ @@ -1406,6 +1427,8 @@ if (sNativeObserverForTest != null) { sNativeObserverForTest.onClosed(); } + + PaymentDetailsUpdateServiceHelper.getInstance().reset(); } /** @return An observer for the payment request service, if any; otherwise, null. */ @@ -1674,5 +1697,6 @@ mInvokedPaymentApp = null; if (mBrowserPaymentRequest == null) return; mBrowserPaymentRequest.onInstrumentDetailsError(errorMessage); + PaymentDetailsUpdateServiceHelper.getInstance().reset(); } }
diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc index 747bd27a..5612e0b4 100644 --- a/components/plugins/renderer/webview_plugin.cc +++ b/components/plugins/renderer/webview_plugin.cc
@@ -361,6 +361,8 @@ v8::Isolate* isolate = blink::MainThreadIsolate(); v8::HandleScope handle_scope(isolate); + v8::MicrotasksScope microtasks_scope( + isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); v8::Local<v8::Context> context = frame_->MainWorldScriptContext(); DCHECK(!context.IsEmpty());
diff --git a/components/services/storage/service_worker/service_worker_database.cc b/components/services/storage/service_worker/service_worker_database.cc index d9e116c..5e118eb 100644 --- a/components/services/storage/service_worker/service_worker_database.cc +++ b/components/services/storage/service_worker/service_worker_database.cc
@@ -45,13 +45,19 @@ // key: "INITDATA_NEXT_VERSION_ID" // value: <int64_t 'next_available_version_id'> // -// key: "INITDATA_UNIQUE_ORIGIN:" + <GURL 'origin'> +// Note: This has changed from `GURL origin` to StorageKey but the name will +// be updated in the future to avoid a migration. +// TODO(crbug.com/1199077): Update name during a migration to Version 3. +// key: "INITDATA_UNIQUE_ORIGIN:" + <StorageKey 'key'> // value: <empty> // // key: "PRES:" + <int64_t 'purgeable_resource_id'> // value: <empty> // -// key: "REG:" + <GURL 'origin'> + '\x00' + <int64_t 'registration_id'> +// Note: This has changed from `GURL origin` to StorageKey but the name will +// be updated in the future to avoid a migration. +// TODO(crbug.com/1199077): Update name during a migration to Version 3. +// key: "REG:" + <StorageKey 'key'> + '\x00' + <int64_t 'registration_id'> // (ex. "REG:http://example.com\x00123456") // value: <ServiceWorkerRegistrationData serialized as a string> // @@ -73,6 +79,9 @@ // // Version 2 // +// Note: This has changed from `GURL origin` to StorageKey but the name will +// be updated in the future to avoid a migration. +// TODO(crbug.com/1199077): Update name during a migration to Version 3. // key: "REGID_TO_ORIGIN:" + <int64_t 'registration_id'> // value: <GURL 'origin'> // @@ -144,15 +153,15 @@ return true; } -std::string CreateRegistrationKeyPrefix(const url::Origin& origin) { +std::string CreateRegistrationKeyPrefix(const StorageKey& key) { return base::StringPrintf("%s%s%c", service_worker_internals::kRegKeyPrefix, - origin.GetURL().spec().c_str(), + key.Serialize().c_str(), service_worker_internals::kKeySeparator); } std::string CreateRegistrationKey(int64_t registration_id, - const url::Origin& origin) { - return CreateRegistrationKeyPrefix(origin).append( + const StorageKey& key) { + return CreateRegistrationKeyPrefix(key).append( base::NumberToString(registration_id)); } @@ -167,9 +176,9 @@ .append(base::NumberToString(resource_id)); } -std::string CreateUniqueOriginKey(const GURL& origin) { +std::string CreateUniqueOriginKey(const StorageKey& key) { return base::StringPrintf("%s%s", service_worker_internals::kUniqueOriginKey, - origin.GetOrigin().spec().c_str()); + key.Serialize().c_str()); } std::string CreateResourceIdKey(const char* key_prefix, int64_t resource_id) { @@ -201,15 +210,15 @@ .append(base::NumberToString(registration_id)); } -std::string CreateRegistrationIdToOriginKey(int64_t registration_id) { +std::string CreateRegistrationIdToStorageKey(int64_t registration_id) { return base::StringPrintf("%s%s", service_worker_internals::kRegIdToOriginKeyPrefix, base::NumberToString(registration_id).c_str()); } -void PutUniqueOriginToBatch(const GURL& origin, leveldb::WriteBatch* batch) { +void PutUniqueOriginToBatch(const StorageKey& key, leveldb::WriteBatch* batch) { // Value should be empty. - batch->Put(CreateUniqueOriginKey(origin), ""); + batch->Put(CreateUniqueOriginKey(key), ""); } void PutPurgeableResourceIdToBatch(int64_t resource_id, @@ -339,10 +348,10 @@ } ServiceWorkerDatabase::Status -ServiceWorkerDatabase::GetOriginsWithRegistrations( - std::set<url::Origin>* origins) { +ServiceWorkerDatabase::GetStorageKeysWithRegistrations( + std::set<StorageKey>* keys) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(origins->empty()); + DCHECK(keys->empty()); Status status = LazyOpen(false); if (IsNewOrNonexistentDatabase(status)) @@ -357,24 +366,23 @@ itr->Next()) { status = LevelDBStatusToServiceWorkerDBStatus(itr->status()); if (status != Status::kOk) { - origins->clear(); + keys->clear(); break; } - std::string origin_str; + std::string key_str; if (!RemovePrefix(itr->key().ToString(), - service_worker_internals::kUniqueOriginKey, - &origin_str)) + service_worker_internals::kUniqueOriginKey, &key_str)) break; - GURL origin(origin_str); - if (!origin.is_valid()) { + StorageKey key = StorageKey::Deserialize(key_str); + if (key.opaque()) { status = Status::kErrorCorrupted; - origins->clear(); + keys->clear(); break; } - origins->insert(url::Origin::Create(origin)); + keys->insert(key); } } @@ -382,8 +390,9 @@ return status; } -ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetRegistrationsForOrigin( - const url::Origin& origin, +ServiceWorkerDatabase::Status +ServiceWorkerDatabase::GetRegistrationsForStorageKey( + const StorageKey& key, std::vector<mojom::ServiceWorkerRegistrationDataPtr>* registrations, std::vector<std::vector<mojom::ServiceWorkerResourceRecordPtr>>* opt_resources_list) { @@ -396,7 +405,7 @@ if (status != Status::kOk) return status; - std::string prefix = CreateRegistrationKeyPrefix(origin); + std::string prefix = CreateRegistrationKeyPrefix(key); // Read all registrations. { @@ -454,8 +463,8 @@ return status; } -ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetUsageForOrigin( - const url::Origin& origin, +ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetUsageForStorageKey( + const StorageKey& key, int64_t& out_usage) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -467,7 +476,7 @@ if (status != Status::kOk) return status; - std::string prefix = CreateRegistrationKeyPrefix(origin); + std::string prefix = CreateRegistrationKeyPrefix(key); // Read all registrations. { @@ -548,7 +557,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistration( int64_t registration_id, - const GURL& origin, + const StorageKey& key, mojom::ServiceWorkerRegistrationDataPtr* registration, std::vector<mojom::ServiceWorkerResourceRecordPtr>* resources) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -561,8 +570,7 @@ if (status != Status::kOk) return status; - status = ReadRegistrationData(registration_id, url::Origin::Create(origin), - registration); + status = ReadRegistrationData(registration_id, key, registration); if (status != Status::kOk) return status; @@ -577,11 +585,11 @@ return Status::kOk; } -ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationOrigin( +ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationStorageKey( int64_t registration_id, - GURL* origin) { + StorageKey* key) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(origin); + DCHECK(key); Status status = LazyOpen(true); if (IsNewOrNonexistentDatabase(status)) @@ -592,21 +600,21 @@ std::string value; status = LevelDBStatusToServiceWorkerDBStatus( db_->Get(leveldb::ReadOptions(), - CreateRegistrationIdToOriginKey(registration_id), &value)); + CreateRegistrationIdToStorageKey(registration_id), &value)); if (status != Status::kOk) { HandleReadResult(FROM_HERE, status == Status::kErrorNotFound ? Status::kOk : status); return status; } - GURL parsed(value); - if (!parsed.is_valid()) { + StorageKey parsed = StorageKey::Deserialize(value); + if (parsed.opaque()) { status = Status::kErrorCorrupted; HandleReadResult(FROM_HERE, status); return status; } - *origin = parsed; + *key = std::move(parsed); HandleReadResult(FROM_HERE, Status::kOk); return Status::kOk; } @@ -627,7 +635,8 @@ BumpNextRegistrationIdIfNeeded(registration.registration_id, &batch); BumpNextVersionIdIfNeeded(registration.version_id, &batch); - PutUniqueOriginToBatch(registration.scope.GetOrigin(), &batch); + PutUniqueOriginToBatch( + StorageKey(url::Origin::Create(registration.scope.GetOrigin())), &batch); DCHECK_EQ(AccumulateResourceSizeInBytes(resources), registration.resources_total_size_bytes) @@ -635,8 +644,11 @@ << "sizes of the resources."; WriteRegistrationDataInBatch(registration, &batch); - batch.Put(CreateRegistrationIdToOriginKey(registration.registration_id), - registration.scope.GetOrigin().spec()); + // TODO(crbug.com/1199077): Update when RegistrationData uses StorageKey + StorageKey key(url::Origin::Create(registration.scope.GetOrigin())); + + batch.Put(CreateRegistrationIdToStorageKey(registration.registration_id), + key.Serialize()); // Used for avoiding multiple writes for the same resource id or url. std::set<int64_t> pushed_resources; @@ -663,9 +675,9 @@ // Retrieve a previous version to sweep purgeable resources. mojom::ServiceWorkerRegistrationDataPtr old_registration; - status = ReadRegistrationData(registration.registration_id, - url::Origin::Create(registration.scope), - &old_registration); + status = ReadRegistrationData( + registration.registration_id, + StorageKey(url::Origin::Create(registration.scope)), &old_registration); if (status != Status::kOk && status != Status::kErrorNotFound) return status; if (status == Status::kOk) { @@ -696,19 +708,18 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::UpdateVersionToActive( int64_t registration_id, - const GURL& origin) { + const StorageKey& key) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); Status status = LazyOpen(false); if (IsNewOrNonexistentDatabase(status)) return Status::kErrorNotFound; if (status != Status::kOk) return status; - if (!origin.is_valid()) + if (key.opaque()) return Status::kErrorFailed; mojom::ServiceWorkerRegistrationDataPtr registration; - status = ReadRegistrationData(registration_id, url::Origin::Create(origin), - ®istration); + status = ReadRegistrationData(registration_id, key, ®istration); if (status != Status::kOk) return status; @@ -721,7 +732,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::UpdateLastCheckTime( int64_t registration_id, - const GURL& origin, + const StorageKey& key, const base::Time& time) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); Status status = LazyOpen(false); @@ -729,12 +740,11 @@ return Status::kErrorNotFound; if (status != Status::kOk) return status; - if (!origin.is_valid()) + if (key.opaque()) return Status::kErrorFailed; mojom::ServiceWorkerRegistrationDataPtr registration; - status = ReadRegistrationData(registration_id, url::Origin::Create(origin), - ®istration); + status = ReadRegistrationData(registration_id, key, ®istration); if (status != Status::kOk) return status; @@ -747,7 +757,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::UpdateNavigationPreloadEnabled(int64_t registration_id, - const GURL& origin, + const StorageKey& key, bool enable) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); Status status = LazyOpen(false); @@ -755,12 +765,11 @@ return Status::kErrorNotFound; if (status != Status::kOk) return status; - if (!origin.is_valid()) + if (key.opaque()) return Status::kErrorFailed; mojom::ServiceWorkerRegistrationDataPtr registration; - status = ReadRegistrationData(registration_id, url::Origin::Create(origin), - ®istration); + status = ReadRegistrationData(registration_id, key, ®istration); if (status != Status::kOk) return status; @@ -773,7 +782,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::UpdateNavigationPreloadHeader(int64_t registration_id, - const GURL& origin, + const StorageKey& key, const std::string& value) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); Status status = LazyOpen(false); @@ -781,12 +790,11 @@ return Status::kErrorNotFound; if (status != Status::kOk) return status; - if (!origin.is_valid()) + if (key.opaque()) return Status::kErrorFailed; mojom::ServiceWorkerRegistrationDataPtr registration; - status = ReadRegistrationData(registration_id, url::Origin::Create(origin), - ®istration); + status = ReadRegistrationData(registration_id, key, ®istration); if (status != Status::kOk) return status; @@ -799,7 +807,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteRegistration( int64_t registration_id, - const GURL& origin, + const StorageKey& key, DeletedVersion* deleted_version) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(deleted_version); @@ -809,29 +817,27 @@ return Status::kOk; if (status != Status::kOk) return status; - if (!origin.is_valid()) + if (key.opaque()) return Status::kErrorFailed; leveldb::WriteBatch batch; - // Remove |origin| from unique origins if a registration specified by - // |registration_id| is the only one for |origin|. + // Remove |key| from unique origins if a registration specified by + // |registration_id| is the only one for |key|. // TODO(nhiroki): Check the uniqueness by more efficient way. std::vector<mojom::ServiceWorkerRegistrationDataPtr> registrations; - status = GetRegistrationsForOrigin(url::Origin::Create(origin), - ®istrations, nullptr); + status = GetRegistrationsForStorageKey(key, ®istrations, nullptr); if (status != Status::kOk) return status; if (registrations.size() == 1 && registrations[0]->registration_id == registration_id) { - batch.Delete(CreateUniqueOriginKey(origin)); + batch.Delete(CreateUniqueOriginKey(key)); } // Delete a registration specified by |registration_id|. - batch.Delete( - CreateRegistrationKey(registration_id, url::Origin::Create(origin))); - batch.Delete(CreateRegistrationIdToOriginKey(registration_id)); + batch.Delete(CreateRegistrationKey(registration_id, key)); + batch.Delete(CreateRegistrationIdToStorageKey(registration_id)); // Delete resource records and user data associated with the registration. for (const auto& registration : registrations) { @@ -985,7 +991,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteUserData( int64_t registration_id, - const url::Origin& origin, + const StorageKey& key, const std::vector<mojom::ServiceWorkerUserDataPtr>& user_data) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_NE(blink::mojom::kInvalidServiceWorkerRegistrationId, registration_id); @@ -999,7 +1005,7 @@ // There should be the registration specified by |registration_id|. mojom::ServiceWorkerRegistrationDataPtr registration; - status = ReadRegistrationData(registration_id, origin, ®istration); + status = ReadRegistrationData(registration_id, key, ®istration); if (status != Status::kOk) return status; @@ -1346,8 +1352,9 @@ return WriteBatch(&batch); } -ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteAllDataForOrigins( - const std::set<GURL>& origins, +ServiceWorkerDatabase::Status +ServiceWorkerDatabase::DeleteAllDataForStorageKeys( + const std::set<StorageKey>& keys, std::vector<int64_t>* newly_purgeable_resources) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); Status status = LazyOpen(false); @@ -1357,24 +1364,22 @@ return status; leveldb::WriteBatch batch; - for (const GURL& origin : origins) { - if (!origin.is_valid()) + for (const StorageKey& key : keys) { + if (key.opaque()) return Status::kErrorFailed; // Delete from the unique origin list. - batch.Delete(CreateUniqueOriginKey(origin)); + batch.Delete(CreateUniqueOriginKey(key)); std::vector<mojom::ServiceWorkerRegistrationDataPtr> registrations; - status = GetRegistrationsForOrigin(url::Origin::Create(origin), - ®istrations, nullptr); + status = GetRegistrationsForStorageKey(key, ®istrations, nullptr); if (status != Status::kOk) return status; // Delete registrations, resource records and user data. for (const auto& data : registrations) { - batch.Delete(CreateRegistrationKey(data->registration_id, - url::Origin::Create(origin))); - batch.Delete(CreateRegistrationIdToOriginKey(data->registration_id)); + batch.Delete(CreateRegistrationKey(data->registration_id, key)); + batch.Delete(CreateRegistrationIdToStorageKey(data->registration_id)); status = DeleteResourceRecords(data->version_id, newly_purgeable_resources, &batch); @@ -1507,15 +1512,16 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData( int64_t registration_id, - const url::Origin& origin, + const StorageKey& key, mojom::ServiceWorkerRegistrationDataPtr* registration) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(registration); - const std::string key = CreateRegistrationKey(registration_id, origin); + const std::string registration_key = + CreateRegistrationKey(registration_id, key); std::string value; Status status = LevelDBStatusToServiceWorkerDBStatus( - db_->Get(leveldb::ReadOptions(), key, &value)); + db_->Get(leveldb::ReadOptions(), registration_key, &value)); if (status != Status::kOk) { HandleReadResult(FROM_HERE, status == Status::kErrorNotFound ? Status::kOk : status); @@ -1730,8 +1736,8 @@ std::string value; bool success = data.SerializeToString(&value); DCHECK(success); - url::Origin origin = url::Origin::Create(registration.scope); - batch->Put(CreateRegistrationKey(data.registration_id(), origin), value); + StorageKey key(url::Origin::Create(registration.scope)); + batch->Put(CreateRegistrationKey(data.registration_id(), key), value); } ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
diff --git a/components/services/storage/service_worker/service_worker_database.h b/components/services/storage/service_worker/service_worker_database.h index 2d0611f..46d5e66 100644 --- a/components/services/storage/service_worker/service_worker_database.h +++ b/components/services/storage/service_worker/service_worker_database.h
@@ -20,6 +20,7 @@ #include "base/optional.h" #include "base/sequence_checker.h" #include "base/time/time.h" +#include "components/services/storage/public/cpp/storage_key.h" #include "components/services/storage/public/mojom/service_worker_database.mojom.h" #include "components/services/storage/public/mojom/service_worker_storage_control.mojom.h" #include "services/network/public/mojom/cross_origin_embedder_policy.mojom.h" @@ -83,21 +84,21 @@ int64_t* next_avail_version_id, int64_t* next_avail_resource_id); - // Reads origins that have one or more than one registration from the + // Reads keys that have one or more registration from the // database. Returns OK if they are successfully read or not found. // Otherwise, returns an error. - Status GetOriginsWithRegistrations(std::set<url::Origin>* origins); + Status GetStorageKeysWithRegistrations(std::set<StorageKey>* key); - // Reads registrations for |origin| from the database. Returns OK if they are + // Reads registrations for |key| from the database. Returns OK if they are // successfully read or not found. Otherwise, returns an error. - Status GetRegistrationsForOrigin( - const url::Origin& origin, + Status GetRegistrationsForStorageKey( + const StorageKey& key, std::vector<mojom::ServiceWorkerRegistrationDataPtr>* registrations, std::vector<std::vector<mojom::ServiceWorkerResourceRecordPtr>>* opt_resources_list); - // Reads the total resource size stored in the database for |origin|. - Status GetUsageForOrigin(const url::Origin& origin, int64_t& out_usage); + // Reads the total resource size stored in the database for |key|. + Status GetUsageForStorageKey(const StorageKey& key, int64_t& out_usage); // Reads all registrations from the database. Returns OK if successfully read // or not found. Otherwise, returns an error. @@ -114,14 +115,14 @@ // Otherwise, returns an error. Status ReadRegistration( int64_t registration_id, - const GURL& origin, + const StorageKey& key, mojom::ServiceWorkerRegistrationDataPtr* registration, std::vector<mojom::ServiceWorkerResourceRecordPtr>* resources); - // Looks up the origin for the registration with |registration_id|. Returns OK + // Looks up the key for the registration with |registration_id|. Returns OK // if a registration was found and read successfully. Otherwise, returns an // error. - Status ReadRegistrationOrigin(int64_t registration_id, GURL* origin); + Status ReadRegistrationStorageKey(int64_t registration_id, StorageKey* key); // Writes |registration| and |resources| into the database and does following // things: @@ -138,21 +139,21 @@ // Updates a registration for |registration_id| to an active state. Returns OK // if it's successfully updated. Otherwise, returns an error. - Status UpdateVersionToActive(int64_t registration_id, const GURL& origin); + Status UpdateVersionToActive(int64_t registration_id, const StorageKey& key); // Updates last check time of a registration for |registration_id| by |time|. // Returns OK if it's successfully updated. Otherwise, returns an error. Status UpdateLastCheckTime(int64_t registration_id, - const GURL& origin, + const StorageKey& key, const base::Time& time); // Updates the navigation preload state for the specified registration. // Returns OK if it's successfully updated. Otherwise, returns an error. Status UpdateNavigationPreloadEnabled(int64_t registration_id, - const GURL& origin, + const StorageKey& key, bool enable); Status UpdateNavigationPreloadHeader(int64_t registration_id, - const GURL& origin, + const StorageKey& key, const std::string& value); // Deletes a registration for |registration_id| and moves resource records @@ -162,7 +163,7 @@ // Returns OK if it's successfully deleted or not found in the database. // Otherwise, returns an error. Status DeleteRegistration(int64_t registration_id, - const GURL& origin, + const StorageKey& key, DeletedVersion* deleted_version); // Reads user data for |registration_id| and |user_data_names| from the @@ -192,7 +193,7 @@ // registration specified by |registration_id| does not exist in the database. Status WriteUserData( int64_t registration_id, - const url::Origin& origin, + const StorageKey& key, const std::vector<mojom::ServiceWorkerUserDataPtr>& user_data); // Deletes user data for |registration_id| and |user_data_names| from the @@ -260,12 +261,12 @@ // returns an error. Status PurgeUncommittedResourceIds(const std::vector<int64_t>& ids); - // Deletes all data for |origins|, namely, unique origin, registrations and + // Deletes all data for |keys|, namely, unique origin, registrations and // resource records. Resources are moved to the purgeable list. Returns OK if // they are successfully deleted or not found in the database. Otherwise, // returns an error. - Status DeleteAllDataForOrigins( - const std::set<GURL>& origins, + Status DeleteAllDataForStorageKeys( + const std::set<StorageKey>& keys, std::vector<int64_t>* newly_purgeable_resources); // Completely deletes the contents of the database. @@ -293,7 +294,7 @@ // if successfully reads. Otherwise, returns an error. Status ReadRegistrationData( int64_t registration_id, - const url::Origin& origin, + const StorageKey& key, mojom::ServiceWorkerRegistrationDataPtr* registration); // Parses |serialized| as a RegistrationData object and pushes it into |out|.
diff --git a/components/services/storage/service_worker/service_worker_database_unittest.cc b/components/services/storage/service_worker/service_worker_database_unittest.cc index 16707c8..da1ecec5 100644 --- a/components/services/storage/service_worker/service_worker_database_unittest.cc +++ b/components/services/storage/service_worker/service_worker_database_unittest.cc
@@ -9,9 +9,10 @@ #include <string> +#include "base/containers/contains.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" -#include "base/stl_util.h" +#include "base/path_service.h" #include "base/strings/string_number_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "components/services/storage/service_worker/service_worker_database.pb.h" @@ -166,6 +167,7 @@ resources.push_back(CreateResource(1, URL(origin, "/resource"), 10)); ServiceWorkerDatabase::DeletedVersion deleted_version; RegistrationData data; + data.scope = origin; data.resources_total_size_bytes = 10; ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data, resources, &deleted_version)); @@ -189,6 +191,7 @@ resources.push_back(CreateResource(1, URL(origin, "/resource"), 10)); ServiceWorkerDatabase::DeletedVersion deleted_version; RegistrationData data; + data.scope = origin; data.resources_total_size_bytes = 10; ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data, resources, &deleted_version)); @@ -227,6 +230,7 @@ resources.push_back(CreateResource(1, URL(origin, "/resource"), 10)); ServiceWorkerDatabase::DeletedVersion deleted_version; RegistrationData data; + data.scope = origin; data.resources_total_size_bytes = 10; ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data, resources, &deleted_version)); @@ -348,21 +352,22 @@ EXPECT_EQ(21, ids.res_id); } -TEST(ServiceWorkerDatabaseTest, GetOriginsWithRegistrations) { +TEST(ServiceWorkerDatabaseTest, GetStorageKeysWithRegistrations) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); - std::set<url::Origin> origins; + std::set<StorageKey> keys; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetOriginsWithRegistrations(&origins)); - EXPECT_TRUE(origins.empty()); + database->GetStorageKeysWithRegistrations(&keys)); + EXPECT_TRUE(keys.empty()); ServiceWorkerDatabase::DeletedVersion deleted_version; - url::Origin origin1 = url::Origin::Create(GURL("https://example.com")); + GURL origin1 = GURL("https://example.com"); + StorageKey key1(url::Origin::Create(origin1)); RegistrationData data1; data1.registration_id = 123; - data1.scope = URL(origin1.GetURL(), "/foo"); - data1.script = URL(origin1.GetURL(), "/script1.js"); + data1.scope = URL(origin1, "/foo"); + data1.script = URL(origin1, "/script1.js"); data1.version_id = 456; data1.resources_total_size_bytes = 100; std::vector<ResourceRecordPtr> resources1; @@ -370,11 +375,12 @@ ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data1, resources1, &deleted_version)); - url::Origin origin2 = url::Origin::Create(GURL("https://www.example.com")); + GURL origin2 = GURL("https://www.example.com"); + StorageKey key2(url::Origin::Create(origin2)); RegistrationData data2; data2.registration_id = 234; - data2.scope = URL(origin2.GetURL(), "/bar"); - data2.script = URL(origin2.GetURL(), "/script2.js"); + data2.scope = URL(origin2, "/bar"); + data2.script = URL(origin2, "/script2.js"); data2.version_id = 567; data2.resources_total_size_bytes = 200; std::vector<ResourceRecordPtr> resources2; @@ -382,11 +388,12 @@ ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data2, resources2, &deleted_version)); - url::Origin origin3 = url::Origin::Create(GURL("https://example.org")); + GURL origin3 = GURL("https://example.org"); + StorageKey key3(url::Origin::Create(origin3)); RegistrationData data3; data3.registration_id = 345; - data3.scope = URL(origin3.GetURL(), "/hoge"); - data3.script = URL(origin3.GetURL(), "/script3.js"); + data3.scope = URL(origin3, "/hoge"); + data3.script = URL(origin3, "/script3.js"); data3.version_id = 678; data3.resources_total_size_bytes = 300; std::vector<ResourceRecordPtr> resources3; @@ -394,11 +401,11 @@ ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data3, resources3, &deleted_version)); - // |origin3| has two registrations. + // |key3| has two registrations. RegistrationData data4; data4.registration_id = 456; - data4.scope = URL(origin3.GetURL(), "/fuga"); - data4.script = URL(origin3.GetURL(), "/script4.js"); + data4.scope = URL(origin3, "/fuga"); + data4.script = URL(origin3, "/script4.js"); data4.version_id = 789; data4.resources_total_size_bytes = 400; std::vector<ResourceRecordPtr> resources4; @@ -406,55 +413,59 @@ ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data4, resources4, &deleted_version)); - origins.clear(); + keys.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetOriginsWithRegistrations(&origins)); - EXPECT_EQ(3U, origins.size()); - EXPECT_TRUE(base::Contains(origins, origin1)); - EXPECT_TRUE(base::Contains(origins, origin2)); - EXPECT_TRUE(base::Contains(origins, origin3)); + database->GetStorageKeysWithRegistrations(&keys)); + EXPECT_EQ(3U, keys.size()); + EXPECT_TRUE(base::Contains(keys, key1)); + EXPECT_TRUE(base::Contains(keys, key2)); + EXPECT_TRUE(base::Contains(keys, key3)); - // |origin3| has another registration, so should not remove it from the + // |key3| has another registration, so should not remove it from the // unique origin list. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(data4.registration_id, - origin3.GetURL(), &deleted_version)); + database->DeleteRegistration(data4.registration_id, key3, + &deleted_version)); EXPECT_EQ(data4.registration_id, deleted_version.registration_id); - origins.clear(); + keys.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetOriginsWithRegistrations(&origins)); - EXPECT_EQ(3U, origins.size()); - EXPECT_TRUE(base::Contains(origins, origin1)); - EXPECT_TRUE(base::Contains(origins, origin2)); - EXPECT_TRUE(base::Contains(origins, origin3)); + database->GetStorageKeysWithRegistrations(&keys)); + EXPECT_EQ(3U, keys.size()); + EXPECT_TRUE(base::Contains(keys, key1)); + EXPECT_TRUE(base::Contains(keys, key2)); + EXPECT_TRUE(base::Contains(keys, key3)); - // |origin3| should be removed from the unique origin list. + // |key3| should be removed from the unique origin list. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(data3.registration_id, - origin3.GetURL(), &deleted_version)); + database->DeleteRegistration(data3.registration_id, key3, + &deleted_version)); EXPECT_EQ(data3.registration_id, deleted_version.registration_id); - origins.clear(); + keys.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetOriginsWithRegistrations(&origins)); - EXPECT_EQ(2U, origins.size()); - EXPECT_TRUE(base::Contains(origins, origin1)); - EXPECT_TRUE(base::Contains(origins, origin2)); + database->GetStorageKeysWithRegistrations(&keys)); + EXPECT_EQ(2U, keys.size()); + EXPECT_TRUE(base::Contains(keys, key1)); + EXPECT_TRUE(base::Contains(keys, key2)); } -TEST(ServiceWorkerDatabaseTest, GetRegistrationsForOrigin) { +TEST(ServiceWorkerDatabaseTest, GetRegistrationsForStorageKey) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); GURL origin1("https://example.com"); GURL origin2("https://www.example.com"); GURL origin3("https://example.org"); + StorageKey key1(url::Origin::Create(origin1)); + StorageKey key2(url::Origin::Create(origin2)); + StorageKey key3(url::Origin::Create(origin3)); + std::vector<mojom::ServiceWorkerRegistrationDataPtr> registrations; std::vector<std::vector<ResourceRecordPtr>> resources_list; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetRegistrationsForOrigin( - url::Origin::Create(origin1), ®istrations, &resources_list)); + database->GetRegistrationsForStorageKey(key1, ®istrations, + &resources_list)); EXPECT_TRUE(registrations.empty()); EXPECT_TRUE(resources_list.empty()); @@ -476,8 +487,8 @@ registrations.clear(); resources_list.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetRegistrationsForOrigin( - url::Origin::Create(origin1), ®istrations, &resources_list)); + database->GetRegistrationsForStorageKey(key1, ®istrations, + &resources_list)); EXPECT_EQ(1U, registrations.size()); VerifyRegistrationData(data1, *registrations[0]); EXPECT_EQ(1U, resources_list.size()); @@ -499,8 +510,8 @@ registrations.clear(); resources_list.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetRegistrationsForOrigin( - url::Origin::Create(origin2), ®istrations, &resources_list)); + database->GetRegistrationsForStorageKey(key2, ®istrations, + &resources_list)); EXPECT_EQ(1U, registrations.size()); VerifyRegistrationData(data2, *registrations[0]); EXPECT_EQ(1U, resources_list.size()); @@ -519,7 +530,7 @@ ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data3, resources3, &deleted_version)); - // |origin3| has two registrations. + // |key3| has two registrations. RegistrationData data4; data4.registration_id = 400; data4.scope = URL(origin3, "/fuga"); @@ -536,8 +547,8 @@ registrations.clear(); resources_list.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetRegistrationsForOrigin( - url::Origin::Create(origin3), ®istrations, &resources_list)); + database->GetRegistrationsForStorageKey(key3, ®istrations, + &resources_list)); EXPECT_EQ(2U, registrations.size()); VerifyRegistrationData(data3, *registrations[0]); VerifyRegistrationData(data4, *registrations[1]); @@ -545,12 +556,12 @@ VerifyResourceRecords(resources3, resources_list[0]); VerifyResourceRecords(resources4, resources_list[1]); - // The third parameter |opt_resources_list| to GetRegistrationsForOrigin() + // The third parameter |opt_resources_list| to GetRegistrationsForStorageKey() // is optional. So, nullptr should be acceptable. registrations.clear(); - EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetRegistrationsForOrigin(url::Origin::Create(origin1), - ®istrations, nullptr)); + EXPECT_EQ( + ServiceWorkerDatabase::Status::kOk, + database->GetRegistrationsForStorageKey(key1, ®istrations, nullptr)); EXPECT_EQ(1U, registrations.size()); VerifyRegistrationData(data1, *registrations[0]); } @@ -631,6 +642,7 @@ std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); GURL origin("https://example.com"); + StorageKey key(url::Origin::Create(origin)); RegistrationData data; data.registration_id = 100; data.scope = URL(origin, "/foo"); @@ -670,15 +682,15 @@ RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data.registration_id, origin, &data_out, + database->ReadRegistration(data.registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(data, *data_out); VerifyResourceRecords(resources, resources_out); - GURL origin_out; + StorageKey key_out; EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, - database->ReadRegistrationOrigin(data.registration_id, &origin_out)); - EXPECT_EQ(origin, origin_out); + database->ReadRegistrationStorageKey(data.registration_id, &key_out)); + EXPECT_EQ(key, key_out); // Make sure that the resource is removed from the uncommitted list. uncommitted_ids_out.clear(); @@ -687,7 +699,7 @@ EXPECT_TRUE(uncommitted_ids_out.empty()); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(data.registration_id, origin, + database->DeleteRegistration(data.registration_id, key, &deleted_version)); EXPECT_EQ(data.version_id, deleted_version.version_id); ASSERT_EQ(resources.size(), deleted_version.newly_purgeable_resources.size()); @@ -698,12 +710,12 @@ // Make sure that the registration and resource records are gone. resources_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistration(data.registration_id, origin, &data_out, + database->ReadRegistration(data.registration_id, key, &data_out, &resources_out)); EXPECT_TRUE(resources_out.empty()); EXPECT_EQ( ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistrationOrigin(data.registration_id, &origin_out)); + database->ReadRegistrationStorageKey(data.registration_id, &key_out)); // Resources should be purgeable because these are no longer referred. std::vector<int64_t> purgeable_ids_out; @@ -744,8 +756,9 @@ deleted_version.version_id = kArbitraryVersionId; deleted_version.newly_purgeable_resources.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(kNonExistentRegistrationId, origin, - &deleted_version)); + database->DeleteRegistration( + kNonExistentRegistrationId, + StorageKey(url::Origin::Create(origin)), &deleted_version)); EXPECT_EQ(blink::mojom::kInvalidServiceWorkerVersionId, deleted_version.version_id); EXPECT_TRUE(deleted_version.newly_purgeable_resources.empty()); @@ -754,9 +767,10 @@ deleted_version.version_id = kArbitraryVersionId; deleted_version.newly_purgeable_resources.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(kNonExistentRegistrationId, - GURL("https://example.net"), - &deleted_version)); + database->DeleteRegistration( + kNonExistentRegistrationId, + StorageKey(url::Origin::Create(GURL("https://example.net"))), + &deleted_version)); EXPECT_EQ(blink::mojom::kInvalidServiceWorkerVersionId, deleted_version.version_id); EXPECT_TRUE(deleted_version.newly_purgeable_resources.empty()); @@ -766,6 +780,7 @@ std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); GURL origin("https://example.com"); + StorageKey key(url::Origin::Create(origin)); RegistrationData data; data.registration_id = 100; data.scope = URL(origin, "/foo"); @@ -793,7 +808,7 @@ RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data.registration_id, origin, &data_out, + database->ReadRegistration(data.registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(data, *data_out); VerifyResourceRecords(resources1, resources_out); @@ -828,7 +843,7 @@ // is moved to the purgeable list. resources_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(updated_data->registration_id, origin, + database->ReadRegistration(updated_data->registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(*updated_data, *data_out); VerifyResourceRecords(resources2, resources_out); @@ -844,6 +859,7 @@ TEST(ServiceWorkerDatabaseTest, Registration_Multiple) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); GURL origin("https://example.com"); + StorageKey key(url::Origin::Create(origin)); ServiceWorkerDatabase::DeletedVersion deleted_version; @@ -879,27 +895,27 @@ RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data1.registration_id, origin, &data_out, + database->ReadRegistration(data1.registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(data1, *data_out); VerifyResourceRecords(resources1, resources_out); - GURL origin_out; + StorageKey key_out; EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, - database->ReadRegistrationOrigin(data1.registration_id, &origin_out)); - EXPECT_EQ(origin, origin_out); + database->ReadRegistrationStorageKey(data1.registration_id, &key_out)); + EXPECT_EQ(key, key_out); // Make sure that registration2 is also stored. resources_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data2.registration_id, origin, &data_out, + database->ReadRegistration(data2.registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(data2, *data_out); VerifyResourceRecords(resources2, resources_out); EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, - database->ReadRegistrationOrigin(data2.registration_id, &origin_out)); - EXPECT_EQ(origin, origin_out); + database->ReadRegistrationStorageKey(data2.registration_id, &key_out)); + EXPECT_EQ(key, key_out); std::vector<int64_t> purgeable_ids_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, @@ -908,19 +924,19 @@ // Delete registration1. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(data1.registration_id, origin, + database->DeleteRegistration(data1.registration_id, key, &deleted_version)); EXPECT_EQ(data1.registration_id, deleted_version.registration_id); // Make sure that registration1 is gone. resources_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistration(data1.registration_id, origin, &data_out, + database->ReadRegistration(data1.registration_id, key, &data_out, &resources_out)); EXPECT_TRUE(resources_out.empty()); EXPECT_EQ( ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistrationOrigin(data1.registration_id, &origin_out)); + database->ReadRegistrationStorageKey(data1.registration_id, &key_out)); purgeable_ids_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, @@ -932,35 +948,36 @@ // Make sure that registration2 is still alive. resources_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data2.registration_id, origin, &data_out, + database->ReadRegistration(data2.registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(data2, *data_out); VerifyResourceRecords(resources2, resources_out); EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, - database->ReadRegistrationOrigin(data2.registration_id, &origin_out)); - EXPECT_EQ(origin, origin_out); + database->ReadRegistrationStorageKey(data2.registration_id, &key_out)); + EXPECT_EQ(key, key_out); } TEST(ServiceWorkerDatabaseTest, Registration_UninitializedDatabase) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const GURL origin("https://example.com"); + StorageKey key(url::Origin::Create(origin)); // Should be failed because the database does not exist. RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistration(100, origin, &data_out, &resources_out)); + database->ReadRegistration(100, key, &data_out, &resources_out)); EXPECT_TRUE(data_out.is_null()); EXPECT_TRUE(resources_out.empty()); - GURL origin_out; + StorageKey key_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistrationOrigin(100, &origin_out)); + database->ReadRegistrationStorageKey(100, &key_out)); // Deleting non-existent registration should succeed. ServiceWorkerDatabase::DeletedVersion deleted_version; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(100, origin, &deleted_version)); + database->DeleteRegistration(100, key, &deleted_version)); EXPECT_EQ(blink::mojom::kInvalidServiceWorkerVersionId, deleted_version.version_id); EXPECT_TRUE(deleted_version.newly_purgeable_resources.empty()); @@ -972,15 +989,15 @@ ASSERT_EQ(ServiceWorkerDatabase::DATABASE_STATE_UNINITIALIZED, database->state_); EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistration(100, origin, &data_out, &resources_out)); + database->ReadRegistration(100, key, &data_out, &resources_out)); EXPECT_TRUE(data_out.is_null()); EXPECT_TRUE(resources_out.empty()); EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistrationOrigin(100, &origin_out)); + database->ReadRegistrationStorageKey(100, &key_out)); // Deleting non-existent registration should succeed. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(100, origin, &deleted_version)); + database->DeleteRegistration(100, key, &deleted_version)); EXPECT_EQ(blink::mojom::kInvalidServiceWorkerVersionId, deleted_version.version_id); EXPECT_TRUE(deleted_version.newly_purgeable_resources.empty()); @@ -1039,24 +1056,27 @@ RegistrationDataPtr data; std::vector<ResourceRecordPtr> resources; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data1.registration_id, origin1, &data, - &resources)); + database->ReadRegistration(data1.registration_id, + StorageKey(url::Origin::Create(origin1)), + &data, &resources)); VerifyRegistrationData(data1, *data); VerifyResourceRecords(resources1, resources); EXPECT_EQ(2U, resources.size()); resources.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data2.registration_id, origin2, &data, - &resources)); + database->ReadRegistration(data2.registration_id, + StorageKey(url::Origin::Create(origin2)), + &data, &resources)); VerifyRegistrationData(data2, *data); VerifyResourceRecords(resources2, resources); EXPECT_EQ(2U, resources.size()); resources.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data3.registration_id, origin3, &data, - &resources)); + database->ReadRegistration(data3.registration_id, + StorageKey(url::Origin::Create(origin3)), + &data, &resources)); VerifyRegistrationData(data3, *data); VerifyResourceRecords(resources3, resources); EXPECT_EQ(2U, resources.size()); @@ -1066,6 +1086,7 @@ TEST(ServiceWorkerDatabaseTest, UserData_Basic) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const url::Origin kOrigin = url::Origin::Create(GURL("https://example.com")); + StorageKey key(kOrigin); // Add a registration. RegistrationData data; @@ -1084,7 +1105,7 @@ std::vector<std::string> user_data_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data.registration_id, kOrigin, + data.registration_id, key, CreateUserData(data.registration_id, {{"key1", "data"}}))); EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, @@ -1094,14 +1115,14 @@ // Writing user data not associated with the stored registration should be // failed. - EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->WriteUserData( - 300, kOrigin, - CreateUserData(data.registration_id, {{"key1", "data"}}))); + EXPECT_EQ( + ServiceWorkerDatabase::Status::kErrorNotFound, + database->WriteUserData( + 300, key, CreateUserData(data.registration_id, {{"key1", "data"}}))); // Write empty user data for a different key. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->WriteUserData(data.registration_id, kOrigin, + database->WriteUserData(data.registration_id, key, CreateUserData(data.registration_id, {{"key2", std::string()}}))); EXPECT_EQ( @@ -1118,7 +1139,7 @@ // Overwrite the existing user data. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data.registration_id, kOrigin, + data.registration_id, key, CreateUserData(data.registration_id, {{"key1", "overwrite"}}))); EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, @@ -1142,7 +1163,7 @@ // Write/overwrite multiple user data keys. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data.registration_id, kOrigin, + data.registration_id, key, CreateUserData(data.registration_id, {{"key2", "overwrite2"}, {"key3", "data3"}, {"key4", "data4"}}))); @@ -1186,6 +1207,7 @@ UserData_ReadUserDataForAllRegistrationsByKeyPrefix) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const url::Origin kOrigin = url::Origin::Create(GURL("https://example.com")); + StorageKey key(kOrigin); // Add registration 1. RegistrationData data1; @@ -1216,39 +1238,39 @@ // Write user data associated with the registration1. ASSERT_EQ( ServiceWorkerDatabase::Status::kOk, - database->WriteUserData(data1.registration_id, kOrigin, + database->WriteUserData(data1.registration_id, key, CreateUserData(data1.registration_id, {{"key_prefix:key1", "value1"}}))); ASSERT_EQ( ServiceWorkerDatabase::Status::kOk, - database->WriteUserData(data1.registration_id, kOrigin, + database->WriteUserData(data1.registration_id, key, CreateUserData(data1.registration_id, {{"key_prefix:key2", "value2"}}))); ASSERT_EQ( ServiceWorkerDatabase::Status::kOk, - database->WriteUserData(data1.registration_id, kOrigin, + database->WriteUserData(data1.registration_id, key, CreateUserData(data1.registration_id, {{"key_prefix:key3", "value3"}}))); // Write user data associated with the registration2. ASSERT_EQ( ServiceWorkerDatabase::Status::kOk, - database->WriteUserData(data2.registration_id, kOrigin, + database->WriteUserData(data2.registration_id, key, CreateUserData(data2.registration_id, {{"key_prefix:key1", "value1"}}))); ASSERT_EQ( ServiceWorkerDatabase::Status::kOk, - database->WriteUserData(data2.registration_id, kOrigin, + database->WriteUserData(data2.registration_id, key, CreateUserData(data2.registration_id, {{"key_prefix:key2", "value2"}}))); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, kOrigin, + data2.registration_id, key, CreateUserData(data2.registration_id, {{"another_key_prefix:key1", "value1"}}))); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, kOrigin, + data2.registration_id, key, CreateUserData(data2.registration_id, {{"another_key_prefix:key2", "value2"}}))); @@ -1296,7 +1318,7 @@ // Write user data associated with the registration. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data.registration_id, kOrigin, + data.registration_id, StorageKey(kOrigin), CreateUserData(data.registration_id, {{"key_prefix:key1", "value_c1"}, {"key_prefix:key2", "value_c2"}, @@ -1342,7 +1364,7 @@ // Write user data associated with the registration. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data.registration_id, kOrigin, + data.registration_id, StorageKey(kOrigin), CreateUserData(data.registration_id, {{"key_prefix:key1", "value_c1"}, {"key_prefix:key2", "value_c2"}, @@ -1375,6 +1397,7 @@ TEST(ServiceWorkerDatabaseTest, UserData_DeleteUserDataByKeyPrefixes) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const url::Origin kOrigin = url::Origin::Create(GURL("https://example.com")); + StorageKey key(kOrigin); // Add registration 1. RegistrationData data1; @@ -1405,7 +1428,7 @@ // Write user data associated with registration 1. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data1.registration_id, kOrigin, + data1.registration_id, key, CreateUserData(data1.registration_id, {{"key_prefix:key1", "value_a1"}, {"key_prefix:key2", "value_a2"}, @@ -1415,7 +1438,7 @@ // Write user data associated with registration 2. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, kOrigin, + data2.registration_id, key, CreateUserData(data2.registration_id, {{"key_prefix:key1", "value_c1"}, {"key_prefix:key2", "value_c2"}, @@ -1483,6 +1506,7 @@ UserData_DeleteUserDataForAllRegistrationsByKeyPrefix) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const url::Origin kOrigin = url::Origin::Create(GURL("https://example.com")); + StorageKey key(kOrigin); // Add registration 1. RegistrationData data1; @@ -1513,7 +1537,7 @@ // Write user data associated with registration 1. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data1.registration_id, kOrigin, + data1.registration_id, key, CreateUserData(data1.registration_id, {{"key_prefix:key1", "value_a1"}, {"key_prefix:key2", "value_a2"}, @@ -1523,7 +1547,7 @@ // Write user data associated with registration 2. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, kOrigin, + data2.registration_id, key, CreateUserData(data2.registration_id, {{"key_prefix:key1", "value_c1"}, {"key_prefix:key2", "value_c2"}, @@ -1570,6 +1594,7 @@ TEST(ServiceWorkerDatabaseTest, UserData_DataIsolation) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const url::Origin kOrigin = url::Origin::Create(GURL("https://example.com")); + StorageKey key(kOrigin); // Add registration 1. RegistrationData data1; @@ -1602,7 +1627,7 @@ std::vector<std::string> user_data_out; ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data1.registration_id, kOrigin, + data1.registration_id, key, CreateUserData(data1.registration_id, {{"key", "value1"}}))); EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, @@ -1617,7 +1642,7 @@ // the data associated with registration1. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, kOrigin, + data2.registration_id, key, CreateUserData(data2.registration_id, {{"key", "value2"}}))); EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, @@ -1668,6 +1693,7 @@ TEST(ServiceWorkerDatabaseTest, UserData_DeleteRegistration) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const url::Origin kOrigin = url::Origin::Create(GURL("https://example.com")); + StorageKey key(kOrigin); // Add registration 1. RegistrationData data1; @@ -1699,11 +1725,11 @@ std::vector<std::string> user_data_out; ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data1.registration_id, kOrigin, + data1.registration_id, key, CreateUserData(data1.registration_id, {{"key1", "value1"}}))); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data1.registration_id, kOrigin, + data1.registration_id, key, CreateUserData(data1.registration_id, {{"key2", "value2"}}))); ASSERT_EQ( ServiceWorkerDatabase::Status::kOk, @@ -1719,7 +1745,7 @@ // Write user data associated with the registration2. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, kOrigin, + data2.registration_id, key, CreateUserData(data2.registration_id, {{"key3", "value3"}}))); ASSERT_EQ( ServiceWorkerDatabase::Status::kOk, @@ -1730,8 +1756,8 @@ // Delete all data associated with the registration1. This shouldn't delete // the data associated with registration2. ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(data1.registration_id, - kOrigin.GetURL(), &deleted_version)); + database->DeleteRegistration(data1.registration_id, key, + &deleted_version)); EXPECT_EQ( ServiceWorkerDatabase::Status::kErrorNotFound, database->ReadUserData(data1.registration_id, {"key1"}, &user_data_out)); @@ -1748,6 +1774,7 @@ TEST(ServiceWorkerDatabaseTest, UserData_UninitializedDatabase) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); const url::Origin kOrigin = url::Origin::Create(GURL("https://example.com")); + StorageKey key(kOrigin); // Should be failed because the database does not exist. std::vector<std::string> user_data_out; @@ -1756,7 +1783,7 @@ // Should be failed because the associated registration does not exist. EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->WriteUserData(100, kOrigin, + database->WriteUserData(100, key, CreateUserData(100, {{"key", "value"}}))); // Deleting non-existent entry should succeed. @@ -1772,7 +1799,7 @@ EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, database->ReadUserData(100, {"key"}, &user_data_out)); EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->WriteUserData(100, kOrigin, + database->WriteUserData(100, key, CreateUserData(100, {{"key", "value"}}))); // Deleting non-existent entry should succeed. @@ -1783,12 +1810,13 @@ TEST(ServiceWorkerDatabaseTest, UpdateVersionToActive) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); GURL origin("https://example.com"); + StorageKey key(url::Origin::Create(origin)); ServiceWorkerDatabase::DeletedVersion deleted_version; // Should be false because a registration does not exist. EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->UpdateVersionToActive(0, origin)); + database->UpdateVersionToActive(0, key)); // Add a registration. RegistrationData data; @@ -1807,19 +1835,19 @@ RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data.registration_id, origin, &data_out, + database->ReadRegistration(data.registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(data, *data_out); EXPECT_EQ(1u, resources_out.size()); // Activate the registration. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->UpdateVersionToActive(data.registration_id, origin)); + database->UpdateVersionToActive(data.registration_id, key)); // Make sure that the registration is activated. resources_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data.registration_id, origin, &data_out, + database->ReadRegistration(data.registration_id, key, &data_out, &resources_out)); mojom::ServiceWorkerRegistrationDataPtr expected_data = data.Clone(); expected_data->is_active = true; @@ -1828,23 +1856,24 @@ // Delete the registration. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(data.registration_id, origin, + database->DeleteRegistration(data.registration_id, key, &deleted_version)); EXPECT_EQ(data.registration_id, deleted_version.registration_id); // Should be false because the registration is gone. EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->UpdateVersionToActive(data.registration_id, origin)); + database->UpdateVersionToActive(data.registration_id, key)); } TEST(ServiceWorkerDatabaseTest, UpdateLastCheckTime) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); GURL origin("https://example.com"); + StorageKey key(url::Origin::Create(origin)); ServiceWorkerDatabase::DeletedVersion deleted_version; // Should be false because a registration does not exist. EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->UpdateLastCheckTime(0, origin, base::Time::Now())); + database->UpdateLastCheckTime(0, key, base::Time::Now())); // Add a registration. RegistrationData data; @@ -1863,21 +1892,21 @@ RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data.registration_id, origin, &data_out, + database->ReadRegistration(data.registration_id, key, &data_out, &resources_out)); VerifyRegistrationData(data, *data_out); EXPECT_EQ(1u, resources_out.size()); // Update the last check time. base::Time updated_time = base::Time::Now(); - EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->UpdateLastCheckTime(data.registration_id, origin, - updated_time)); + EXPECT_EQ( + ServiceWorkerDatabase::Status::kOk, + database->UpdateLastCheckTime(data.registration_id, key, updated_time)); // Make sure that the registration is updated. resources_out.clear(); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data.registration_id, origin, &data_out, + database->ReadRegistration(data.registration_id, key, &data_out, &resources_out)); mojom::ServiceWorkerRegistrationDataPtr expected_data = data.Clone(); expected_data->last_update_check = updated_time; @@ -1886,13 +1915,13 @@ // Delete the registration. EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteRegistration(data.registration_id, origin, + database->DeleteRegistration(data.registration_id, key, &deleted_version)); EXPECT_EQ(data.registration_id, deleted_version.registration_id); // Should be false because the registration is gone. EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorNotFound, - database->UpdateLastCheckTime(data.registration_id, origin, + database->UpdateLastCheckTime(data.registration_id, key, base::Time::Now())); } @@ -1944,17 +1973,19 @@ EXPECT_EQ(expected, ids_out); } -TEST(ServiceWorkerDatabaseTest, DeleteAllDataForOrigin) { +TEST(ServiceWorkerDatabaseTest, DeleteAllDataForStorageKey) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); ServiceWorkerDatabase::DeletedVersion deleted_version; - // Data associated with |origin1| will be removed. + // Data associated with |key1| will be removed. GURL url1("https://example.com"); GURL url2("https://example.org"); url::Origin origin1 = url::Origin::Create(url1); url::Origin origin2 = url::Origin::Create(url2); + StorageKey key1(origin1); + StorageKey key2(origin2); - // |origin1| has two registrations (registration1 and registration2). + // |key1| has two registrations (registration1 and registration2). RegistrationData data1; data1.registration_id = 10; data1.scope = URL(url1, "/foo"); @@ -1969,11 +2000,11 @@ database->WriteRegistration(data1, resources1, &deleted_version)); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data1.registration_id, origin1, + data1.registration_id, key1, CreateUserData(data1.registration_id, {{"key1", "value1"}}))); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data1.registration_id, origin1, + data1.registration_id, key1, CreateUserData(data1.registration_id, {{"key2", "value2"}}))); RegistrationData data2; @@ -1990,14 +2021,14 @@ database->WriteRegistration(data2, resources2, &deleted_version)); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, origin1, + data2.registration_id, key1, CreateUserData(data2.registration_id, {{"key3", "value3"}}))); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data2.registration_id, origin1, + data2.registration_id, key1, CreateUserData(data2.registration_id, {{"key4", "value4"}}))); - // |origin2| has one registration (registration3). + // |key2| has one registration (registration3). RegistrationData data3; data3.registration_id = 12; data3.scope = URL(url2, "/hoge"); @@ -2012,52 +2043,52 @@ database->WriteRegistration(data3, resources3, &deleted_version)); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data3.registration_id, origin2, + data3.registration_id, key2, CreateUserData(data3.registration_id, {{"key5", "value5"}}))); ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteUserData( - data3.registration_id, origin2, + data3.registration_id, key2, CreateUserData(data3.registration_id, {{"key6", "value6"}}))); - std::set<GURL> origins_to_delete; + std::set<StorageKey> keys_to_delete; std::vector<int64_t> newly_purgeable_resources; - origins_to_delete.insert(url1); + keys_to_delete.insert(key1); EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->DeleteAllDataForOrigins(origins_to_delete, - &newly_purgeable_resources)); + database->DeleteAllDataForStorageKeys(keys_to_delete, + &newly_purgeable_resources)); - // |origin1| should be removed from the unique origin list. - std::set<url::Origin> unique_origins; + // |key1| should be removed from the unique origin list. + std::set<StorageKey> unique_keys; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->GetOriginsWithRegistrations(&unique_origins)); - EXPECT_EQ(1u, unique_origins.size()); - EXPECT_TRUE(base::Contains(unique_origins, origin2)); + database->GetStorageKeysWithRegistrations(&unique_keys)); + EXPECT_EQ(1u, unique_keys.size()); + EXPECT_TRUE(base::Contains(unique_keys, key2)); - // The registrations for |origin1| should be removed. + // The registrations for |key1| should be removed. std::vector<mojom::ServiceWorkerRegistrationDataPtr> registrations; EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, - database->GetRegistrationsForOrigin(origin1, ®istrations, nullptr)); + database->GetRegistrationsForStorageKey(key1, ®istrations, nullptr)); EXPECT_TRUE(registrations.empty()); - GURL origin_out; + StorageKey key_out; EXPECT_EQ( ServiceWorkerDatabase::Status::kErrorNotFound, - database->ReadRegistrationOrigin(data1.registration_id, &origin_out)); + database->ReadRegistrationStorageKey(data1.registration_id, &key_out)); - // The registration for |origin2| should not be removed. + // The registration for |key2| should not be removed. RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, - database->ReadRegistration(data3.registration_id, url2, &data_out, + database->ReadRegistration(data3.registration_id, key2, &data_out, &resources_out)); VerifyRegistrationData(data3, *data_out); VerifyResourceRecords(resources3, resources_out); EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, - database->ReadRegistrationOrigin(data3.registration_id, &origin_out)); - EXPECT_EQ(url2, origin_out); + database->ReadRegistrationStorageKey(data3.registration_id, &key_out)); + EXPECT_EQ(key2, key_out); - // The resources associated with |origin1| should be purgeable. + // The resources associated with |key1| should be purgeable. std::vector<int64_t> purgeable_ids_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, database->GetPurgeableResourceIds(&purgeable_ids_out)); @@ -2067,7 +2098,7 @@ EXPECT_TRUE(base::Contains(purgeable_ids_out, 3)); EXPECT_TRUE(base::Contains(purgeable_ids_out, 4)); - // The user data associated with |origin1| should be removed. + // The user data associated with |key1| should be removed. std::vector<std::string> user_data_out; EXPECT_EQ( ServiceWorkerDatabase::Status::kErrorNotFound, @@ -2082,7 +2113,7 @@ ServiceWorkerDatabase::Status::kErrorNotFound, database->ReadUserData(data2.registration_id, {"key4"}, &user_data_out)); - // The user data associated with |origin2| should not be removed. + // The user data associated with |key2| should not be removed. EXPECT_EQ( ServiceWorkerDatabase::Status::kOk, database->ReadUserData(data3.registration_id, {"key5"}, &user_data_out)); @@ -2133,19 +2164,21 @@ RegistrationDataPtr data_out; std::vector<ResourceRecordPtr> resources_out; EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorCorrupted, - database->ReadRegistration(data.registration_id, origin, &data_out, - &resources_out)); + database->ReadRegistration(data.registration_id, + StorageKey(url::Origin::Create(origin)), + &data_out, &resources_out)); EXPECT_TRUE(resources_out.empty()); } -// Tests that GetRegistrationsForOrigin() detects corruption without crashing. -// It must delete the database after freeing the iterator it uses to read all -// registrations. Regression test for https://crbug.com/909024. -TEST(ServiceWorkerDatabaseTest, Corruption_GetRegistrationsForOrigin) { +// Tests that GetRegistrationsForStorageKey() detects corruption without +// crashing. It must delete the database after freeing the iterator it uses to +// read all registrations. Regression test for https://crbug.com/909024. +TEST(ServiceWorkerDatabaseTest, Corruption_GetRegistrationsForStorageKey) { std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); ServiceWorkerDatabase::DeletedVersion deleted_version; std::vector<ResourceRecordPtr> resources; GURL origin("https://example.com"); + StorageKey key(url::Origin::Create(origin)); // Write a normal registration. RegistrationData data1; @@ -2172,14 +2205,14 @@ ASSERT_EQ(ServiceWorkerDatabase::Status::kOk, database->WriteRegistration(data2, resources, &deleted_version)); - // Call GetRegistrationsForOrigin(). It should detect corruption, and not + // Call GetRegistrationsForStorageKey(). It should detect corruption, and not // crash. base::HistogramTester histogram_tester; std::vector<mojom::ServiceWorkerRegistrationDataPtr> registrations; std::vector<std::vector<ResourceRecordPtr>> resources_list; EXPECT_EQ(ServiceWorkerDatabase::Status::kErrorCorrupted, - database->GetRegistrationsForOrigin( - url::Origin::Create(origin), ®istrations, &resources_list)); + database->GetRegistrationsForStorageKey(key, ®istrations, + &resources_list)); EXPECT_TRUE(registrations.empty()); EXPECT_TRUE(resources_list.empty()); @@ -2266,10 +2299,10 @@ // Restore. std::vector<mojom::ServiceWorkerRegistrationDataPtr> registrations; std::vector<std::vector<ResourceRecordPtr>> resources_list; - EXPECT_EQ( - ServiceWorkerDatabase::Status::kOk, - database->GetRegistrationsForOrigin(url::Origin::Create(origin), - ®istrations, &resources_list)); + EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, + database->GetRegistrationsForStorageKey( + StorageKey(url::Origin::Create(origin)), ®istrations, + &resources_list)); // The data must not have been altered. VerifyRegistrationData(data, *registrations[0]); @@ -2336,4 +2369,52 @@ registration->cross_origin_embedder_policy.value); } +// As part of crbug.com/1199077 ServiceWorkerDataBase was refactored to use +// StorageKey instead of url::Origin/GURL. The refactor is/should be a no-op but +// this test exists to confirms that a DB created with the Origin/GURL impl can +// still be correctly read by the StorageKey impl. +TEST(ServiceWorkerDatabaseTest, StorageKeyImplCanReadPreviousOriginImplDB) { + base::FilePath root_path; + base::PathService::Get(base::DIR_SOURCE_ROOT, &root_path); + base::FilePath database_dir = root_path.AppendASCII( + "components/test/data/service_worker/created_by_origin_impl/Database/"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + + ASSERT_TRUE(base::CopyDirectory(database_dir, temp_dir.GetPath(), + /*recursive=*/true)); + + base::FilePath temp_database_dir = temp_dir.GetPath(); + temp_database_dir = temp_database_dir.AppendASCII("Database"); + + std::unique_ptr<ServiceWorkerDatabase> database( + CreateDatabase(temp_database_dir)); + + int64_t next_registration_id; + int64_t next_version_id; + int64_t next_resource_id; + // Make sure to read in the IDs first, otherwise the + // GetRegistrationsForStorageKey will return as corrupted. + EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, + database->GetNextAvailableIds(&next_registration_id, + &next_version_id, &next_resource_id)); + EXPECT_EQ(next_registration_id, 1); + EXPECT_EQ(next_version_id, 1); + EXPECT_EQ(next_resource_id, 1); + + // https://googlechrome.github.io/samples/service-worker/basic/ provided the + // service worker for this test. + StorageKey key(url::Origin::Create(GURL("https://googlechrome.github.io/"))); + + std::vector<mojom::ServiceWorkerRegistrationDataPtr> registrations; + std::vector<std::vector<ResourceRecordPtr>> resources_list; + EXPECT_EQ(ServiceWorkerDatabase::Status::kOk, + database->GetRegistrationsForStorageKey(key, ®istrations, + &resources_list)); + + EXPECT_FALSE(registrations.empty()); + EXPECT_FALSE(resources_list.empty()); +} + } // namespace storage
diff --git a/components/services/storage/service_worker/service_worker_disk_cache.cc b/components/services/storage/service_worker/service_worker_disk_cache.cc index cbe9089..c8491a86 100644 --- a/components/services/storage/service_worker/service_worker_disk_cache.cc +++ b/components/services/storage/service_worker/service_worker_disk_cache.cc
@@ -11,10 +11,10 @@ #include "base/callback.h" #include "base/callback_helpers.h" #include "base/check.h" +#include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "net/base/cache_type.h" #include "net/base/completion_once_callback.h"
diff --git a/components/services/storage/service_worker/service_worker_storage.cc b/components/services/storage/service_worker/service_worker_storage.cc index ce3b147..a859dc56 100644 --- a/components/services/storage/service_worker/service_worker_storage.cc +++ b/components/services/storage/service_worker/service_worker_storage.cc
@@ -6,21 +6,23 @@ #include <stddef.h> +#include <algorithm> #include <memory> #include <utility> #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/files/file_util.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_functions.h" #include "base/run_loop.h" #include "base/sequenced_task_runner.h" -#include "base/stl_util.h" #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "base/task_runner_util.h" #include "base/trace_event/trace_event.h" #include "components/services/storage/public/cpp/constants.h" +#include "components/services/storage/public/cpp/storage_key.h" #include "components/services/storage/service_worker/service_worker_disk_cache.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "net/base/completion_once_callback.h" @@ -277,8 +279,8 @@ base::PostTaskAndReplyWithResult( database_task_runner_.get(), FROM_HERE, - base::BindOnce(&ServiceWorkerDatabase::GetRegistrationsForOrigin, - base::Unretained(database_.get()), origin, + base::BindOnce(&ServiceWorkerDatabase::GetRegistrationsForStorageKey, + base::Unretained(database_.get()), StorageKey(origin), registrations_ptr, resource_lists_ptr), base::BindOnce(&ServiceWorkerStorage::DidGetRegistrationsForOrigin, weak_factory_.GetWeakPtr(), std::move(callback), @@ -408,7 +410,7 @@ database_task_runner_.get(), FROM_HERE, base::BindOnce(&ServiceWorkerDatabase::UpdateVersionToActive, base::Unretained(database_.get()), registration_id, - origin), + StorageKey(url::Origin::Create(origin))), std::move(callback)); } @@ -436,7 +438,8 @@ base::PostTaskAndReplyWithResult( database_task_runner_.get(), FROM_HERE, base::BindOnce(&ServiceWorkerDatabase::UpdateLastCheckTime, - base::Unretained(database_.get()), registration_id, origin, + base::Unretained(database_.get()), registration_id, + StorageKey(url::Origin::Create(origin)), last_update_check_time), std::move(callback)); } @@ -465,8 +468,8 @@ base::PostTaskAndReplyWithResult( database_task_runner_.get(), FROM_HERE, base::BindOnce(&ServiceWorkerDatabase::UpdateNavigationPreloadEnabled, - base::Unretained(database_.get()), registration_id, origin, - enable), + base::Unretained(database_.get()), registration_id, + StorageKey(url::Origin::Create(origin)), enable), std::move(callback)); } @@ -494,8 +497,8 @@ base::PostTaskAndReplyWithResult( database_task_runner_.get(), FROM_HERE, base::BindOnce(&ServiceWorkerDatabase::UpdateNavigationPreloadHeader, - base::Unretained(database_.get()), registration_id, origin, - value), + base::Unretained(database_.get()), registration_id, + StorageKey(url::Origin::Create(origin)), value), std::move(callback)); } @@ -741,8 +744,8 @@ base::PostTaskAndReplyWithResult( database_task_runner_.get(), FROM_HERE, base::BindOnce(&ServiceWorkerDatabase::WriteUserData, - base::Unretained(database_.get()), registration_id, origin, - std::move(user_data)), + base::Unretained(database_.get()), registration_id, + StorageKey(origin), std::move(user_data)), std::move(callback)); } @@ -1593,7 +1596,13 @@ return; } - status = database->GetOriginsWithRegistrations(&data->origins); + std::set<StorageKey> keys; + status = database->GetStorageKeysWithRegistrations(&keys); + // TODO(crbug.com/1199077) Remove adaptor once upstream code uses StorageKey. + std::transform(keys.begin(), keys.end(), + std::inserter(data->origins, data->origins.begin()), + [](const StorageKey& key) { return key.origin(); }); + if (status != ServiceWorkerDatabase::Status::kOk) { original_task_runner->PostTask( FROM_HERE, @@ -1613,9 +1622,11 @@ DeleteRegistrationInDBCallback callback) { DCHECK(database); + const StorageKey key(url::Origin::Create(origin)); + ServiceWorkerDatabase::DeletedVersion deleted_version; ServiceWorkerDatabase::Status status = - database->DeleteRegistration(registration_id, origin, &deleted_version); + database->DeleteRegistration(registration_id, key, &deleted_version); if (status != ServiceWorkerDatabase::Status::kOk) { original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), OriginState::kKeep, @@ -1626,8 +1637,8 @@ // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the // unique origin list. RegistrationList registrations; - status = database->GetRegistrationsForOrigin(url::Origin::Create(origin), - ®istrations, nullptr); + status = + database->GetRegistrationsForStorageKey(key, ®istrations, nullptr); if (status != ServiceWorkerDatabase::Status::kOk) { original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), OriginState::kKeep, @@ -1664,10 +1675,11 @@ scoped_refptr<base::SequencedTaskRunner> original_task_runner, const GURL& client_url, FindInDBCallback callback) { - GURL origin = client_url.GetOrigin(); + StorageKey key(url::Origin::Create(client_url.GetOrigin())); RegistrationList registration_data_list; - ServiceWorkerDatabase::Status status = database->GetRegistrationsForOrigin( - url::Origin::Create(origin), ®istration_data_list, nullptr); + ServiceWorkerDatabase::Status status = + database->GetRegistrationsForStorageKey(key, ®istration_data_list, + nullptr); if (status != ServiceWorkerDatabase::Status::kOk) { original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -1687,7 +1699,7 @@ if (matcher.MatchLongest(registration_data->scope)) match = registration_data->registration_id; if (match != blink::mojom::kInvalidServiceWorkerRegistrationId) - status = database->ReadRegistration(match, origin, &data, resources.get()); + status = database->ReadRegistration(match, key, &data, resources.get()); original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), std::move(data), @@ -1700,10 +1712,11 @@ scoped_refptr<base::SequencedTaskRunner> original_task_runner, const GURL& scope, FindInDBCallback callback) { - GURL origin = scope.GetOrigin(); + StorageKey key(url::Origin::Create(scope.GetOrigin())); RegistrationList registration_data_list; - ServiceWorkerDatabase::Status status = database->GetRegistrationsForOrigin( - url::Origin::Create(origin), ®istration_data_list, nullptr); + ServiceWorkerDatabase::Status status = + database->GetRegistrationsForStorageKey(key, ®istration_data_list, + nullptr); if (status != ServiceWorkerDatabase::Status::kOk) { original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -1719,8 +1732,8 @@ for (const auto& registration_data : registration_data_list) { if (scope != registration_data->scope) continue; - status = database->ReadRegistration(registration_data->registration_id, - origin, &data, resources.get()); + status = database->ReadRegistration(registration_data->registration_id, key, + &data, resources.get()); break; // We're done looping. } @@ -1739,7 +1752,7 @@ mojom::ServiceWorkerRegistrationDataPtr data; auto resources = std::make_unique<ResourceList>(); ServiceWorkerDatabase::Status status = database->ReadRegistration( - registration_id, origin.GetURL(), &data, resources.get()); + registration_id, StorageKey(origin), &data, resources.get()); original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), std::move(data), std::move(resources), status)); @@ -1751,9 +1764,9 @@ scoped_refptr<base::SequencedTaskRunner> original_task_runner, int64_t registration_id, FindInDBCallback callback) { - GURL origin; + StorageKey key; ServiceWorkerDatabase::Status status = - database->ReadRegistrationOrigin(registration_id, &origin); + database->ReadRegistrationStorageKey(registration_id, &key); if (status != ServiceWorkerDatabase::Status::kOk) { original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -1761,8 +1774,8 @@ /*resources=*/nullptr, status)); return; } - FindForIdInDB(database, original_task_runner, registration_id, - url::Origin::Create(origin), std::move(callback)); + FindForIdInDB(database, original_task_runner, registration_id, key.origin(), + std::move(callback)); } // static @@ -1773,7 +1786,7 @@ GetUsageForOriginCallback callback) { int64_t usage = 0; ServiceWorkerDatabase::Status status = - database->GetUsageForOrigin(origin, usage); + database->GetUsageForStorageKey(StorageKey(origin), usage); original_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), status, usage)); } @@ -1851,7 +1864,13 @@ DCHECK(database); std::vector<int64_t> newly_purgeable_resources; - database->DeleteAllDataForOrigins(origins, &newly_purgeable_resources); + // TODO(crbug.com/1199077) Remove adaptor once upstream code uses StorageKey. + std::set<StorageKey> keys; + std::transform(origins.begin(), origins.end(), + std::inserter(keys, keys.begin()), [](const GURL& origin) { + return StorageKey(url::Origin::Create(origin)); + }); + database->DeleteAllDataForStorageKeys(keys, &newly_purgeable_resources); } void ServiceWorkerStorage::PerformStorageCleanupInDB(
diff --git a/components/subresource_filter/content/browser/BUILD.gn b/components/subresource_filter/content/browser/BUILD.gn index f37ece8..5a3f31e 100644 --- a/components/subresource_filter/content/browser/BUILD.gn +++ b/components/subresource_filter/content/browser/BUILD.gn
@@ -31,7 +31,6 @@ "ruleset_version.h", "subframe_navigation_filtering_throttle.cc", "subframe_navigation_filtering_throttle.h", - "subresource_filter_client.h", "subresource_filter_content_settings_manager.cc", "subresource_filter_content_settings_manager.h", "subresource_filter_observer.h", @@ -110,8 +109,8 @@ "subresource_filter_test_harness.h", "test_ruleset_publisher.cc", "test_ruleset_publisher.h", - "test_subresource_filter_client.cc", - "test_subresource_filter_client.h", + "throttle_manager_test_support.cc", + "throttle_manager_test_support.h", ] deps = [ ":browser", @@ -165,6 +164,7 @@ ":browser", ":test_support", "//base/test:test_support", + "//components/content_settings/browser", "//components/content_settings/core/browser", "//components/content_settings/core/common", "//components/infobars/content",
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc index 2baad959..d39a88a 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -19,7 +19,6 @@ #include "components/subresource_filter/content/browser/async_document_subresource_filter.h" #include "components/subresource_filter/content/browser/page_load_statistics.h" #include "components/subresource_filter/content/browser/profile_interaction_manager.h" -#include "components/subresource_filter/content/browser/subresource_filter_client.h" #include "components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.h" #include "components/subresource_filter/content/mojom/subresource_filter_agent.mojom.h" #include "components/subresource_filter/core/browser/subresource_filter_constants.h" @@ -89,7 +88,6 @@ // static void ContentSubresourceFilterThrottleManager::CreateForWebContents( content::WebContents* web_contents, - std::unique_ptr<SubresourceFilterClient> client, SubresourceFilterProfileContext* profile_context, infobars::ContentInfoBarManager* infobar_manager, scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> database_manager, @@ -103,8 +101,8 @@ web_contents->SetUserData( kContentSubresourceFilterThrottleManagerWebContentsUserDataKey, std::make_unique<ContentSubresourceFilterThrottleManager>( - std::move(client), profile_context, infobar_manager, database_manager, - dealer_handle, web_contents)); + profile_context, infobar_manager, database_manager, dealer_handle, + web_contents)); } // static @@ -118,7 +116,6 @@ ContentSubresourceFilterThrottleManager:: ContentSubresourceFilterThrottleManager( - std::unique_ptr<SubresourceFilterClient> client, SubresourceFilterProfileContext* profile_context, infobars::ContentInfoBarManager* infobar_manager, scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> @@ -128,7 +125,6 @@ : content::WebContentsObserver(web_contents), receiver_(web_contents, this), dealer_handle_(dealer_handle), - client_(std::move(client)), database_manager_(std::move(database_manager)), profile_interaction_manager_( std::make_unique<subresource_filter::ProfileInteractionManager>( @@ -622,7 +618,7 @@ return; } - profile_interaction_manager_->MaybeShowNotification(client_.get()); + profile_interaction_manager_->MaybeShowNotification(); current_committed_load_has_notified_disallowed_load_ = true; }
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h index 849adae1..ccf1d3d 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h
@@ -45,7 +45,6 @@ class PageLoadStatistics; class ProfileInteractionManager; class SubresourceFilterProfileContext; -class SubresourceFilterClient; // This enum backs a histogram. Make sure new elements are only added to the // end. Keep histograms.xml up to date with any changes. @@ -81,10 +80,7 @@ // RenderFrameHosts, along with their associated DocumentSubresourceFilters. // // The class is designed to be attached to a WebContents instance by an embedder -// via CreateForWebContents(), with the embedder passing a -// SubresourceFilterClient instance customized for that embedder. The client -// will be notified of the first disallowed subresource load for a top level -// navgation, and has veto power for frame activation. +// via CreateForWebContents(). class ContentSubresourceFilterThrottleManager : public base::SupportsUserData::Data, public content::WebContentsObserver, @@ -100,7 +96,6 @@ // not enabled. static void CreateForWebContents( content::WebContents* web_contents, - std::unique_ptr<SubresourceFilterClient> client, SubresourceFilterProfileContext* profile_context, infobars::ContentInfoBarManager* infobar_manager, scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> @@ -111,7 +106,6 @@ content::WebContents* web_contents); ContentSubresourceFilterThrottleManager( - std::unique_ptr<SubresourceFilterClient> client, SubresourceFilterProfileContext* profile_context, infobars::ContentInfoBarManager* infobar_manager, scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> @@ -135,8 +129,6 @@ PageLoadStatistics* page_load_statistics() const { return statistics_.get(); } - SubresourceFilterClient* client() { return client_.get(); } - VerifiedRuleset::Handle* ruleset_handle_for_testing() { return ruleset_handle_.get(); } @@ -152,7 +144,7 @@ base::Optional<LoadPolicy> LoadPolicyForLastCommittedNavigation( content::RenderFrameHost* frame_host) const; - // Notifies the client that the user has requested a reload of a page with + // Called when the user has requested a reload of a page with // blocked ads (e.g., via an infobar). void OnReloadRequested(); @@ -230,8 +222,8 @@ const base::Optional<subresource_filter::mojom::ActivationState> GetFrameActivationState(content::RenderFrameHost* frame_host); - // Calls ShowNotification on |client_| at most once per committed, - // non-same-page navigation in the main frame. + // Calls MaybeShowNotification on |profile_interaction_manager_| at most once + // per committed, non-same-page navigation in the main frame. void MaybeShowNotification(); VerifiedRuleset::Handle* EnsureRulesetHandle(); @@ -334,7 +326,6 @@ // This member outlives this class. VerifiedRulesetDealer::Handle* dealer_handle_; - std::unique_ptr<SubresourceFilterClient> client_; scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> database_manager_; std::unique_ptr<ProfileInteractionManager> profile_interaction_manager_;
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc index 2aafd14..704e18d 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
@@ -21,6 +21,8 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "build/build_config.h" +#include "components/content_settings/browser/page_specific_content_settings.h" +#include "components/content_settings/core/common/content_settings_types.h" #include "components/infobars/content/content_infobar_manager.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "components/infobars/core/infobar.h" @@ -28,7 +30,7 @@ #include "components/subresource_filter/content/browser/fake_safe_browsing_database_manager.h" #include "components/subresource_filter/content/browser/subframe_navigation_test_utils.h" #include "components/subresource_filter/content/browser/subresource_filter_observer_manager.h" -#include "components/subresource_filter/content/browser/test_subresource_filter_client.h" +#include "components/subresource_filter/content/browser/throttle_manager_test_support.h" #include "components/subresource_filter/content/mojom/subresource_filter_agent.mojom.h" #include "components/subresource_filter/core/browser/subresource_filter_features.h" #include "components/subresource_filter/core/common/common_features.h" @@ -202,19 +204,18 @@ /*expected_checksum=*/0, base::DoNothing()); - auto subresource_filter_client = - std::make_unique<TestSubresourceFilterClient>(web_contents); - client_ = subresource_filter_client.get(); + throttle_manager_test_support_ = + std::make_unique<ThrottleManagerTestSupport>(web_contents); // Turn off smart UI to make it easier to reason about expectations on // ShowNotification() being invoked. - client_->SetShouldUseSmartUI(false); + throttle_manager_test_support_->SetShouldUseSmartUI(false); infobar_manager_ = std::make_unique<infobars::ContentInfoBarManager>(web_contents); throttle_manager_ = std::make_unique<ContentSubresourceFilterThrottleManager>( - std::move(subresource_filter_client), client_->profile_context(), + throttle_manager_test_support_->profile_context(), infobar_manager_.get(), /*database_manager=*/nullptr, dealer_handle_.get(), web_contents); @@ -222,8 +223,8 @@ } void TearDown() override { - client_ = nullptr; throttle_manager_.reset(); + throttle_manager_test_support_.reset(); dealer_handle_.reset(); base::RunLoop().RunUntilIdle(); content::RenderViewHostTestHarness::TearDown(); @@ -277,8 +278,26 @@ return throttle_manager_->ruleset_handle_for_testing(); } - int disallowed_notification_count() const { - return client_->disallowed_notification_count(); + bool ads_blocked_in_content_settings() { + auto* content_settings = + content_settings::PageSpecificContentSettings::GetForFrame( + content::RenderViewHostTestHarness::web_contents()->GetMainFrame()); + + return content_settings->IsContentBlocked(ContentSettingsType::ADS); + } + + bool presenting_ads_blocked_infobar() const { + if (infobar_manager_->infobar_count() == 0) + return false; + + // No infobars other than the ads blocked infobar should be displayed in the + // context of these tests. + EXPECT_EQ(infobar_manager_->infobar_count(), 1u); + auto* infobar = infobar_manager_->infobar_at(0); + EXPECT_EQ(infobar->delegate()->GetIdentifier(), + infobars::InfoBarDelegate::ADS_BLOCKED_INFOBAR_DELEGATE_ANDROID); + + return true; } protected: @@ -351,7 +370,7 @@ private: testing::TestRulesetCreator test_ruleset_creator_; testing::TestRulesetPair test_ruleset_pair_; - TestSubresourceFilterClient* client_; + std::unique_ptr<ThrottleManagerTestSupport> throttle_manager_test_support_; std::unique_ptr<infobars::ContentInfoBarManager> infobar_manager_; std::unique_ptr<VerifiedRulesetDealer::Handle> dealer_handle_; @@ -386,7 +405,10 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, NoPageActivation) { @@ -404,7 +426,10 @@ GURL("https://www.example.com/disallowed.html"), main_rfh()); EXPECT_EQ(content::NavigationThrottle::PROCEED, SimulateCommitAndGetResult(navigation_simulator())); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -426,7 +451,10 @@ ExpectActivationSignalForFrame(child, true /* expect_activation */, true /* is_ad_subframe */); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -445,7 +473,10 @@ SimulateRedirectAndGetResult( navigation_simulator(), GURL("https://www.example.com/disallowed.html"))); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -469,7 +500,10 @@ navigation_simulator()->GetFinalRenderFrameHost(); ExpectActivationSignalForFrame(child, true /* expect_activation */); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } // This should fail if the throttle manager notifies the delegate twice of a @@ -486,14 +520,20 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif CreateSubframeWithTestNavigation( GURL("https://www.example.com/2/disallowed.html"), main_rfh()); EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -508,24 +548,35 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif // Commit another navigation that triggers page level activation. NavigateAndCommitMainFrame(GURL(kTestURLWithActivation2)); ExpectActivationSignalForFrame(main_rfh(), true /* expect_activation */); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif + CreateSubframeWithTestNavigation( GURL("https://www.example.com/2/disallowed.html"), main_rfh()); EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(2, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } -// Test that the disallow load notification will not be repeated for the first -// disallowed load that follows a same-document navigation. +// Test that once presented, the ads blocked infobar will remain present after a +// same-document navigation. TEST_P(ContentSubresourceFilterThrottleManagerTest, - ActivateMainFrameDoNotNotifyAfterSameDocumentNav) { + InfoBarStaysPresentAfterSameDocumentNav) { // Commit a navigation that triggers page level activation. NavigateAndCommitMainFrame(GURL(kTestURLWithActivation)); ExpectActivationSignalForFrame(main_rfh(), true /* expect_activation */); @@ -536,7 +587,10 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif // Commit another navigation that triggers page level activation. GURL url2 = GURL(base::StringPrintf("%s#ref", kTestURLWithActivation)); @@ -544,12 +598,20 @@ navigation_simulator()->CommitSameDocument(); ExpectActivationSignalForFrame(main_rfh(), false /* expect_activation */); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif + CreateSubframeWithTestNavigation( GURL("https://www.example.com/2/disallowed.html"), main_rfh()); EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -572,7 +634,10 @@ navigation_simulator()->GetFinalRenderFrameHost(); ExpectActivationSignalForFrame(child, false /* expect_activation */); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } // Once there are no activated frames, the manager drops its ruleset handle. If @@ -586,7 +651,10 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif // Simulate a renderer crash which should delete the frame. EXPECT_TRUE(ManagerHasRulesetHandle()); @@ -597,12 +665,20 @@ NavigateAndCommitMainFrame(GURL(kTestURLWithActivation)); ExpectActivationSignalForFrame(main_rfh(), true /* expect_activation */); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif + CreateSubframeWithTestNavigation( GURL("https://www.example.com/disallowed.html"), main_rfh()); EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(2, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -633,7 +709,10 @@ navigation_simulator()->GetFinalRenderFrameHost(); ExpectActivationSignalForFrame(child, false /* expect_activation */); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -656,7 +735,10 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -683,7 +765,10 @@ navigation_simulator()->GetFinalRenderFrameHost(); ExpectActivationSignalForFrame(child, false /* expect_activation */); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } // Ensure activation propagates into great-grandchild frames, including cross @@ -722,7 +807,10 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } // Ensure activation propagates through allowlisted documents. @@ -758,7 +846,10 @@ navigation_simulator()->GetFinalRenderFrameHost(); ExpectActivationSignalForFrame(subframe2, true /* expect_activation */); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif // An identical series of events that don't match allowlist rules cause // filtering. @@ -777,7 +868,10 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } // Same-site navigations within a single RFH do not persist activation. @@ -806,7 +900,10 @@ navigation_simulator()->GetFinalRenderFrameHost(); ExpectActivationSignalForFrame(child, false /* expect_activation */); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } TEST_F(ContentSubresourceFilterThrottleManagerTest, CreateForWebContents) { @@ -816,9 +913,9 @@ web_contents.get()), nullptr); - auto client = - std::make_unique<TestSubresourceFilterClient>(web_contents.get()); - SubresourceFilterProfileContext* profile_context = client->profile_context(); + ThrottleManagerTestSupport throttle_manager_test_support(web_contents.get()); + SubresourceFilterProfileContext* profile_context = + throttle_manager_test_support.profile_context(); auto infobar_manager = std::make_unique<infobars::ContentInfoBarManager>(web_contents.get()); @@ -829,8 +926,8 @@ // CreateForWebContents() should not do anything if the subresource filter // feature is not enabled. ContentSubresourceFilterThrottleManager::CreateForWebContents( - web_contents.get(), std::move(client), profile_context, - infobar_manager.get(), /*database_manager=*/nullptr, dealer_handle()); + web_contents.get(), profile_context, infobar_manager.get(), + /*database_manager=*/nullptr, dealer_handle()); EXPECT_EQ(ContentSubresourceFilterThrottleManager::FromWebContents( web_contents.get()), nullptr); @@ -838,22 +935,18 @@ // If the subresource filter feature is enabled (as it is by default), // CreateForWebContents() should create and attach an instance. - client = std::make_unique<TestSubresourceFilterClient>(web_contents.get()); - profile_context = client->profile_context(); ContentSubresourceFilterThrottleManager::CreateForWebContents( - web_contents.get(), std::move(client), profile_context, - infobar_manager.get(), /*database_manager=*/nullptr, dealer_handle()); + web_contents.get(), profile_context, infobar_manager.get(), + /*database_manager=*/nullptr, dealer_handle()); auto* throttle_manager = ContentSubresourceFilterThrottleManager::FromWebContents( web_contents.get()); EXPECT_NE(throttle_manager, nullptr); // A second call should not attach a different instance. - client = std::make_unique<TestSubresourceFilterClient>(web_contents.get()); - profile_context = client->profile_context(); ContentSubresourceFilterThrottleManager::CreateForWebContents( - web_contents.get(), std::move(client), profile_context, - infobar_manager.get(), /*database_manager=*/nullptr, dealer_handle()); + web_contents.get(), profile_context, infobar_manager.get(), + /*database_manager=*/nullptr, dealer_handle()); EXPECT_EQ(ContentSubresourceFilterThrottleManager::FromWebContents( web_contents.get()), throttle_manager); @@ -933,7 +1026,10 @@ EXPECT_EQ(content::NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, SimulateStartAndGetResult(navigation_simulator())); - EXPECT_EQ(1, disallowed_notification_count()); + EXPECT_TRUE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } // If the RenderFrame determines that the frame is an ad due to creation by ad @@ -1102,7 +1198,10 @@ true /* is_ad_subframe */); EXPECT_TRUE(throttle_manager()->IsFrameTaggedAsAd(greatGrandchild)); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -1138,7 +1237,10 @@ false /* is_ad_subframe */); EXPECT_FALSE(throttle_manager()->IsFrameTaggedAsAd(grandchild)); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } TEST_P(ContentSubresourceFilterThrottleManagerTest, @@ -1150,7 +1252,10 @@ // This could happen e.g. for cross-process navigations, which have no // ordering guarantees. throttle_manager()->DidDisallowFirstSubresource(); - EXPECT_EQ(0, disallowed_notification_count()); + EXPECT_FALSE(ads_blocked_in_content_settings()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif } // TODO(csharrison): Make sure the following conditions are exercised in tests:
diff --git a/components/subresource_filter/content/browser/profile_interaction_manager.cc b/components/subresource_filter/content/browser/profile_interaction_manager.cc index b688088..6b8321109 100644 --- a/components/subresource_filter/content/browser/profile_interaction_manager.cc +++ b/components/subresource_filter/content/browser/profile_interaction_manager.cc
@@ -9,7 +9,6 @@ #include "components/content_settings/core/common/content_settings_types.h" #include "components/subresource_filter/content/browser/ads_intervention_manager.h" #include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" -#include "components/subresource_filter/content/browser/subresource_filter_client.h" #include "components/subresource_filter/content/browser/subresource_filter_content_settings_manager.h" #include "components/subresource_filter/content/browser/subresource_filter_profile_context.h" #include "content/public/browser/navigation_controller.h" @@ -129,8 +128,7 @@ return effective_activation_level; } -void ProfileInteractionManager::MaybeShowNotification( - SubresourceFilterClient* client) { +void ProfileInteractionManager::MaybeShowNotification() { const GURL& top_level_url = web_contents()->GetLastCommittedURL(); if (profile_context_->settings_manager()->ShouldShowUIForSite( top_level_url)) { @@ -138,8 +136,6 @@ subresource_filter::AdsBlockedInfobarDelegate::Create(infobar_manager_); #endif - client->OnNotificationShown(); - // TODO(https://crbug.com/1103176): Plumb the actual frame reference here // (it comes from // ContentSubresourceFilterThrottleManager::DidDisallowFirstSubresource,
diff --git a/components/subresource_filter/content/browser/profile_interaction_manager.h b/components/subresource_filter/content/browser/profile_interaction_manager.h index 3724d37..2724fec 100644 --- a/components/subresource_filter/content/browser/profile_interaction_manager.h +++ b/components/subresource_filter/content/browser/profile_interaction_manager.h
@@ -22,7 +22,6 @@ namespace subresource_filter { -class SubresourceFilterClient; class SubresourceFilterProfileContext; // Class that manages interaction between interaction between the @@ -55,9 +54,8 @@ // Invoked when a notification should potentially be shown to the user that // ads are being blocked on this page. Will make the final determination as to - // whether the notification should be shown and call out to |client| to show - // the notification if so. - void MaybeShowNotification(SubresourceFilterClient* client); + // whether the notification should be shown. + void MaybeShowNotification(); // SubresourceFilterSafeBrowsingActivationThrottle::Delegate: mojom::ActivationLevel OnPageActivationComputed(
diff --git a/components/subresource_filter/content/browser/subresource_filter_client.h b/components/subresource_filter/content/browser/subresource_filter_client.h deleted file mode 100644 index ea1f022..0000000 --- a/components/subresource_filter/content/browser/subresource_filter_client.h +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_SUBRESOURCE_FILTER_CLIENT_H_ -#define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_SUBRESOURCE_FILTER_CLIENT_H_ - -#include "base/memory/scoped_refptr.h" - -namespace subresource_filter { - -class SubresourceFilterClient { - public: - virtual ~SubresourceFilterClient() = default; - - // Informs the embedder that UI has been shown indicating that resources are - // being blocked. This method will be called at most once per main-frame - // navigation. - // TODO(crbug.com/1196187): Eliminate tests' use of this method and remove - // SubresourceFilterClient altogether. - virtual void OnNotificationShown() = 0; -}; - -} // namespace subresource_filter - -#endif // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_SUBRESOURCE_FILTER_CLIENT_H_
diff --git a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc index 8fd19f4d..77be7de 100644 --- a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc +++ b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc
@@ -28,7 +28,7 @@ #include "components/subresource_filter/content/browser/subresource_filter_observer_test_utils.h" #include "components/subresource_filter/content/browser/subresource_filter_safe_browsing_client.h" #include "components/subresource_filter/content/browser/subresource_filter_safe_browsing_client_request.h" -#include "components/subresource_filter/content/browser/test_subresource_filter_client.h" +#include "components/subresource_filter/content/browser/throttle_manager_test_support.h" #include "components/subresource_filter/content/browser/verified_ruleset_dealer.h" #include "components/subresource_filter/core/browser/subresource_filter_features.h" #include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h" @@ -164,14 +164,13 @@ base::DoNothing()); auto* contents = RenderViewHostTestHarness::web_contents(); - auto subresource_filter_client = - std::make_unique<TestSubresourceFilterClient>(contents); - client_ = subresource_filter_client.get(); + throttle_manager_test_support_ = + std::make_unique<ThrottleManagerTestSupport>(contents); infobar_manager_ = std::make_unique<infobars::ContentInfoBarManager>(contents); throttle_manager_ = std::make_unique<ContentSubresourceFilterThrottleManager>( - std::move(subresource_filter_client), client_->profile_context(), + throttle_manager_test_support_->profile_context(), infobar_manager_.get(), /*database_manager=*/nullptr, ruleset_dealer_.get(), contents); fake_safe_browsing_database_ = new FakeSafeBrowsingDatabaseManager(); @@ -333,8 +332,6 @@ const base::HistogramTester& tester() const { return tester_; } - TestSubresourceFilterClient* client() { return client_; } - TestSafeBrowsingActivationThrottleDelegate* delegate() { return &delegate_; } base::TestMockTimeTaskRunner* test_io_task_runner() const { return test_io_task_runner_.get(); @@ -344,6 +341,20 @@ return &scoped_configuration_; } + bool presenting_ads_blocked_infobar() const { + if (infobar_manager_->infobar_count() == 0) + return false; + + // No infobars other than the ads blocked infobar should be displayed in the + // context of these tests. + EXPECT_EQ(infobar_manager_->infobar_count(), 1u); + auto* infobar = infobar_manager_->infobar_at(0); + EXPECT_EQ(infobar->delegate()->GetIdentifier(), + infobars::InfoBarDelegate::ADS_BLOCKED_INFOBAR_DELEGATE_ANDROID); + + return true; + } + private: testing::ScopedSubresourceFilterConfigurator scoped_configuration_; scoped_refptr<base::TestMockTimeTaskRunner> test_io_task_runner_; @@ -357,7 +368,7 @@ std::unique_ptr<ContentSubresourceFilterThrottleManager> throttle_manager_; std::unique_ptr<content::NavigationSimulator> navigation_simulator_; - TestSubresourceFilterClient* client_; + std::unique_ptr<ThrottleManagerTestSupport> throttle_manager_test_support_; std::unique_ptr<infobars::ContentInfoBarManager> infobar_manager_; std::unique_ptr<TestSubresourceFilterObserver> observer_; scoped_refptr<FakeSafeBrowsingDatabaseManager> fake_safe_browsing_database_; @@ -567,7 +578,9 @@ content::RenderFrameHost* rfh = SimulateNavigateAndCommit({url}, main_rfh()); EXPECT_FALSE(CreateAndNavigateDisallowedSubframe(rfh)); - EXPECT_EQ(1, client()->disallowed_notification_count()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_F(SubresourceFilterSafeBrowsingActivationThrottleTest, ActivationList) { @@ -735,7 +748,9 @@ // Navigate initially, should be no activation. SimulateNavigateAndCommit({url}, main_rfh()); EXPECT_TRUE(CreateAndNavigateDisallowedSubframe(main_rfh())); - EXPECT_EQ(0, client()->disallowed_notification_count()); +#if defined(OS_ANDROID) + EXPECT_FALSE(presenting_ads_blocked_infobar()); +#endif // Simulate opening devtools and forcing activation. devtools_interaction_tracker->ToggleForceActivation(true); @@ -745,7 +760,9 @@ SimulateNavigateAndCommit({url}, main_rfh()); EXPECT_FALSE(CreateAndNavigateDisallowedSubframe(main_rfh())); - EXPECT_EQ(1, client()->disallowed_notification_count()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif histogram_tester.ExpectBucketCount( "SubresourceFilter.PageLoad.ActivationDecision", @@ -776,7 +793,9 @@ // Resource should be disallowed, since navigation commit had activation. EXPECT_FALSE(CreateAndNavigateDisallowedSubframe(main_rfh())); - EXPECT_EQ(1, client()->disallowed_notification_count()); +#if defined(OS_ANDROID) + EXPECT_TRUE(presenting_ads_blocked_infobar()); +#endif } TEST_P(SubresourceFilterSafeBrowsingActivationThrottleScopeTest,
diff --git a/components/subresource_filter/content/browser/subresource_filter_test_harness.cc b/components/subresource_filter/content/browser/subresource_filter_test_harness.cc index db3e8c5a..ce55742 100644 --- a/components/subresource_filter/content/browser/subresource_filter_test_harness.cc +++ b/components/subresource_filter/content/browser/subresource_filter_test_harness.cc
@@ -89,13 +89,13 @@ VerifiedRulesetDealer::Handle* dealer = ruleset_service_.get()->GetRulesetDealer(); - auto client = std::make_unique<TestSubresourceFilterClient>(web_contents()); - client_ = client.get(); + throttle_manager_test_support_ = + std::make_unique<ThrottleManagerTestSupport>(web_contents()); database_manager_ = base::MakeRefCounted<FakeSafeBrowsingDatabaseManager>(); infobar_manager_ = std::make_unique<infobars::ContentInfoBarManager>(web_contents()); ContentSubresourceFilterThrottleManager::CreateForWebContents( - web_contents(), std::move(client), client_->profile_context(), + web_contents(), throttle_manager_test_support_->profile_context(), infobar_manager_.get(), database_manager_, dealer); // Observe web_contents() to add subresource filter navigation throttles at @@ -164,7 +164,7 @@ SubresourceFilterContentSettingsManager* SubresourceFilterTestHarness::GetSettingsManager() { - return client_->profile_context()->settings_manager(); + return throttle_manager_test_support_->profile_context()->settings_manager(); } void SubresourceFilterTestHarness::SetIsAdSubframe(
diff --git a/components/subresource_filter/content/browser/subresource_filter_test_harness.h b/components/subresource_filter/content/browser/subresource_filter_test_harness.h index 7277e47..6cb77f7f 100644 --- a/components/subresource_filter/content/browser/subresource_filter_test_harness.h +++ b/components/subresource_filter/content/browser/subresource_filter_test_harness.h
@@ -9,7 +9,7 @@ #include "base/files/scoped_temp_dir.h" #include "components/subresource_filter/content/browser/fake_safe_browsing_database_manager.h" -#include "components/subresource_filter/content/browser/test_subresource_filter_client.h" +#include "components/subresource_filter/content/browser/throttle_manager_test_support.h" #include "components/subresource_filter/core/browser/subresource_filter_features.h" #include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h" #include "components/sync_preferences/testing_pref_service_syncable.h" @@ -105,7 +105,7 @@ sync_preferences::TestingPrefServiceSyncable pref_service_; testing::ScopedSubresourceFilterConfigurator scoped_configuration_; scoped_refptr<FakeSafeBrowsingDatabaseManager> database_manager_; - TestSubresourceFilterClient* client_; + std::unique_ptr<ThrottleManagerTestSupport> throttle_manager_test_support_; std::unique_ptr<infobars::ContentInfoBarManager> infobar_manager_; std::unique_ptr<RulesetService> ruleset_service_; };
diff --git a/components/subresource_filter/content/browser/test_subresource_filter_client.h b/components/subresource_filter/content/browser/test_subresource_filter_client.h deleted file mode 100644 index fb529f8..0000000 --- a/components/subresource_filter/content/browser/test_subresource_filter_client.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_TEST_SUBRESOURCE_FILTER_CLIENT_H_ -#define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_TEST_SUBRESOURCE_FILTER_CLIENT_H_ - -#include <memory> - -#include "base/memory/scoped_refptr.h" -#include "components/subresource_filter/content/browser/subresource_filter_client.h" -#include "components/sync_preferences/testing_pref_service_syncable.h" - -class HostContentSettingsMap; - -namespace content { -class WebContents; -} - -namespace subresource_filter { - -class SubresourceFilterProfileContext; - -// An implementation of SubresourceFilterClient suitable for use in unittests. -class TestSubresourceFilterClient : public SubresourceFilterClient { - public: - explicit TestSubresourceFilterClient(content::WebContents* web_contents); - ~TestSubresourceFilterClient() override; - - // SubresourceFilterClient: - void OnNotificationShown() override; - - SubresourceFilterProfileContext* profile_context() { - return profile_context_.get(); - } - - // Turns on/off the smart UI feature (currently enabled in production on - // some platforms only). - void SetShouldUseSmartUI(bool enabled); - - // Returns the number of times that ShowNotification() was invoked. - int disallowed_notification_count() const { - return disallowed_notification_count_; - } - - private: - sync_preferences::TestingPrefServiceSyncable prefs_; - scoped_refptr<HostContentSettingsMap> settings_map_; - std::unique_ptr<SubresourceFilterProfileContext> profile_context_; - - int disallowed_notification_count_ = 0; -}; - -} // namespace subresource_filter - -#endif // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_TEST_SUBRESOURCE_FILTER_CLIENT_H_
diff --git a/components/subresource_filter/content/browser/test_subresource_filter_client.cc b/components/subresource_filter/content/browser/throttle_manager_test_support.cc similarity index 81% rename from components/subresource_filter/content/browser/test_subresource_filter_client.cc rename to components/subresource_filter/content/browser/throttle_manager_test_support.cc index 52ba047..d4ab654 100644 --- a/components/subresource_filter/content/browser/test_subresource_filter_client.cc +++ b/components/subresource_filter/content/browser/throttle_manager_test_support.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/subresource_filter/content/browser/test_subresource_filter_client.h" +#include "components/subresource_filter/content/browser/throttle_manager_test_support.h" #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/browser/test_page_specific_content_settings_delegate.h" @@ -13,7 +13,7 @@ namespace subresource_filter { -TestSubresourceFilterClient::TestSubresourceFilterClient( +ThrottleManagerTestSupport::ThrottleManagerTestSupport( content::WebContents* web_contents) { // Set up the state that's required by ProfileInteractionManager. HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry()); @@ -32,15 +32,11 @@ /*prefs=*/nullptr, settings_map_.get())); } -TestSubresourceFilterClient::~TestSubresourceFilterClient() { +ThrottleManagerTestSupport::~ThrottleManagerTestSupport() { settings_map_->ShutdownOnUIThread(); } -void TestSubresourceFilterClient::OnNotificationShown() { - ++disallowed_notification_count_; -} - -void TestSubresourceFilterClient::SetShouldUseSmartUI(bool enabled) { +void ThrottleManagerTestSupport::SetShouldUseSmartUI(bool enabled) { profile_context_->settings_manager()->set_should_use_smart_ui_for_testing( enabled); }
diff --git a/components/subresource_filter/content/browser/throttle_manager_test_support.h b/components/subresource_filter/content/browser/throttle_manager_test_support.h new file mode 100644 index 0000000..4ee4fd5 --- /dev/null +++ b/components/subresource_filter/content/browser/throttle_manager_test_support.h
@@ -0,0 +1,50 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_THROTTLE_MANAGER_TEST_SUPPORT_H_ +#define COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_THROTTLE_MANAGER_TEST_SUPPORT_H_ + +#include <memory> + +#include "base/memory/scoped_refptr.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" + +class HostContentSettingsMap; + +namespace content { +class WebContents; +} + +namespace subresource_filter { + +class SubresourceFilterProfileContext; + +// Sets up necessary dependencies of ContentSubresourceFilterThrottleManager for +// convenience in unittests. +class ThrottleManagerTestSupport { + public: + explicit ThrottleManagerTestSupport(content::WebContents* web_contents); + ~ThrottleManagerTestSupport(); + + ThrottleManagerTestSupport(const ThrottleManagerTestSupport&) = delete; + ThrottleManagerTestSupport& operator=(const ThrottleManagerTestSupport&) = + delete; + + SubresourceFilterProfileContext* profile_context() { + return profile_context_.get(); + } + + // Turns on/off the smart UI feature (currently enabled in production on + // some platforms only). + void SetShouldUseSmartUI(bool enabled); + + private: + sync_preferences::TestingPrefServiceSyncable prefs_; + scoped_refptr<HostContentSettingsMap> settings_map_; + std::unique_ptr<SubresourceFilterProfileContext> profile_context_; +}; + +} // namespace subresource_filter + +#endif // COMPONENTS_SUBRESOURCE_FILTER_CONTENT_BROWSER_THROTTLE_MANAGER_TEST_SUPPORT_H_
diff --git a/components/sync/protocol/autofill_specifics.proto b/components/sync/protocol/autofill_specifics.proto index 88b4fad..8322326 100644 --- a/components/sync/protocol/autofill_specifics.proto +++ b/components/sync/protocol/autofill_specifics.proto
@@ -150,6 +150,12 @@ // changes in the autofill profile values. optional bool is_client_validity_states_updated = 25; + // The state indicates if the profile qualifies to get merged with a + // profile observed in a form submission. If true, the profile can still be + // updated silently, but it should not be considered for merges that need to + // involve user interactions. + optional bool disallow_settings_visible_updates = 63; + // Deprecated. optional string deprecated_label = 1 [deprecated = true]; optional string phone_fax_whole_number = 14 [deprecated = true];
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h index 2f3d100c..113737a6 100644 --- a/components/sync/protocol/proto_visitors.h +++ b/components/sync/protocol/proto_visitors.h
@@ -232,6 +232,7 @@ VISIT(address_home_language_code); VISIT_REP(phone_home_whole_number); VISIT(validity_state_bitfield); + VISIT(disallow_settings_visible_updates); } VISIT_PROTO_FIELDS(const sync_pb::AutofillSpecifics& proto) {
diff --git a/components/sync/test/engine/fake_cryptographer.cc b/components/sync/test/engine/fake_cryptographer.cc index e86a3b6..5abc4ec 100644 --- a/components/sync/test/engine/fake_cryptographer.cc +++ b/components/sync/test/engine/fake_cryptographer.cc
@@ -4,7 +4,7 @@ #include "components/sync/test/engine/fake_cryptographer.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h"
diff --git a/components/test/data/service_worker/created_by_origin_impl/Database/000003.log b/components/test/data/service_worker/created_by_origin_impl/Database/000003.log new file mode 100644 index 0000000..401a7ae --- /dev/null +++ b/components/test/data/service_worker/created_by_origin_impl/Database/000003.log Binary files differ
diff --git a/components/test/data/service_worker/created_by_origin_impl/Database/CURRENT b/components/test/data/service_worker/created_by_origin_impl/Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/components/test/data/service_worker/created_by_origin_impl/Database/CURRENT
@@ -0,0 +1 @@ +MANIFEST-000001
diff --git a/components/test/data/service_worker/created_by_origin_impl/Database/LOCK b/components/test/data/service_worker/created_by_origin_impl/Database/LOCK new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/components/test/data/service_worker/created_by_origin_impl/Database/LOCK
diff --git a/components/test/data/service_worker/created_by_origin_impl/Database/LOG b/components/test/data/service_worker/created_by_origin_impl/Database/LOG new file mode 100644 index 0000000..70ed59b --- /dev/null +++ b/components/test/data/service_worker/created_by_origin_impl/Database/LOG
@@ -0,0 +1,2 @@ +2021/04/27-23:04:48.101 1918 Creating DB /usr/local/google/home/bingler/.config/chrome-remote-desktop/chrome-config/google-chrome/Default/Service Worker/Database since it was missing. +2021/04/27-23:04:48.154 1918 Reusing MANIFEST /usr/local/google/home/bingler/.config/chrome-remote-desktop/chrome-config/google-chrome/Default/Service Worker/Database/MANIFEST-000001
diff --git a/components/test/data/service_worker/created_by_origin_impl/Database/MANIFEST-000001 b/components/test/data/service_worker/created_by_origin_impl/Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab7 --- /dev/null +++ b/components/test/data/service_worker/created_by_origin_impl/Database/MANIFEST-000001 Binary files differ
diff --git a/components/test/data/web_database/version_95.sql b/components/test/data/web_database/version_95.sql new file mode 100644 index 0000000..73c8bcc --- /dev/null +++ b/components/test/data/web_database/version_95.sql
@@ -0,0 +1,32 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); +INSERT INTO meta VALUES('mmap_status','-1'); +INSERT INTO meta VALUES('version','93'); +INSERT INTO meta VALUES('last_compatible_version','83'); +INSERT INTO meta VALUES('Builtin Keyword Version','117'); +CREATE TABLE token_service (service VARCHAR PRIMARY KEY NOT NULL,encrypted_token BLOB); +CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,created_by_policy INTEGER DEFAULT 0,last_modified INTEGER DEFAULT 0,sync_guid VARCHAR,alternate_urls VARCHAR,image_url VARCHAR,search_url_post_params VARCHAR,suggest_url_post_params VARCHAR,image_url_post_params VARCHAR,new_tab_url VARCHAR,last_visited INTEGER DEFAULT 0, created_from_play_api INTEGER DEFAULT 0); +CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR, date_created INTEGER DEFAULT 0, date_last_used INTEGER DEFAULT 0, count INTEGER DEFAULT 1, PRIMARY KEY (name, value)); +CREATE TABLE credit_cards ( guid VARCHAR PRIMARY KEY, name_on_card VARCHAR, expiration_month INTEGER, expiration_year INTEGER, card_number_encrypted BLOB, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR, nickname VARCHAR); +CREATE TABLE autofill_profiles ( guid VARCHAR PRIMARY KEY, company_name VARCHAR, street_address VARCHAR, dependent_locality VARCHAR, city VARCHAR, state VARCHAR, zipcode VARCHAR, sorting_code VARCHAR, country_code VARCHAR, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', language_code VARCHAR, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, validity_bitfield UNSIGNED NOT NULL DEFAULT 0, is_client_validity_states_updated BOOL NOT NULL DEFAULT FALSE, label VARCHAR); +CREATE TABLE autofill_profile_names ( guid VARCHAR, first_name VARCHAR, middle_name VARCHAR, last_name VARCHAR, full_name VARCHAR, honorific_prefix VARCHAR, first_last_name VARCHAR, conjunction_last_name VARCHAR, second_last_name VARCHAR, honorific_prefix_status INTEGER DEFAULT 0, first_name_status INTEGER DEFAULT 0, middle_name_status INTEGER DEFAULT 0, last_name_status INTEGER DEFAULT 0, first_last_name_status INTEGER DEFAULT 0, conjunction_last_name_status INTEGER DEFAULT 0, second_last_name_status INTEGER DEFAULT 0, full_name_status INTEGER DEFAULT 0, full_name_with_honorific_prefix VARCHAR, full_name_with_honorific_prefix_status INTEGER DEFAULT 0); +INSERT INTO "autofill_profile_names" VALUES('B41FE6E0-B13E-2A2A-BF0B-29FCE2C3ADBD','Jon','','Smith', 'Jon Smith', 'Sir', 'Smith', 'Notsmith', 'Moresmith', 0, 0, 0, 0, 0, 0, 0, 0, 'Sir Jon Smith', 0); +CREATE TABLE autofill_profile_addresses ( guid VARCHAR, street_address VARCHAR, street_name VARCHAR, dependent_street_name VARCHAR, house_number VARCHAR, subpremise VARCHAR, premise_name VARCHAR, street_address_status INTEGER DEFAULT 0, street_name_status INTEGER DEFAULT 0, dependent_street_name_status INTEGER DEFAULT 0, house_number_status INTEGER DEFAULT 0, subpremise_status INTEGER DEFAULT 0, premise_name_status INTEGER DEFAULT 0, dependent_locality VARCHAR, city VARCHAR, state VARCHAR, zip_code VARCHAR, sorting_code VARCHAR, country_code VARCHAR, dependent_locality_status INTEGER DEFAULT 0, city_status INTEGER DEFAULT 0, state_status INTEGER DEFAULT 0, zip_code_status INTEGER DEFAULT 0, sorting_code_status INTEGER DEFAULT 0, country_code_status INTEGER DEFAULT 0, apartment_number VARCHAR, floor VARCHAR, apartment_number_status INTEGER DEFAULT 0, floor_status INTEGER DEFAULT 0); +CREATE TABLE autofill_profile_emails ( guid VARCHAR, email VARCHAR); +CREATE TABLE autofill_profile_phones ( guid VARCHAR, number VARCHAR); +CREATE TABLE autofill_profiles_trash ( guid VARCHAR); +CREATE TABLE masked_credit_cards (id VARCHAR,status VARCHAR,name_on_card VARCHAR,network VARCHAR,last_four VARCHAR,exp_month INTEGER DEFAULT 0,exp_year INTEGER DEFAULT 0, bank_name VARCHAR, nickname VARCHAR, card_issuer INTEGER DEFAULT 0, instrument_id INTEGER DEFAULT 0); +CREATE TABLE unmasked_credit_cards (id VARCHAR,card_number_encrypted VARCHAR,unmask_date INTEGER NOT NULL DEFAULT 0); +CREATE TABLE server_card_metadata (id VARCHAR NOT NULL,use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR); +CREATE TABLE server_addresses (id VARCHAR,company_name VARCHAR,street_address VARCHAR,address_1 VARCHAR,address_2 VARCHAR,address_3 VARCHAR,address_4 VARCHAR,postal_code VARCHAR,sorting_code VARCHAR,country_code VARCHAR,language_code VARCHAR, recipient_name VARCHAR, phone_number VARCHAR); +CREATE TABLE server_address_metadata (id VARCHAR NOT NULL,use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, has_converted BOOL NOT NULL DEFAULT FALSE); +CREATE TABLE autofill_sync_metadata (model_type INTEGER NOT NULL, storage_key VARCHAR NOT NULL, value BLOB, PRIMARY KEY (model_type, storage_key)); +CREATE TABLE autofill_model_type_state (model_type INTEGER NOT NULL PRIMARY KEY, value BLOB); +CREATE TABLE payments_customer_data (customer_id VARCHAR); +CREATE TABLE payments_upi_vpa (vpa VARCHAR); +CREATE TABLE server_card_cloud_token_data ( id VARCHAR, suffix VARCHAR, exp_month INTEGER DEFAULT 0, exp_year INTEGER DEFAULT 0, card_art_url VARCHAR, instrument_token VARCHAR); +CREATE INDEX autofill_name ON autofill (name); +CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower); +CREATE TABLE offer_data ( offer_id UNSIGNED LONG, offer_reward_amount VARCHAR, expiry UNSIGNED LONG, offer_details_url VARCHAR, merchant_domain VARCHAR, promo_code VARCHAR, value_prop_text VARCHAR, see_details_text VARCHAR, usage_instructions_text VARCHAR); +COMMIT;
diff --git a/components/user_manager/fake_user_manager.cc b/components/user_manager/fake_user_manager.cc index 4e146e4..0ba57ff31 100644 --- a/components/user_manager/fake_user_manager.cc +++ b/components/user_manager/fake_user_manager.cc
@@ -10,8 +10,8 @@ #include "ash/constants/ash_switches.h" #include "base/callback.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/system/sys_info.h" #include "components/user_manager/user_names.h" #include "components/user_manager/user_type.h"
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc index 7d93ed9..3332ef2 100644 --- a/components/variations/service/variations_field_trial_creator.cc +++ b/components/variations/service/variations_field_trial_creator.cc
@@ -171,64 +171,121 @@ : local_state()->GetString(prefs::kVariationsCountry); } -bool VariationsFieldTrialCreator::CreateTrialsFromSeed( - const base::FieldTrial::EntropyProvider* low_entropy_provider, - base::FeatureList* feature_list, - SafeSeedManager* safe_seed_manager) { - TRACE_EVENT0("startup", "VariationsFieldTrialCreator::CreateTrialsFromSeed"); - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - CHECK(!create_trials_from_seed_called_); - create_trials_from_seed_called_ = true; - - base::TimeTicks start_time = base::TimeTicks::Now(); - - const base::Version& current_version = version_info::GetVersion(); - if (!current_version.IsValid()) - return false; - - std::unique_ptr<ClientFilterableState> client_filterable_state = - GetClientFilterableStateForVersion(current_version); - base::UmaHistogramSparse("Variations.UserChannel", - client_filterable_state->channel); - base::UmaHistogramEnumeration("Variations.PolicyRestriction", - client_filterable_state->policy_restriction); - - VariationsSeed seed; - bool run_in_safe_mode = safe_seed_manager->ShouldRunInSafeMode() && - LoadSafeSeed(&seed, client_filterable_state.get()); - - std::string seed_data; - std::string base64_seed_signature; - if (!run_in_safe_mode && !LoadSeed(&seed, &seed_data, &base64_seed_signature)) - return false; - - UMA_HISTOGRAM_BOOLEAN("Variations.SafeMode.FellBackToSafeMode2", - run_in_safe_mode); - - // Note that passing base::Unretained(this) below is safe because the callback - // is executed synchronously. It is not possible to pass UIStringOverrider - // directly to VariationsSeedProcessor (which is in components/variations and - // not components/variations/service) as the variations component should not - // depend on //ui/base. - VariationsSeedProcessor().CreateTrialsFromSeed( - seed, *client_filterable_state, - base::BindRepeating(&VariationsFieldTrialCreator::OverrideUIString, - base::Unretained(this)), - low_entropy_provider, feature_list); - - // Store into the |safe_seed_manager| the combined server and client data used - // to create the field trials. But, as an optimization, skip this step when - // running in safe mode – once running in safe mode, there can never be a need - // to save the active state to the safe seed prefs. - if (!run_in_safe_mode) { - safe_seed_manager->SetActiveSeedState(seed_data, base64_seed_signature, - std::move(client_filterable_state), - seed_store_->GetLastFetchTime()); +bool VariationsFieldTrialCreator::SetupFieldTrials( + const char* kEnableGpuBenchmarking, + const char* kEnableFeatures, + const char* kDisableFeatures, + const std::vector<std::string>& variation_ids, + const std::vector<base::FeatureList::FeatureOverrideInfo>& extra_overrides, + std::unique_ptr<const base::FieldTrial::EntropyProvider> + low_entropy_provider, + std::unique_ptr<base::FeatureList> feature_list, + PlatformFieldTrials* platform_field_trials, + SafeSeedManager* safe_seed_manager, + base::Optional<int> low_entropy_source_value) { + const base::CommandLine* command_line = + base::CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(switches::kEnableBenchmarking) || + command_line->HasSwitch(kEnableGpuBenchmarking)) { + base::FieldTrial::EnableBenchmarking(); } - UMA_HISTOGRAM_TIMES("Variations.SeedProcessingTime", - base::TimeTicks::Now() - start_time); - return true; + if (command_line->HasSwitch(switches::kForceFieldTrialParams)) { + bool result = AssociateParamsFromString( + command_line->GetSwitchValueASCII(switches::kForceFieldTrialParams)); + if (!result) { + // Some field trial params implement things like csv or json with a + // particular param. If some control characters are not %-encoded, it can + // lead to confusing error messages, so add a hint here. + ExitWithMessage(base::StringPrintf( + "Invalid --%s list specified. Make sure you %%-" + "encode the following characters in param values: %%:/.,", + switches::kForceFieldTrialParams)); + } + } + + // Ensure any field trials specified on the command line are initialized. + if (command_line->HasSwitch(::switches::kForceFieldTrials)) { + // Create field trials without activating them, so that this behaves in a + // consistent manner with field trials created from the server. + bool result = base::FieldTrialList::CreateTrialsFromString( + command_line->GetSwitchValueASCII(::switches::kForceFieldTrials)); + if (!result) { + ExitWithMessage(base::StringPrintf("Invalid --%s list specified.", + ::switches::kForceFieldTrials)); + } + } + + VariationsIdsProvider* http_header_provider = + VariationsIdsProvider::GetInstance(); + http_header_provider->SetLowEntropySourceValue(low_entropy_source_value); + // Force the variation ids selected in chrome://flags and/or specified using + // the command-line flag. + auto result = http_header_provider->ForceVariationIds( + variation_ids, + command_line->GetSwitchValueASCII(switches::kForceVariationIds)); + + switch (result) { + case VariationsIdsProvider::ForceIdsResult::INVALID_SWITCH_ENTRY: + ExitWithMessage(base::StringPrintf("Invalid --%s list specified.", + switches::kForceVariationIds)); + break; + case VariationsIdsProvider::ForceIdsResult::INVALID_VECTOR_ENTRY: + // It should not be possible to have invalid variation ids from the + // vector param (which corresponds to chrome://flags). + NOTREACHED(); + break; + case VariationsIdsProvider::ForceIdsResult::SUCCESS: + break; + } + + bool success = http_header_provider->ForceDisableVariationIds( + command_line->GetSwitchValueASCII(switches::kForceDisableVariationIds)); + if (!success) { + ExitWithMessage(base::StringPrintf("Invalid --%s list specified.", + switches::kForceDisableVariationIds)); + } + + feature_list->InitializeFromCommandLine( + command_line->GetSwitchValueASCII(kEnableFeatures), + command_line->GetSwitchValueASCII(kDisableFeatures)); + + // This needs to happen here: After the InitializeFromCommandLine() call, + // because the explicit cmdline --disable-features and --enable-features + // should take precedence over these extra overrides. Before the call to + // SetInstance(), because overrides cannot be registered after the FeatureList + // instance is set. + feature_list->RegisterExtraFeatureOverrides(extra_overrides); + + bool used_testing_config = false; +#if BUILDFLAG(FIELDTRIAL_TESTING_ENABLED) + if (!command_line->HasSwitch(switches::kDisableFieldTrialTestingConfig) && + !command_line->HasSwitch(::switches::kForceFieldTrials) && + !command_line->HasSwitch(switches::kVariationsServerURL)) { + // Note that passing base::Unretained(this) below is safe because the + // callback is executed synchronously. + AssociateDefaultFieldTrialConfig( + base::BindRepeating(&VariationsFieldTrialCreator::OverrideUIString, + base::Unretained(this)), + GetPlatform(), client_->GetCurrentFormFactor(), feature_list.get()); + used_testing_config = true; + } +#endif // BUILDFLAG(FIELDTRIAL_TESTING_ENABLED) + bool used_seed = false; + if (!used_testing_config) { + used_seed = CreateTrialsFromSeed(low_entropy_provider.get(), + feature_list.get(), safe_seed_manager); + } + + platform_field_trials->SetupFeatureControllingFieldTrials( + used_seed, low_entropy_provider.get(), feature_list.get()); + + base::FeatureList::SetInstance(std::move(feature_list)); + + // This must be called after |local_state_| is initialized. + platform_field_trials->SetupFieldTrials(); + + return used_seed; } std::unique_ptr<ClientFilterableState> @@ -386,6 +443,10 @@ overridden_strings_map_.clear(); } +bool VariationsFieldTrialCreator::IsOverrideResourceMapEmpty() { + return overridden_strings_map_.empty(); +} + bool VariationsFieldTrialCreator::LoadSeed(VariationsSeed* seed, std::string* seed_data, std::string* base64_signature) { @@ -431,121 +492,64 @@ return true; } -bool VariationsFieldTrialCreator::SetupFieldTrials( - const char* kEnableGpuBenchmarking, - const char* kEnableFeatures, - const char* kDisableFeatures, - const std::vector<std::string>& variation_ids, - const std::vector<base::FeatureList::FeatureOverrideInfo>& extra_overrides, - std::unique_ptr<const base::FieldTrial::EntropyProvider> - low_entropy_provider, - std::unique_ptr<base::FeatureList> feature_list, - PlatformFieldTrials* platform_field_trials, - SafeSeedManager* safe_seed_manager, - base::Optional<int> low_entropy_source_value) { - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(switches::kEnableBenchmarking) || - command_line->HasSwitch(kEnableGpuBenchmarking)) { - base::FieldTrial::EnableBenchmarking(); +bool VariationsFieldTrialCreator::CreateTrialsFromSeed( + const base::FieldTrial::EntropyProvider* low_entropy_provider, + base::FeatureList* feature_list, + SafeSeedManager* safe_seed_manager) { + TRACE_EVENT0("startup", "VariationsFieldTrialCreator::CreateTrialsFromSeed"); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(!create_trials_from_seed_called_); + create_trials_from_seed_called_ = true; + + base::TimeTicks start_time = base::TimeTicks::Now(); + + const base::Version& current_version = version_info::GetVersion(); + if (!current_version.IsValid()) + return false; + + std::unique_ptr<ClientFilterableState> client_filterable_state = + GetClientFilterableStateForVersion(current_version); + base::UmaHistogramSparse("Variations.UserChannel", + client_filterable_state->channel); + base::UmaHistogramEnumeration("Variations.PolicyRestriction", + client_filterable_state->policy_restriction); + + VariationsSeed seed; + bool run_in_safe_mode = safe_seed_manager->ShouldRunInSafeMode() && + LoadSafeSeed(&seed, client_filterable_state.get()); + + std::string seed_data; + std::string base64_seed_signature; + if (!run_in_safe_mode && !LoadSeed(&seed, &seed_data, &base64_seed_signature)) + return false; + + UMA_HISTOGRAM_BOOLEAN("Variations.SafeMode.FellBackToSafeMode2", + run_in_safe_mode); + + // Note that passing base::Unretained(this) below is safe because the callback + // is executed synchronously. It is not possible to pass UIStringOverrider + // directly to VariationsSeedProcessor (which is in components/variations and + // not components/variations/service) as the variations component should not + // depend on //ui/base. + VariationsSeedProcessor().CreateTrialsFromSeed( + seed, *client_filterable_state, + base::BindRepeating(&VariationsFieldTrialCreator::OverrideUIString, + base::Unretained(this)), + low_entropy_provider, feature_list); + + // Store into the |safe_seed_manager| the combined server and client data used + // to create the field trials. But, as an optimization, skip this step when + // running in safe mode – once running in safe mode, there can never be a need + // to save the active state to the safe seed prefs. + if (!run_in_safe_mode) { + safe_seed_manager->SetActiveSeedState(seed_data, base64_seed_signature, + std::move(client_filterable_state), + seed_store_->GetLastFetchTime()); } - if (command_line->HasSwitch(switches::kForceFieldTrialParams)) { - bool result = AssociateParamsFromString( - command_line->GetSwitchValueASCII(switches::kForceFieldTrialParams)); - if (!result) { - // Some field trial params implement things like csv or json with a - // particular param. If some control characters are not %-encoded, it can - // lead to confusing error messages, so add a hint here. - ExitWithMessage(base::StringPrintf( - "Invalid --%s list specified. Make sure you %%-" - "encode the following characters in param values: %%:/.,", - switches::kForceFieldTrialParams)); - } - } - - // Ensure any field trials specified on the command line are initialized. - if (command_line->HasSwitch(::switches::kForceFieldTrials)) { - // Create field trials without activating them, so that this behaves in a - // consistent manner with field trials created from the server. - bool result = base::FieldTrialList::CreateTrialsFromString( - command_line->GetSwitchValueASCII(::switches::kForceFieldTrials)); - if (!result) { - ExitWithMessage(base::StringPrintf("Invalid --%s list specified.", - ::switches::kForceFieldTrials)); - } - } - - VariationsIdsProvider* http_header_provider = - VariationsIdsProvider::GetInstance(); - http_header_provider->SetLowEntropySourceValue(low_entropy_source_value); - // Force the variation ids selected in chrome://flags and/or specified using - // the command-line flag. - auto result = http_header_provider->ForceVariationIds( - variation_ids, - command_line->GetSwitchValueASCII(switches::kForceVariationIds)); - - switch (result) { - case VariationsIdsProvider::ForceIdsResult::INVALID_SWITCH_ENTRY: - ExitWithMessage(base::StringPrintf("Invalid --%s list specified.", - switches::kForceVariationIds)); - break; - case VariationsIdsProvider::ForceIdsResult::INVALID_VECTOR_ENTRY: - // It should not be possible to have invalid variation ids from the - // vector param (which corresponds to chrome://flags). - NOTREACHED(); - break; - case VariationsIdsProvider::ForceIdsResult::SUCCESS: - break; - } - - bool success = http_header_provider->ForceDisableVariationIds( - command_line->GetSwitchValueASCII(switches::kForceDisableVariationIds)); - if (!success) { - ExitWithMessage(base::StringPrintf("Invalid --%s list specified.", - switches::kForceDisableVariationIds)); - } - - feature_list->InitializeFromCommandLine( - command_line->GetSwitchValueASCII(kEnableFeatures), - command_line->GetSwitchValueASCII(kDisableFeatures)); - - // This needs to happen here: After the InitializeFromCommandLine() call, - // because the explicit cmdline --disable-features and --enable-features - // should take precedence over these extra overrides. Before the call to - // SetInstance(), because overrides cannot be registered after the FeatureList - // instance is set. - feature_list->RegisterExtraFeatureOverrides(extra_overrides); - - bool used_testing_config = false; -#if BUILDFLAG(FIELDTRIAL_TESTING_ENABLED) - if (!command_line->HasSwitch(switches::kDisableFieldTrialTestingConfig) && - !command_line->HasSwitch(::switches::kForceFieldTrials) && - !command_line->HasSwitch(switches::kVariationsServerURL)) { - // Note that passing base::Unretained(this) below is safe because the - // callback is executed synchronously. - AssociateDefaultFieldTrialConfig( - base::BindRepeating(&VariationsFieldTrialCreator::OverrideUIString, - base::Unretained(this)), - GetPlatform(), client_->GetCurrentFormFactor(), feature_list.get()); - used_testing_config = true; - } -#endif // BUILDFLAG(FIELDTRIAL_TESTING_ENABLED) - bool used_seed = false; - if (!used_testing_config) { - used_seed = CreateTrialsFromSeed(low_entropy_provider.get(), - feature_list.get(), safe_seed_manager); - } - - platform_field_trials->SetupFeatureControllingFieldTrials( - used_seed, low_entropy_provider.get(), feature_list.get()); - - base::FeatureList::SetInstance(std::move(feature_list)); - - // This must be called after |local_state_| is initialized. - platform_field_trials->SetupFieldTrials(); - - return used_seed; + UMA_HISTOGRAM_TIMES("Variations.SeedProcessingTime", + base::TimeTicks::Now() - start_time); + return true; } void VariationsFieldTrialCreator::OverrideUIString(uint32_t resource_hash, @@ -565,10 +569,6 @@ resource_id, str); } -bool VariationsFieldTrialCreator::IsOverrideResourceMapEmpty() { - return overridden_strings_map_.empty(); -} - VariationsSeedStore* VariationsFieldTrialCreator::GetSeedStore() { return seed_store_.get(); }
diff --git a/components/variations/service/variations_field_trial_creator.h b/components/variations/service/variations_field_trial_creator.h index 21b528b1..85067c8 100644 --- a/components/variations/service/variations_field_trial_creator.h +++ b/components/variations/service/variations_field_trial_creator.h
@@ -115,9 +115,6 @@ // client. void StoreVariationsOverriddenCountry(const std::string& country); - // Records the time of the most recent successful fetch. - void RecordLastFetchTime(); - // Allow the platform that is used to filter the set of active trials to be // overridden. void OverrideVariationsPlatform(Study::Platform platform_override);
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc index edaba4f..eb09070 100644 --- a/components/viz/service/display/display.cc +++ b/components/viz/service/display/display.cc
@@ -9,10 +9,10 @@ #include <limits> #include <utility> +#include "base/containers/contains.h" #include "base/debug/dump_without_crashing.h" #include "base/metrics/histogram_macros.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/timer/elapsed_timer.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h"
diff --git a/components/viz/service/display/display_scheduler_unittest.cc b/components/viz/service/display/display_scheduler_unittest.cc index 1d18f5a..60ccdd7 100644 --- a/components/viz/service/display/display_scheduler_unittest.cc +++ b/components/viz/service/display/display_scheduler_unittest.cc
@@ -9,7 +9,7 @@ #include <vector> #include "base/check.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/test/null_task_runner.h" #include "base/test/simple_test_tick_clock.h" #include "base/trace_event/trace_event.h"
diff --git a/components/viz/service/display/draw_polygon_unittest.cc b/components/viz/service/display/draw_polygon_unittest.cc index c44b623..598e61a 100644 --- a/components/viz/service/display/draw_polygon_unittest.cc +++ b/components/viz/service/display/draw_polygon_unittest.cc
@@ -9,9 +9,9 @@ #include <utility> #include <vector> +#include "base/containers/contains.h" #include "base/logging.h" #include "base/numerics/math_constants.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "components/viz/service/display/bsp_compare_result.h" #include "components/viz/service/display/draw_polygon.h"
diff --git a/components/viz/service/display_embedder/server_shared_bitmap_manager.cc b/components/viz/service/display_embedder/server_shared_bitmap_manager.cc index b668512b..c2a177e 100644 --- a/components/viz/service/display_embedder/server_shared_bitmap_manager.cc +++ b/components/viz/service/display_embedder/server_shared_bitmap_manager.cc
@@ -9,12 +9,12 @@ #include <string> #include <utility> +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/macros.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/memory/ref_counted.h" #include "base/memory/shared_memory_mapping.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/trace_event/process_memory_dump.h"
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc index e910e09a..a996019 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -10,8 +10,8 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/time/time.h" #include "build/build_config.h" #include "cc/base/features.h"
diff --git a/components/viz/test/test_gles2_interface.h b/components/viz/test/test_gles2_interface.h index 1ad792e..df07639 100644 --- a/components/viz/test/test_gles2_interface.h +++ b/components/viz/test/test_gles2_interface.h
@@ -11,11 +11,11 @@ #include "base/callback.h" #include "base/compiler_specific.h" +#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" -#include "base/stl_util.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_interface_stub.h" #include "gpu/command_buffer/common/capabilities.h"
diff --git a/components/webapps/browser/installable/installable_manager.cc b/components/webapps/browser/installable/installable_manager.cc index de794c4a..f23766b 100644 --- a/components/webapps/browser/installable/installable_manager.cc +++ b/components/webapps/browser/installable/installable_manager.cc
@@ -11,7 +11,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/string_util.h" #include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h"
diff --git a/components/webdata/common/BUILD.gn b/components/webdata/common/BUILD.gn index d3d431e..f225e86 100644 --- a/components/webdata/common/BUILD.gn +++ b/components/webdata/common/BUILD.gn
@@ -82,6 +82,7 @@ "//components/test/data/web_database/version_92.sql", "//components/test/data/web_database/version_93.sql", "//components/test/data/web_database/version_94.sql", + "//components/test/data/web_database/version_95.sql", ] outputs = [ "{{bundle_resources_dir}}/" + "{{source_root_relative_dir}}/{{source_file_part}}" ]
diff --git a/components/webdata/common/web_database.cc b/components/webdata/common/web_database.cc index 58d2265..f05381e 100644 --- a/components/webdata/common/web_database.cc +++ b/components/webdata/common/web_database.cc
@@ -14,7 +14,7 @@ // corresponding changes must happen in the unit tests, and new migration test // added. See |WebDatabaseMigrationTest::kCurrentTestedVersionNumber|. // static -const int WebDatabase::kCurrentVersionNumber = 95; +const int WebDatabase::kCurrentVersionNumber = 96; const int WebDatabase::kDeprecatedVersionNumber = 51;
diff --git a/components/webdata/common/web_database_migration_unittest.cc b/components/webdata/common/web_database_migration_unittest.cc index 40a2992a..8173eb66 100644 --- a/components/webdata/common/web_database_migration_unittest.cc +++ b/components/webdata/common/web_database_migration_unittest.cc
@@ -125,7 +125,7 @@ DISALLOW_COPY_AND_ASSIGN(WebDatabaseMigrationTest); }; -const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 95; +const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 96; void WebDatabaseMigrationTest::LoadDatabase( const base::FilePath::StringType& file) { @@ -2126,3 +2126,36 @@ connection.DoesColumnExist("credit_card_art_images", "card_art_image")); } } + +// Tests addition of lock state to the autofill_profile table. +TEST_F(WebDatabaseMigrationTest, MigrateVersion95ToCurrent) { + ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_95.sql"))); + + // Verify pre-conditions. + { + sql::Database connection; + ASSERT_TRUE(connection.Open(GetDatabasePath())); + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); + + sql::MetaTable meta_table; + ASSERT_TRUE(meta_table.Init(&connection, 95, 83)); + + EXPECT_FALSE(connection.DoesColumnExist( + "autofill_profile", "disallow_settings_visible_updates")); + } + + DoMigration(); + + // Verify post-conditions. + { + sql::Database connection; + ASSERT_TRUE(connection.Open(GetDatabasePath())); + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); + + // Check version. + EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); + + EXPECT_FALSE(connection.DoesColumnExist( + "autofill_profile", "disallow_settings_visible_updates")); + } +}
diff --git a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm index b2b2f842..c17242f 100644 --- a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm +++ b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
@@ -7,10 +7,10 @@ #include <limits> #include <utility> +#include "base/containers/contains.h" #include "base/debug/crash_logging.h" #import "base/mac/foundation_util.h" #include "base/numerics/ranges.h" -#include "base/stl_util.h" #include "base/strings/sys_string_conversions.h" #import "content/browser/accessibility/browser_accessibility_cocoa.h" #import "content/browser/accessibility/browser_accessibility_mac.h"
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index c10ae16..efecbd7 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -203,6 +203,9 @@ // Fire any events that need to be fired when tree nodes get deleted. For // example, events that fire every time "OnSubtreeWillBeDeleted" is called. ax_tree()->Destroy(); + for (auto& key_value_pair : id_wrapper_map_) { + delete key_value_pair.second; + } delegate_ = nullptr; // Guard against reentrancy by screen reader. if (last_focused_node_tree_id_ && ax_tree_id_ == *last_focused_node_tree_id_) {
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index 932d38d7..d06da10 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -11,7 +11,7 @@ #include <vector> #include "base/command_line.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/win/scoped_variant.h" #include "base/win/windows_version.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h"
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index eb90e3f..cb383977 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -10662,4 +10662,115 @@ {}, {}, {}, FROM_HERE); } +class BackForwardCacheOptInBrowserTest : public BackForwardCacheBrowserTest { + protected: + void SetUpCommandLine(base::CommandLine* command_line) override { + EnableFeatureAndSetParams(features::kBackForwardCache, + "opt_in_header_required", "true"); + BackForwardCacheBrowserTest::SetUpCommandLine(command_line); + } +}; + +IN_PROC_BROWSER_TEST_F(BackForwardCacheOptInBrowserTest, NoCacheWithoutHeader) { + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html")); + GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); + + // 1) Navigate to A. + EXPECT_TRUE(NavigateToURL(shell(), url_a)); + RenderFrameHostImpl* rfh_a = current_frame_host(); + RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a); + + // 2) Navigate to B. + EXPECT_TRUE(NavigateToURL(shell(), url_b)); + EXPECT_TRUE(delete_observer_rfh_a.deleted()); + + // 3) Go back. + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + + ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason:: + kOptInUnloadHeaderNotPresent}, + {}, {}, {}, FROM_HERE); +} + +namespace { + +const char kResponseWithOptIn[] = + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html; charset=utf-8\r\n" + "BFCache-Opt-In: unload\r\n" + "\r\n" + "bfcache opt in page."; + +} // namespace + +IN_PROC_BROWSER_TEST_F(BackForwardCacheOptInBrowserTest, + CacheIfHeaderIsPresent) { + net::test_server::ControllableHttpResponse response(embedded_test_server(), + "/opt_in_document"); + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url_a(embedded_test_server()->GetURL("a.com", "/opt_in_document")); + GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); + + // 1) Navigate to A. + TestNavigationObserver observer(web_contents()); + shell()->LoadURL(url_a); + response.WaitForRequest(); + response.Send(kResponseWithOptIn); + response.Done(); + observer.Wait(); + RenderFrameHostImpl* rfh_a = current_frame_host(); + RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a); + + // 2) Navigate to B. + EXPECT_TRUE(NavigateToURL(shell(), url_b)); + ASSERT_FALSE(delete_observer_rfh_a.deleted()); + EXPECT_TRUE(rfh_a->IsInBackForwardCache()); + + // 3) Go back. + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + + ExpectRestored(FROM_HERE); +} + +IN_PROC_BROWSER_TEST_F(BackForwardCacheOptInBrowserTest, + NoCacheIfHeaderOnlyPresentOnDestinationPage) { + net::test_server::ControllableHttpResponse response(embedded_test_server(), + "/opt_in_document"); + ASSERT_TRUE(embedded_test_server()->Start()); + + GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html")); + GURL url_b(embedded_test_server()->GetURL("b.com", "/opt_in_document")); + + // 1) Navigate to A. + EXPECT_TRUE(NavigateToURL(shell(), url_a)); + RenderFrameHostImpl* rfh_a = current_frame_host(); + RenderFrameDeletedObserver delete_observer_rfh_a(rfh_a); + + // 2) Navigate to B. + TestNavigationObserver observer(web_contents()); + shell()->LoadURL(url_b); + response.WaitForRequest(); + response.Send(kResponseWithOptIn); + response.Done(); + observer.Wait(); + EXPECT_TRUE(delete_observer_rfh_a.deleted()); + + // 3) Go back. - A doesn't have header so it shouldn't be cached. + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + + ExpectNotRestored({BackForwardCacheMetrics::NotRestoredReason:: + kOptInUnloadHeaderNotPresent}, + {}, {}, {}, FROM_HERE); + + // 4) Go forward. - B has the header, so it should be cached. + web_contents()->GetController().GoForward(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + + ExpectRestored(FROM_HERE); +} + } // namespace content
diff --git a/content/browser/bluetooth/bluetooth_allowed_devices.cc b/content/browser/bluetooth/bluetooth_allowed_devices.cc index be47f41..0f69a5f 100644 --- a/content/browser/bluetooth/bluetooth_allowed_devices.cc +++ b/content/browser/bluetooth/bluetooth_allowed_devices.cc
@@ -7,9 +7,9 @@ #include <string> #include <vector> +#include "base/containers/contains.h" #include "base/logging.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "content/browser/bluetooth/bluetooth_blocklist.h"
diff --git a/content/browser/browsing_data/browsing_data_remover_impl.cc b/content/browser/browsing_data/browsing_data_remover_impl.cc index 9749af8..349ceb6 100644 --- a/content/browser/browsing_data/browsing_data_remover_impl.cc +++ b/content/browser/browsing_data/browsing_data_remover_impl.cc
@@ -12,12 +12,12 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" -#include "base/stl_util.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "content/browser/browsing_data/browsing_data_filter_builder_impl.h"
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage.cc b/content/browser/cache_storage/legacy/legacy_cache_storage.cc index 4c6c0a5b..4c96def 100644 --- a/content/browser/cache_storage/legacy/legacy_cache_storage.cc +++ b/content/browser/cache_storage/legacy/legacy_cache_storage.cc
@@ -15,6 +15,7 @@ #include "base/barrier_closure.h" #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/files/file_util.h" #include "base/files/memory_mapped_file.h" #include "base/guid.h" @@ -26,7 +27,6 @@ #include "base/metrics/histogram_macros.h" #include "base/numerics/safe_conversions.h" #include "base/sequenced_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/content/browser/cross_origin_opener_policy_browsertest.cc b/content/browser/cross_origin_opener_policy_browsertest.cc index 6b25385b..852a2e70 100644 --- a/content/browser/cross_origin_opener_policy_browsertest.cc +++ b/content/browser/cross_origin_opener_policy_browsertest.cc
@@ -182,12 +182,19 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NewPopupCOOP_InheritsSameOrigin) { - GURL starting_page( - https_server()->GetURL("a.com", "/cross_site_iframe_factory.html?a(a)")); + GURL starting_page(https_server()->GetURL( + "a.com", "/set-header?cross-origin-opener-policy: same-origin")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); RenderFrameHostImpl* main_frame = current_frame_host(); - main_frame->set_cross_origin_opener_policy_for_testing(CoopSameOrigin()); + + // Create same origin child frame. + ASSERT_TRUE(ExecJs(main_frame, R"( + let frame = document.createElement('iframe'); + frame.src = '/empty.html'; + document.body.appendChild(frame); + )")); + EXPECT_TRUE(WaitForLoadStop(web_contents())); ShellAddedObserver shell_observer; RenderFrameHostImpl* iframe = main_frame->child_at(0)->current_frame_host(); @@ -205,13 +212,20 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NewPopupCOOP_InheritsSameOriginAllowPopups) { - GURL starting_page( - https_server()->GetURL("a.com", "/cross_site_iframe_factory.html?a(a)")); + GURL starting_page(https_server()->GetURL( + "a.com", + "/set-header?cross-origin-opener-policy: same-origin-allow-popups")); EXPECT_TRUE(NavigateToURL(shell(), starting_page)); RenderFrameHostImpl* main_frame = current_frame_host(); - main_frame->set_cross_origin_opener_policy_for_testing( - CoopSameOriginAllowPopups()); + + // Create same origin child frame. + ASSERT_TRUE(ExecJs(current_frame_host(), R"( + let frame = document.createElement('iframe'); + frame.src = '/empty.html'; + document.body.appendChild(frame); + )")); + EXPECT_TRUE(WaitForLoadStop(web_contents())); ShellAddedObserver shell_observer; RenderFrameHostImpl* iframe = main_frame->child_at(0)->current_frame_host(); @@ -231,12 +245,22 @@ IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NewPopupCOOP_CrossOriginDoesNotInherit) { - GURL starting_page( - https_server()->GetURL("a.com", "/cross_site_iframe_factory.html?a(b)")); + GURL starting_page(https_server()->GetURL( + "a.com", "/set-header?cross-origin-opener-policy: same-origin")); + GURL url_b(https_server()->GetURL("b.com", "/empty.html")); + EXPECT_TRUE(NavigateToURL(shell(), starting_page)); RenderFrameHostImpl* main_frame = current_frame_host(); - main_frame->set_cross_origin_opener_policy_for_testing(CoopSameOrigin()); + + // Create cross origin child frame. + ASSERT_TRUE(ExecJs(main_frame, JsReplace(R"( + let frame = document.createElement('iframe'); + frame.src = $1; + document.body.appendChild(frame); + )", + url_b))); + EXPECT_TRUE(WaitForLoadStop(web_contents())); ShellAddedObserver shell_observer; RenderFrameHostImpl* iframe = main_frame->child_at(0)->current_frame_host(); @@ -255,13 +279,26 @@ IN_PROC_BROWSER_TEST_P( CrossOriginOpenerPolicyBrowserTest, NewPopupCOOP_SameOriginPolicyAndCrossOriginIframeSetsNoopener) { - for (auto coop_value : {CoopSameOriginPlusCoep(), CoopSameOrigin()}) { - GURL starting_page(https_server()->GetURL( - "a.com", "/cross_site_iframe_factory.html?a(b)")); + for (const char* header : + {"cross-origin-opener-policy: same-origin", + "cross-origin-opener-policy: same-origin&cross-origin-embedder-policy: " + "require-corp"}) { + GURL starting_page( + https_server()->GetURL("a.com", std::string("/set-header?") + header)); + GURL url_b(https_server()->GetURL("b.com", "/empty.html")); + EXPECT_TRUE(NavigateToURL(shell(), starting_page)); RenderFrameHostImpl* main_frame = current_frame_host(); - main_frame->set_cross_origin_opener_policy_for_testing(coop_value); + + // Create cross origin child frame. + ASSERT_TRUE(ExecJs(main_frame, JsReplace(R"( + let frame = document.createElement('iframe'); + frame.src = $1; + document.body.appendChild(frame); + )", + url_b))); + EXPECT_TRUE(WaitForLoadStop(web_contents())); ShellAddedObserver new_shell_observer; RenderFrameHostImpl* iframe = main_frame->child_at(0)->current_frame_host(); @@ -442,10 +479,155 @@ EXPECT_EQ(iframe_rfh->GetLastCommittedURL(), iframe_navigation_url); EXPECT_EQ(iframe_rfh->GetSiteInstance(), non_coop_iframe_site_instance); + // The iframe's COOP value is defaulted to unsafe-none since the iframe is + // cross origin with its top frame. EXPECT_EQ(iframe_rfh->cross_origin_opener_policy(), CoopUnsafeNone()); } IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, + CoopSameOriginIframeInheritance) { + GURL coop_url(embedded_test_server()->GetURL( + "/set-header?cross-origin-opener-policy: same-origin")); + ASSERT_TRUE(NavigateToURL(shell(), coop_url)); + + // Create same origin child frame. + ASSERT_TRUE(ExecJs(current_frame_host(), R"( + let frame = document.createElement('iframe'); + frame.src = '/empty.html'; + document.body.appendChild(frame); + )")); + EXPECT_TRUE(WaitForLoadStop(web_contents())); + + RenderFrameHostImpl* child_rfh = + current_frame_host()->child_at(0)->current_frame_host(); + + // The embedded document has a COOP value that is always inherited from its + // top level document if they are same-origin. This has no incidence on the + // embeddee but is inherited by the popup opened hereafter. + EXPECT_EQ( + network::mojom::CrossOriginOpenerPolicyValue::kSameOrigin, + child_rfh->policy_container_host()->cross_origin_opener_policy().value); + + // Create a popup from the iframe. + ShellAddedObserver shell_observer; + EXPECT_TRUE(ExecJs(child_rfh, R"( + w = window.open("about:blank"); + )")); + WebContentsImpl* popup_webcontents = + static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()); + RenderFrameHostImpl* popup_rfh = popup_webcontents->GetMainFrame(); + + // Verify inheritance from the opener: + // The second about:blank document of the popup, due to the synchronous + // re-navigation to about:blank, inherits COOP from its opener. + // When the opener is same-origin with its top-level document, the top-level + // document's COOP value (same-origin) is used. + // In practice policy container handles the inheritance, taking the value + // from the opener directly, which was properly set when the document was + // committed. + EXPECT_EQ( + network::mojom::CrossOriginOpenerPolicyValue::kSameOrigin, + popup_rfh->policy_container_host()->cross_origin_opener_policy().value); + + PolicyContainerHost* popup_initial_policy_container = + popup_rfh->policy_container_host(); + + // Navigate the popup from the iframe to about:blank. + EXPECT_TRUE(ExecJs(child_rfh, R"( + w.location.href = "about:blank"; + )")); + EXPECT_TRUE(WaitForLoadStop(popup_webcontents)); + popup_rfh = popup_webcontents->GetMainFrame(); + + // Verify the policy container changed, highlighting that the popup has + // navigated to a different about:blank document. + EXPECT_NE(popup_initial_policy_container, popup_rfh->policy_container_host()); + + // Verify inheritance from the initiator: + // The navigation to a local scheme inherits COOP from the initiator. When the + // initiator is same-origin with its top-level document, the top-level + // document's COOP value (same-origin) is used. + // In practice policy container handles the inheritance, taking the value + // from the initiator directly, which was properly set when the document was + // committed. + EXPECT_EQ( + network::mojom::CrossOriginOpenerPolicyValue::kSameOrigin, + popup_rfh->policy_container_host()->cross_origin_opener_policy().value); +} + +IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, + CoopCrossOriginIframeInheritance) { + GURL coop_url(embedded_test_server()->GetURL( + "/set-header?cross-origin-opener-policy: same-origin-allow-popups")); + GURL url_b(embedded_test_server()->GetURL("b.com", "/empty.html")); + ASSERT_TRUE(NavigateToURL(shell(), coop_url)); + + // Create child frame. + ASSERT_TRUE(ExecJs(current_frame_host(), JsReplace(R"( + let frame = document.createElement('iframe'); + frame.src = $1; + document.body.appendChild(frame); + )", + url_b))); + EXPECT_TRUE(WaitForLoadStop(web_contents())); + + RenderFrameHostImpl* child_rfh = + current_frame_host()->child_at(0)->current_frame_host(); + + // The embedded document has a COOP value that is always defaulted when it is + // cross origin with its top level document. This has no incidence on the + // embeddee but is inherited by the popup opened hereafter. + EXPECT_EQ( + network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone, + child_rfh->policy_container_host()->cross_origin_opener_policy().value); + + // Create a popup from the iframe. + ShellAddedObserver shell_observer; + EXPECT_TRUE(ExecJs(child_rfh, R"( + w = window.open("about:blank"); + )")); + WebContentsImpl* popup_webcontents = + static_cast<WebContentsImpl*>(shell_observer.GetShell()->web_contents()); + RenderFrameHostImpl* popup_rfh = popup_webcontents->GetMainFrame(); + + // The second about:blank document of the popup, due to the synchronous + // re-navigation to about:blank, inherits COOP from its opener. + // When the opener is cross-origin with its top-level document, the COOP value + // is defaulted to unsafe-none. + // In practice policy container handles the inheritance, taking the value + // from the opener directly, which was properly set when the document was + // committed. + EXPECT_EQ( + network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone, + popup_rfh->policy_container_host()->cross_origin_opener_policy().value); + + PolicyContainerHost* popup_initial_policy_container = + popup_rfh->policy_container_host(); + + // Navigate the popup from the iframe. + EXPECT_TRUE(ExecJs(child_rfh, R"( + w.location.href = "about:blank"; + )")); + EXPECT_TRUE(WaitForLoadStop(popup_webcontents)); + popup_rfh = popup_webcontents->GetMainFrame(); + + // Verify the policy container changed, highlighting that the popup has + // navigated to a different about:blank document. + EXPECT_NE(popup_initial_policy_container, popup_rfh->policy_container_host()); + + // Verify inheritance from the initiator: + // The navigation to a local scheme inherits COOP from the initiator. When the + // initiator is cross-origin with its top-level document, the COOP value is + // defaulted to unsafe-none. + // In practice policy container handles the inheritance, taking the value + // from the initiator directly, which was properly set when the document was + // committed. + EXPECT_EQ( + network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone, + popup_rfh->policy_container_host()->cross_origin_opener_policy().value); +} + +IN_PROC_BROWSER_TEST_P(CrossOriginOpenerPolicyBrowserTest, NonCoopPageCrashIntoCoop) { IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); GURL non_coop_page(https_server()->GetURL("a.com", "/title1.html"));
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index 0936be5..a948e55 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/debug/alias.h" #include "base/files/file_util.h" #include "base/i18n/case_conversion.h" @@ -17,7 +18,6 @@ #include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/strings/sys_string_conversions.h" #include "base/supports_user_data.h" #include "base/synchronization/lock.h"
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index eaed2ec..0395a592 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -16,7 +17,6 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/rand_util.h" -#include "base/stl_util.h" #include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h"
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 52eaa81e..23dfde8 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -14,10 +14,10 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/environment.h" #include "base/i18n/time_formatting.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringize_macros.h" #include "base/strings/stringprintf.h"
diff --git a/content/browser/indexed_db/indexed_db_active_blob_registry.cc b/content/browser/indexed_db/indexed_db_active_blob_registry.cc index 6494194..9458f4a9 100644 --- a/content/browser/indexed_db/indexed_db_active_blob_registry.cc +++ b/content/browser/indexed_db/indexed_db_active_blob_registry.cc
@@ -5,8 +5,8 @@ #include "content/browser/indexed_db/indexed_db_active_blob_registry.h" #include "base/bind.h" +#include "base/containers/contains.h" #include "base/location.h" -#include "base/stl_util.h" #include "base/task_runner.h" #include "base/threading/sequenced_task_runner_handle.h" #include "content/browser/indexed_db/indexed_db_backing_store.h"
diff --git a/content/browser/indexed_db/indexed_db_active_blob_registry_unittest.cc b/content/browser/indexed_db/indexed_db_active_blob_registry_unittest.cc index b504e3df..06fcc12 100644 --- a/content/browser/indexed_db/indexed_db_active_blob_registry_unittest.cc +++ b/content/browser/indexed_db/indexed_db_active_blob_registry_unittest.cc
@@ -8,8 +8,8 @@ #include <set> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/test/task_environment.h" #include "content/browser/indexed_db/indexed_db_active_blob_registry.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/content/browser/indexed_db/indexed_db_connection.cc b/content/browser/indexed_db/indexed_db_connection.cc index 832a594..8d221caa 100644 --- a/content/browser/indexed_db/indexed_db_connection.cc +++ b/content/browser/indexed_db/indexed_db_connection.cc
@@ -7,7 +7,7 @@ #include <utility> #include "base/check_op.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "content/browser/indexed_db/indexed_db_class_factory.h" #include "content/browser/indexed_db/indexed_db_database_callbacks.h" #include "content/browser/indexed_db/indexed_db_database_error.h"
diff --git a/content/browser/indexed_db/indexed_db_database.cc b/content/browser/indexed_db/indexed_db_database.cc index b409178..a9f92f48 100644 --- a/content/browser/indexed_db/indexed_db_database.cc +++ b/content/browser/indexed_db/indexed_db_database.cc
@@ -13,6 +13,7 @@ #include "base/auto_reset.h" #include "base/bind.h" +#include "base/containers/contains.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/scoped_refptr.h" @@ -20,7 +21,6 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "components/services/storage/indexed_db/scopes/leveldb_scope.h" #include "components/services/storage/indexed_db/scopes/leveldb_scopes.h"
diff --git a/content/browser/indexed_db/indexed_db_factory_impl.cc b/content/browser/indexed_db/indexed_db_factory_impl.cc index c540c37..d16d0db 100644 --- a/content/browser/indexed_db/indexed_db_factory_impl.cc +++ b/content/browser/indexed_db/indexed_db_factory_impl.cc
@@ -16,13 +16,13 @@ #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/compiler_specific.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/sequenced_task_runner.h" -#include "base/stl_util.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h"
diff --git a/content/browser/indexed_db/indexed_db_origin_state.cc b/content/browser/indexed_db/indexed_db_origin_state.cc index 42fb0c2..76a9302 100644 --- a/content/browser/indexed_db/indexed_db_origin_state.cc +++ b/content/browser/indexed_db/indexed_db_origin_state.cc
@@ -11,9 +11,9 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/rand_util.h" -#include "base/stl_util.h" #include "base/synchronization/waitable_event.h" #include "components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_database.h" #include "components/services/storage/indexed_db/transactional_leveldb/transactional_leveldb_factory.h"
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 1e451d4..02ae2a1 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -11,11 +11,11 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/debug/dump_without_crashing.h" #include "base/memory/scoped_refptr.h" #include "base/metrics/histogram_macros.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "components/download/public/common/download_stats.h"
diff --git a/content/browser/locks/lock_manager.cc b/content/browser/locks/lock_manager.cc index 19c70ea..905b25d5 100644 --- a/content/browser/locks/lock_manager.cc +++ b/content/browser/locks/lock_manager.cc
@@ -12,8 +12,8 @@ #include <vector> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/guid.h" -#include "base/stl_util.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h"
diff --git a/content/browser/media/midi_host.cc b/content/browser/media/midi_host.cc index 2a8cf7d..a781969 100644 --- a/content/browser/media/midi_host.cc +++ b/content/browser/media/midi_host.cc
@@ -6,9 +6,9 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" #include "base/process/process.h" -#include "base/stl_util.h" #include "base/trace_event/trace_event.h" #include "content/browser/bad_message.h" #include "content/browser/browser_main_loop.h"
diff --git a/content/browser/media/service_factory.cc b/content/browser/media/service_factory.cc index e33ccc0..59c887a 100644 --- a/content/browser/media/service_factory.cc +++ b/content/browser/media/service_factory.cc
@@ -93,7 +93,8 @@ auto site_display_name = GetContentClient()->browser()->GetSiteDisplayNameForCdmProcess( browser_context, site); - display_name += " (" + site_display_name + ")"; + if (!site_display_name.empty()) + display_name += " (" + site_display_name + ")"; } else { key = {guid, nullptr, GURL()}; }
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index eb3ebd4..9a4167c 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc
@@ -9,9 +9,9 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/numerics/ranges.h" #include "base/ranges/algorithm.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/timer/timer.h" #include "build/build_config.h"
diff --git a/content/browser/payments/payment_app_content_unittest_base.cc b/content/browser/payments/payment_app_content_unittest_base.cc index 7ca6e9ff..04b1633 100644 --- a/content/browser/payments/payment_app_content_unittest_base.cc +++ b/content/browser/payments/payment_app_content_unittest_base.cc
@@ -10,9 +10,9 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "content/browser/service_worker/embedded_worker_test_helper.h" #include "content/browser/service_worker/fake_embedded_worker_instance_client.h" #include "content/browser/service_worker/fake_service_worker.h"
diff --git a/content/browser/payments/payment_app_context_impl.cc b/content/browser/payments/payment_app_context_impl.cc index 59ee6153..b725d996c 100644 --- a/content/browser/payments/payment_app_context_impl.cc +++ b/content/browser/payments/payment_app_context_impl.cc
@@ -7,7 +7,7 @@ #include <utility> #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/task/post_task.h" #include "content/browser/payments/payment_manager.h" #include "content/public/browser/browser_task_traits.h"
diff --git a/content/browser/plugin_list.cc b/content/browser/plugin_list.cc index 19e5905..dd2b55a1 100644 --- a/content/browser/plugin_list.cc +++ b/content/browser/plugin_list.cc
@@ -10,8 +10,8 @@ #include "base/check.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" -#include "base/stl_util.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h"
diff --git a/content/browser/plugin_private_storage_helper.cc b/content/browser/plugin_private_storage_helper.cc index 7ab7c65..a9b4e2de 100644 --- a/content/browser/plugin_private_storage_helper.cc +++ b/content/browser/plugin_private_storage_helper.cc
@@ -14,12 +14,12 @@ #include "base/bind.h" #include "base/compiler_specific.h" +#include "base/containers/contains.h" #include "base/files/file.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" #include "base/location.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/posix_file_descriptor_info_impl.cc b/content/browser/posix_file_descriptor_info_impl.cc index 94a498a9..8b56eddd 100644 --- a/content/browser/posix_file_descriptor_info_impl.cc +++ b/content/browser/posix_file_descriptor_info_impl.cc
@@ -6,7 +6,7 @@ #include <utility> -#include "base/stl_util.h" +#include "base/containers/contains.h" namespace content {
diff --git a/content/browser/prerender/prerender_host_registry.cc b/content/browser/prerender/prerender_host_registry.cc index b86cb93..8de5e8e7 100644 --- a/content/browser/prerender/prerender_host_registry.cc +++ b/content/browser/prerender/prerender_host_registry.cc
@@ -6,9 +6,9 @@ #include "base/callback_helpers.h" #include "base/check.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/system/sys_info.h" #include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/trace_conversion_helper.h"
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.cc b/content/browser/renderer_host/agent_scheduling_group_host.cc index 66ff18d..964fd56 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.cc +++ b/content/browser/renderer_host/agent_scheduling_group_host.cc
@@ -5,10 +5,10 @@ #include <memory> +#include "base/containers/contains.h" #include "base/containers/unique_ptr_adapters.h" #include "base/feature_list.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "base/supports_user_data.h" #include "content/browser/bad_message.h" #include "content/browser/renderer_host/agent_scheduling_group_host_factory.h"
diff --git a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc index 83518e7..48435907 100644 --- a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc +++ b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
@@ -157,6 +157,9 @@ return "Browsing instance is not swapped"; case Reason::kBackForwardCacheDisabledForDelegate: return "BackForwardCache is not supported by delegate"; + case Reason::kOptInUnloadHeaderNotPresent: + return "BFCache-Opt-In header not present, or does not include `unload` " + "token, and an experimental config which requires it is active."; } }
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc index 22db2c8f..7764baf 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.cc +++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -109,6 +109,14 @@ return file_system_api_supported.Get(); } +bool IsOptInHeaderRequired() { + if (!IsBackForwardCacheEnabled()) + return false; + static constexpr base::FeatureParam<bool> opt_in_header_required( + &features::kBackForwardCache, "opt_in_header_required", false); + return opt_in_header_required.Get(); +} + uint64_t SupportedFeaturesBitmaskImpl() { if (!IsBackForwardCacheEnabled()) return 0; @@ -530,6 +538,25 @@ if (!IsAllowed(rfh->GetLastCommittedURL())) result.No(BackForwardCacheMetrics::NotRestoredReason::kDomainNotAllowed); + // TODO(crbug.com/1201653): Also implement a variant that checks for the + // existance of an `unload` handler. + if (IsOptInHeaderRequired()) { + const network::mojom::URLResponseHeadPtr& response_head = + rfh->last_response_head(); + if (!response_head) { + // For the cases without `response_head`, we should have already bailed + // out of BFCache for other reasons. + DCHECK(!result.CanStore()); + } else { + const network::mojom::ParsedHeadersPtr& headers = + response_head->parsed_headers; + if (!headers || !headers->bfcache_opt_in_unload) { + result.No(BackForwardCacheMetrics::NotRestoredReason:: + kOptInUnloadHeaderNotPresent); + } + } + } + CanStoreRenderFrameHostLater(&result, rfh); DVLOG(1) << "CanPotentiallyStorePageLater: " << rfh->GetLastCommittedURL()
diff --git a/content/browser/renderer_host/back_forward_cache_metrics.h b/content/browser/renderer_host/back_forward_cache_metrics.h index 4e9677e..04b1140 100644 --- a/content/browser/renderer_host/back_forward_cache_metrics.h +++ b/content/browser/renderer_host/back_forward_cache_metrics.h
@@ -100,7 +100,8 @@ kForegroundCacheLimit = 46, kBrowsingInstanceNotSwapped = 47, kBackForwardCacheDisabledForDelegate = 48, - kMaxValue = kBackForwardCacheDisabledForDelegate, + kOptInUnloadHeaderNotPresent = 49, + kMaxValue = kOptInUnloadHeaderNotPresent, }; using NotRestoredReasons =
diff --git a/content/browser/renderer_host/cross_origin_opener_policy_status.cc b/content/browser/renderer_host/cross_origin_opener_policy_status.cc index 2a42dd0e..15fceac4 100644 --- a/content/browser/renderer_host/cross_origin_opener_policy_status.cc +++ b/content/browser/renderer_host/cross_origin_opener_policy_status.cc
@@ -114,28 +114,33 @@ CrossOriginOpenerPolicyStatus::~CrossOriginOpenerPolicyStatus() = default; -base::Optional<network::mojom::BlockedByResponseReason> -CrossOriginOpenerPolicyStatus::EnforceCOOP( +network::CrossOriginOpenerPolicy& +CrossOriginOpenerPolicyStatus::RetrieveCOOPFromResponse( network::mojom::URLResponseHead* response_head, - const net::NetworkIsolationKey& network_isolation_key) { + const url::Origin& response_origin) { const GURL& response_url = navigation_request_->common_params().url; - const GURL& response_referrer_url = - navigation_request_->common_params().referrer->url; - - // TODO(https://crbug.com/1063518): Take sandbox into account. - url::Origin response_origin = url::Origin::Create(response_url); SanitizeCoopHeaders(response_url, response_origin, response_head); + network::mojom::ParsedHeaders* parsed_headers = response_head->parsed_headers.get(); - // Return early if the situation prevents COOP from operating. - if (!frame_tree_node_->IsMainFrame() || response_url.IsAboutBlank()) { + return parsed_headers->cross_origin_opener_policy; +} + +base::Optional<network::mojom::BlockedByResponseReason> +CrossOriginOpenerPolicyStatus::EnforceCOOP( + const network::CrossOriginOpenerPolicy& response_coop, + const url::Origin& response_origin, + const net::NetworkIsolationKey& network_isolation_key) { + // COOP only applies to top level browsing contexts. + if (!frame_tree_node_->IsMainFrame()) { return base::nullopt; } - network::CrossOriginOpenerPolicy& response_coop = - parsed_headers->cross_origin_opener_policy; + const GURL& response_url = navigation_request_->common_params().url; + const GURL& response_referrer_url = + navigation_request_->common_params().referrer->url; // Popups with a sandboxing flag, inherited from their opener, are not // allowed to navigate to a document with a Cross-Origin-Opener-Policy that @@ -146,6 +151,13 @@ network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone && (frame_tree_node_->pending_frame_policy().sandbox_flags != network::mojom::WebSandboxFlags::kNone)) { + // Blob and Filesystem documents' cross-origin-opener-policy values are + // defaulted to the default unsafe-none. + // Data documents can only be loaded on main documents through browser + // initiated navigations. These never inherit sandbox flags. + DCHECK(!response_url.SchemeIsBlob()); + DCHECK(!response_url.SchemeIsFileSystem()); + DCHECK(!response_url.SchemeIs(url::kDataScheme)); return network::mojom::BlockedByResponseReason:: kCoopSandboxedIFrameCannotNavigateToCoopPage; }
diff --git a/content/browser/renderer_host/cross_origin_opener_policy_status.h b/content/browser/renderer_host/cross_origin_opener_policy_status.h index 6c3c199..0c10a15 100644 --- a/content/browser/renderer_host/cross_origin_opener_policy_status.h +++ b/content/browser/renderer_host/cross_origin_opener_policy_status.h
@@ -29,10 +29,18 @@ explicit CrossOriginOpenerPolicyStatus(NavigationRequest* navigation_request); ~CrossOriginOpenerPolicyStatus(); - // Called after receiving a network response. Returns a BlockedByResponse - // reason if the navigation should be blocked, nullopt otherwise. - base::Optional<network::mojom::BlockedByResponseReason> EnforceCOOP( + // Called after receiving a network response. Returns the + // Cross-Origin-Opener-Policy contained in the response. + network::CrossOriginOpenerPolicy& RetrieveCOOPFromResponse( network::mojom::URLResponseHead* response_head, + const url::Origin& response_origin); + + // Called when receiving a redirect or the final response. Returns a + // BlockedByResponse reason if the navigation should be blocked, nullopt + // otherwise. + base::Optional<network::mojom::BlockedByResponseReason> EnforceCOOP( + const network::CrossOriginOpenerPolicy& response_coop, + const url::Origin& response_origin, const net::NetworkIsolationKey& network_isolation_key); // Set to true whenever the Cross-Origin-Opener-Policy spec requires a
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc index 8954795..983d2d0 100644 --- a/content/browser/renderer_host/frame_tree.cc +++ b/content/browser/renderer_host/frame_tree.cc
@@ -12,9 +12,9 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "base/trace_event/optional_trace_event.h" #include "base/unguessable_token.h" #include "content/browser/renderer_host/frame_tree_node.h"
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc index 6812d1f5..27512eb 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.cc +++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -39,8 +39,7 @@ const int kIdScreenReaderHoneyPot = 1; // static -LegacyRenderWidgetHostHWND* LegacyRenderWidgetHostHWND::Create( - HWND parent) { +LegacyRenderWidgetHostHWND* LegacyRenderWidgetHostHWND::Create(HWND parent) { // content_unittests passes in the desktop window as the parent. We allow // the LegacyRenderWidgetHostHWND instance to be created in this case for // these tests to pass. @@ -50,14 +49,10 @@ return nullptr; LegacyRenderWidgetHostHWND* legacy_window_instance = - new LegacyRenderWidgetHostHWND(parent); - // If we failed to create the child, or if the switch to disable the legacy - // window is passed in, then return NULL. - if (!::IsWindow(legacy_window_instance->hwnd())) { - delete legacy_window_instance; - return NULL; - } - legacy_window_instance->Init(); + new LegacyRenderWidgetHostHWND(); + if (!legacy_window_instance->InitOrDeleteSelf(parent)) + return nullptr; + return legacy_window_instance; } @@ -123,25 +118,42 @@ delete this; } -LegacyRenderWidgetHostHWND::LegacyRenderWidgetHostHWND(HWND parent) +LegacyRenderWidgetHostHWND::LegacyRenderWidgetHostHWND() : mouse_tracking_enabled_(false), host_(nullptr), - did_return_uia_object_(false) { - RECT rect = {0}; - Base::Create(parent, rect, L"Chrome Legacy Window", - WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, - WS_EX_TRANSPARENT); - // We create a system caret regardless of accessibility mode since not all - // assistive software that makes use of a caret is classified as a screen - // reader, e.g. the built-in Windows Magnifier. - ax_system_caret_ = std::make_unique<ui::AXSystemCaretWin>(hwnd()); -} + did_return_uia_object_(false) {} LegacyRenderWidgetHostHWND::~LegacyRenderWidgetHostHWND() { DCHECK(!::IsWindow(hwnd())); } -void LegacyRenderWidgetHostHWND::Init() { +bool LegacyRenderWidgetHostHWND::InitOrDeleteSelf(HWND parent) { + // Need to use weak_ptr to guard against `this` from being deleted by + // Base::Create(), which used to be called in the constructor and caused + // heap-use-after-free crash (https://crbug.com/1194694). + auto weak_ptr = weak_factory_.GetWeakPtr(); + RECT rect = {0}; + Base::Create(parent, rect, L"Chrome Legacy Window", + WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + WS_EX_TRANSPARENT); + if (!weak_ptr) { + // Base::Create() runs nested windows message loops that could end up + // deleting `this`. Therefore, upon returning false here, `this` is already + // deleted. + return false; + } + + // We create a system caret regardless of accessibility mode since not all + // assistive software that makes use of a caret is classified as a screen + // reader, e.g. the built-in Windows Magnifier. + ax_system_caret_ = std::make_unique<ui::AXSystemCaretWin>(hwnd()); + + // If we failed to create the child, then return false. + if (!::IsWindow(hwnd())) { + delete this; + return false; + } + // Only register a touch window if we are using WM_TOUCH. if (!features::IsUsingWMPointerForTouch()) RegisterTouchWindow(hwnd(), TWF_WANTPALM); @@ -174,6 +186,8 @@ // Disable pen flicks (http://crbug.com/506977) base::win::DisableFlicks(hwnd()); + + return true; } // static
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.h b/content/browser/renderer_host/legacy_render_widget_host_win.h index d43dddd..026e8b9 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.h +++ b/content/browser/renderer_host/legacy_render_widget_host_win.h
@@ -16,6 +16,7 @@ #include <memory> #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "content/common/content_export.h" #include "ui/accessibility/platform/ax_fragment_root_delegate_win.h" #include "ui/gfx/geometry/rect.h" @@ -138,10 +139,11 @@ friend class AccessibilityObjectLifetimeWinBrowserTest; friend class DirectManipulationBrowserTestBase; - explicit LegacyRenderWidgetHostHWND(HWND parent); + LegacyRenderWidgetHostHWND(); ~LegacyRenderWidgetHostHWND() override; - void Init(); + // If initialization fails, deletes `this` and returns false. + bool InitOrDeleteSelf(HWND parent); // Returns the target to which the windows input events are forwarded. static ui::WindowEventTarget* GetWindowEventTarget(HWND parent); @@ -200,6 +202,8 @@ // in Chrome on Windows 10. std::unique_ptr<DirectManipulationHelper> direct_manipulation_helper_; + base::WeakPtrFactory<LegacyRenderWidgetHostHWND> weak_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(LegacyRenderWidgetHostHWND); };
diff --git a/content/browser/renderer_host/mixed_content_navigation_throttle.cc b/content/browser/renderer_host/mixed_content_navigation_throttle.cc index d590d280..ed7a339 100644 --- a/content/browser/renderer_host/mixed_content_navigation_throttle.cc +++ b/content/browser/renderer_host/mixed_content_navigation_throttle.cc
@@ -6,9 +6,9 @@ #include <vector> +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "content/browser/renderer_host/frame_tree.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/navigation_request.h"
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 445bb94..ab66515 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -1599,6 +1599,16 @@ if (IsSameDocument()) { render_frame_host_ = frame_tree_node_->current_frame_host(); } else { + // Enforce cross-origin-opener-policy for about:blank, about:srcdoc and + // MHTML iframe, before selecting the RenderFrameHost. + const url::Origin origin = GetOriginForURLLoaderFactoryUnchecked(this); + const base::Optional<network::mojom::BlockedByResponseReason> + coop_requires_blocking = coop_status_.EnforceCOOP( + policy_container_navigation_bundle_->FinalPolicies() + .cross_origin_opener_policy, + origin, net::NetworkIsolationKey(origin, origin)); + DCHECK(!coop_requires_blocking); + // Select an appropriate RenderFrameHost. std::string frame_host_choice_reason; render_frame_host_ = @@ -2189,12 +2199,11 @@ return; } - // TODO(clamy): When we are able to compute the origin of a response in the - // browser process, we should use the computed origin instead of extracting it - // from the response URL. + const url::Origin origin = GetOriginForURLLoaderFactoryUnchecked(this); const base::Optional<network::mojom::BlockedByResponseReason> - coop_requires_blocking = - coop_status_.EnforceCOOP(response_head_.get(), network_isolation_key); + coop_requires_blocking = coop_status_.EnforceCOOP( + coop_status_.RetrieveCOOPFromResponse(response_head_.get(), origin), + origin, network_isolation_key); if (coop_requires_blocking) { OnRequestFailedInternal( network::URLLoaderCompletionStatus(*coop_requires_blocking), @@ -2675,6 +2684,30 @@ return; } + { + const url::Origin origin = GetOriginForURLLoaderFactoryUnchecked(this); + // TODO(pmeuleman) Move the enforcement of COOP to after + // ComputePoliciesToCommit and use the origin from + // GetOriginForURLLoaderFactory. + const base::Optional<network::mojom::BlockedByResponseReason> + coop_requires_blocking = coop_status_.EnforceCOOP( + coop_status_.RetrieveCOOPFromResponse(response_head_.get(), origin), + origin, network_isolation_key); + policy_container_navigation_bundle_->SetCrossOriginOpenerPolicy( + coop_status_.current_coop()); + if (coop_requires_blocking) { + // TODO(https://crbug.com/1172169): Investigate what must be done in case + // of a download. + OnRequestFailedInternal( + network::URLLoaderCompletionStatus(*coop_requires_blocking), + false /* skip_throttles */, base::nullopt /* error_page_content */, + false /* collapse_frame */); + // DO NOT ADD CODE after this. The previous call to + // OnRequestFailedInternal has destroyed the NavigationRequest. + return; + } + } + ComputePoliciesToCommit(); // The navigation may have encountered a header that requests isolation for @@ -2769,24 +2802,6 @@ return; } - // TODO(clamy): When we are able to compute the origin of a response in the - // browser process, we should use the computed origin instead of extracting it - // from the response URL. - const base::Optional<network::mojom::BlockedByResponseReason> - coop_requires_blocking = - coop_status_.EnforceCOOP(response_head_.get(), network_isolation_key); - if (coop_requires_blocking) { - // TODO(https://crbug.com/1172169): Investigate what must be done in case of - // a download. - OnRequestFailedInternal( - network::URLLoaderCompletionStatus(*coop_requires_blocking), - false /* skip_throttles */, base::nullopt /* error_page_content */, - false /* collapse_frame */); - // DO NOT ADD CODE after this. The previous call to - // OnRequestFailedInternal has destroyed the NavigationRequest. - return; - } - const base::Optional<network::mojom::BlockedByResponseReason> coep_requires_blocking = EnforceCOEP(); if (coep_requires_blocking) {
diff --git a/content/browser/renderer_host/policy_container_host.cc b/content/browser/renderer_host/policy_container_host.cc index f0a1b82..fcf8f21 100644 --- a/content/browser/renderer_host/policy_container_host.cc +++ b/content/browser/renderer_host/policy_container_host.cc
@@ -44,7 +44,8 @@ std::equal(lhs.content_security_policies.begin(), lhs.content_security_policies.end(), rhs.content_security_policies.begin(), - rhs.content_security_policies.end()); + rhs.content_security_policies.end()) && + lhs.cross_origin_opener_policy == rhs.cross_origin_opener_policy; } bool operator!=(const PolicyContainerPolicies& lhs, @@ -59,15 +60,30 @@ << ", is_web_secure_context: " << policies.is_web_secure_context << ", content_security_policies: "; - if (policies.content_security_policies.empty()) - return out << "[] }"; - - out << "[ "; - auto it = policies.content_security_policies.begin(); - for (; it + 1 != policies.content_security_policies.end(); ++it) { - out << (*it)->header->header_value << ", "; + if (policies.content_security_policies.empty()) { + out << "[]"; + } else { + out << "[ "; + auto it = policies.content_security_policies.begin(); + for (; it + 1 != policies.content_security_policies.end(); ++it) { + out << (*it)->header->header_value << ", "; + } + out << (*it)->header->header_value << " ]"; } - return out << (*it)->header->header_value << " ] }"; + + out << ", cross_origin_opener_policy: " + << "{ value: " << policies.cross_origin_opener_policy.value + << ", reporting_endpoint: " + << policies.cross_origin_opener_policy.reporting_endpoint.value_or( + "<null>") + << ", report_only_value: " + << policies.cross_origin_opener_policy.report_only_value + << ", report_only_reporting_endpoint: " + << policies.cross_origin_opener_policy.report_only_reporting_endpoint + .value_or("<null>") + << " }"; + + return out << " }"; } PolicyContainerPolicies::PolicyContainerPolicies() = default; @@ -77,11 +93,13 @@ network::mojom::IPAddressSpace ip_address_space, bool is_web_secure_context, std::vector<network::mojom::ContentSecurityPolicyPtr> - content_security_policies) + content_security_policies, + const network::CrossOriginOpenerPolicy& cross_origin_opener_policy) : referrer_policy(referrer_policy), ip_address_space(ip_address_space), is_web_secure_context(is_web_secure_context), - content_security_policies(std::move(content_security_policies)) {} + content_security_policies(std::move(content_security_policies)), + cross_origin_opener_policy(cross_origin_opener_policy) {} PolicyContainerPolicies::~PolicyContainerPolicies() = default; @@ -89,7 +107,7 @@ const { return std::make_unique<PolicyContainerPolicies>( referrer_policy, ip_address_space, is_web_secure_context, - mojo::Clone(content_security_policies)); + mojo::Clone(content_security_policies), cross_origin_opener_policy); } void PolicyContainerPolicies::AddContentSecurityPolicies(
diff --git a/content/browser/renderer_host/policy_container_host.h b/content/browser/renderer_host/policy_container_host.h index 1f768141..a75862b 100644 --- a/content/browser/renderer_host/policy_container_host.h +++ b/content/browser/renderer_host/policy_container_host.h
@@ -11,6 +11,7 @@ #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "mojo/public/cpp/bindings/unique_receiver_set.h" +#include "services/network/public/cpp/cross_origin_opener_policy.h" #include "services/network/public/mojom/content_security_policy.mojom-forward.h" #include "services/network/public/mojom/ip_address_space.mojom-shared.h" #include "services/network/public/mojom/referrer_policy.mojom-shared.h" @@ -22,11 +23,13 @@ // The contents of a PolicyContainerHost. struct CONTENT_EXPORT PolicyContainerPolicies { PolicyContainerPolicies(); - PolicyContainerPolicies(network::mojom::ReferrerPolicy referrer_policy, - network::mojom::IPAddressSpace ip_address_space, - bool is_web_secure_context, - std::vector<network::mojom::ContentSecurityPolicyPtr> - content_security_policies); + PolicyContainerPolicies( + network::mojom::ReferrerPolicy referrer_policy, + network::mojom::IPAddressSpace ip_address_space, + bool is_web_secure_context, + std::vector<network::mojom::ContentSecurityPolicyPtr> + content_security_policies, + const network::CrossOriginOpenerPolicy& cross_origin_opener_policy); PolicyContainerPolicies(const PolicyContainerPolicies&) = delete; PolicyContainerPolicies operator=(const PolicyContainerPolicies&) = delete; ~PolicyContainerPolicies(); @@ -64,6 +67,11 @@ // The content security policies of the associated document. std::vector<network::mojom::ContentSecurityPolicyPtr> content_security_policies; + + // The cross-origin-opener-policy (COOP) of the document + // See: + // https://html.spec.whatwg.org/multipage/origin.html#cross-origin-opener-policies + network::CrossOriginOpenerPolicy cross_origin_opener_policy; }; // PolicyContainerPolicies structs are comparable for equality. @@ -137,10 +145,19 @@ return policies_->ip_address_space; } + network::CrossOriginOpenerPolicy cross_origin_opener_policy() const { + return policies_->cross_origin_opener_policy; + } + void AddContentSecurityPolicies( std::vector<network::mojom::ContentSecurityPolicyPtr> content_security_policies) final; + void set_cross_origin_opener_policy( + const network::CrossOriginOpenerPolicy& policy) { + policies_->cross_origin_opener_policy = policy; + } + // Return a PolicyContainer containing copies of the policies and a pending // mojo remote that can be used to update policies in this object. If called a // second time, it resets the receiver and creates a new PolicyContainer,
diff --git a/content/browser/renderer_host/policy_container_host_unittest.cc b/content/browser/renderer_host/policy_container_host_unittest.cc index 5ac294ab..cc4fe7a 100644 --- a/content/browser/renderer_host/policy_container_host_unittest.cc +++ b/content/browser/renderer_host/policy_container_host_unittest.cc
@@ -26,6 +26,7 @@ bool is_web_secure_context; std::vector<network::mojom::ContentSecurityPolicyPtr> content_security_policies; + network::CrossOriginOpenerPolicy cross_origin_opener_policy; }; } // namespace @@ -47,11 +48,17 @@ auto csp = network::mojom::ContentSecurityPolicy::New(); csp->treat_as_public_address = true; csps.push_back(std::move(csp)); + network::CrossOriginOpenerPolicy coop; + coop.value = network::mojom::CrossOriginOpenerPolicyValue::kSameOrigin; + coop.report_only_value = + network::mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups; + coop.reporting_endpoint = "endpoint 1"; + coop.report_only_reporting_endpoint = "endpoint 2"; auto policies = std::make_unique<PolicyContainerPolicies>( network::mojom::ReferrerPolicy::kAlways, network::mojom::IPAddressSpace::kUnknown, - /*is_web_secure_context=*/true, std::move(csps)); + /*is_web_secure_context=*/true, std::move(csps), coop); EXPECT_THAT(policies->Clone(), Pointee(Eq(ByRef(*policies)))); }
diff --git a/content/browser/renderer_host/policy_container_navigation_bundle.cc b/content/browser/renderer_host/policy_container_navigation_bundle.cc index d17191ac..9713a7a5 100644 --- a/content/browser/renderer_host/policy_container_navigation_bundle.cc +++ b/content/browser/renderer_host/policy_container_navigation_bundle.cc
@@ -128,6 +128,13 @@ delivered_policies_->AddContentSecurityPolicies(std::move(policies)); } +void PolicyContainerNavigationBundle::SetCrossOriginOpenerPolicy( + network::CrossOriginOpenerPolicy coop) { + DCHECK(!HasComputedPolicies()); + + delivered_policies_->cross_origin_opener_policy = coop; +} + const PolicyContainerPolicies& PolicyContainerNavigationBundle::DeliveredPoliciesForTesting() const { DCHECK(!HasComputedPolicies()); @@ -153,6 +160,15 @@ // crbug.com/1180140. policies->ip_address_space = delivered_policies_->ip_address_space; + // TODO(https://crbug.com/1153648) This keeps the existing behavior which is + // to keep the last value stored in cross_origin_opener_policy_status for the + // error page. This will be the previous document COOP value or the last + // redirect. This should be changed to a default value to be decided, for that + // this will need to be executed before determining the render frame host to + // use for the error. + policies->cross_origin_opener_policy = + delivered_policies_->cross_origin_opener_policy; + SetFinalPolicies(std::move(policies)); DCHECK(HasComputedPolicies()); @@ -173,6 +189,7 @@ std::unique_ptr<PolicyContainerPolicies> PolicyContainerNavigationBundle::IncorporateDeliveredPolicies( + const GURL& url, std::unique_ptr<PolicyContainerPolicies> policies) { // Delivered content security policies must be appended. policies->AddContentSecurityPolicies( @@ -184,6 +201,14 @@ policies->ip_address_space = delivered_policies_->ip_address_space; } + // Ignore inheritance of COOP for blobs or filesystem schemes as this + // conflicts with COEP. + // TODO(https://crbug.com/1057296) properly implement inheritance for blobs + if (url.SchemeIs(url::kBlobScheme) || url.SchemeIs(url::kFileSystemScheme)) { + policies->cross_origin_opener_policy = + delivered_policies_->cross_origin_opener_policy; + } + return policies; } @@ -220,7 +245,7 @@ if (history_policies_) return history_policies_->Clone(); - return IncorporateDeliveredPolicies(ComputeInheritedPolicies(url)); + return IncorporateDeliveredPolicies(url, ComputeInheritedPolicies(url)); } void PolicyContainerNavigationBundle::ComputePolicies(const GURL& url) {
diff --git a/content/browser/renderer_host/policy_container_navigation_bundle.h b/content/browser/renderer_host/policy_container_navigation_bundle.h index 327f86b..188493dc 100644 --- a/content/browser/renderer_host/policy_container_navigation_bundle.h +++ b/content/browser/renderer_host/policy_container_navigation_bundle.h
@@ -79,6 +79,11 @@ // if the entry had no policies. const PolicyContainerPolicies* HistoryPolicies() const; + // Sets the cross origin opener policy of the new document. + // + // This must be called before |ComputePolicies()|. + void SetCrossOriginOpenerPolicy(network::CrossOriginOpenerPolicy coop); + // Sets the IP address space of the delivered policies of the new document. // // This must be called before |ComputePolicies()|. @@ -163,6 +168,7 @@ // Helper for `FinalizePolicies()`. Appends the delivered Content Security // Policies to `policies` and returns them. std::unique_ptr<PolicyContainerPolicies> IncorporateDeliveredPolicies( + const GURL& url, std::unique_ptr<PolicyContainerPolicies> policies); // Helper for `FinalizePolicies()`. Returns, depending on `url`, the policies
diff --git a/content/browser/renderer_host/policy_container_navigation_bundle_unittest.cc b/content/browser/renderer_host/policy_container_navigation_bundle_unittest.cc index b60721b..281d5ff 100644 --- a/content/browser/renderer_host/policy_container_navigation_bundle_unittest.cc +++ b/content/browser/renderer_host/policy_container_navigation_bundle_unittest.cc
@@ -45,7 +45,8 @@ return std::make_unique<PolicyContainerPolicies>( network::mojom::ReferrerPolicy::kAlways, network::mojom::IPAddressSpace::kPublic, - /*is_web_secure_context=*/true, std::move(csp_list)); + /*is_web_secure_context=*/true, std::move(csp_list), + network::CrossOriginOpenerPolicy()); } // Shorthand. @@ -114,6 +115,26 @@ EXPECT_EQ(bundle.DeliveredPoliciesForTesting(), expected_policies); } +// Verifies that SetCrossOriginOpenerPolicy sets the cross-origin-opener-policy +// in the bundle's delivered policies. +TEST_F(PolicyContainerNavigationBundleTest, SetCrossOriginOpenerPolicy) { + PolicyContainerNavigationBundle bundle(nullptr, nullptr, nullptr); + + network::CrossOriginOpenerPolicy coop; + coop.value = network::mojom::CrossOriginOpenerPolicyValue::kSameOrigin; + coop.report_only_value = + network::mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups; + coop.reporting_endpoint = "A"; + coop.report_only_reporting_endpoint = "B"; + + bundle.SetCrossOriginOpenerPolicy(coop); + + PolicyContainerPolicies expected_policies; + expected_policies.cross_origin_opener_policy = coop; + + EXPECT_EQ(bundle.DeliveredPoliciesForTesting(), expected_policies); +} + // Verifies that the default final policies of a bundle are default-constructed, // and are equal to the policies of the bundle's policy container host. TEST_F(PolicyContainerNavigationBundleTest, DefaultFinalPolicies) { @@ -272,6 +293,32 @@ EXPECT_EQ(bundle.FinalPolicies(), *initiator_policies); } +// Verifies that when the URL of the document to commit is `blob:.*`, the +// bundle's final policies are copied from the initiator, with the exception of +// cross-origin-opener-policy. +TEST_F(PolicyContainerNavigationBundleTest, FinalPoliciesBlobWithInitiator) { + std::unique_ptr<PolicyContainerPolicies> initiator_policies = + MakeTestPolicies(); + TestRenderFrameHost* initiator = contents()->GetMainFrame(); + initiator->SetPolicyContainerHost(NewHost(initiator_policies->Clone())); + + // Force implicit conversion from LocalFrameToken to UnguessableToken. + const blink::LocalFrameToken& token = initiator->GetFrameToken(); + PolicyContainerNavigationBundle bundle(nullptr, &token, nullptr); + + // Set a delivered cross-origin-opener-policy. + network::CrossOriginOpenerPolicy coop; + coop.value = network::mojom::CrossOriginOpenerPolicyValue::kSameOrigin; + bundle.SetCrossOriginOpenerPolicy(coop); + + bundle.ComputePolicies( + GURL("blob:https://example.com/016ece86-b7f9-4b07-88c2-a0e36b7f1dd6")); + + initiator_policies->cross_origin_opener_policy = coop; + + EXPECT_EQ(bundle.FinalPolicies(), *initiator_policies); +} + // Verifies that when the URL of the document to commit is `about:blank`, the // bundle's final policies are copied from the initiator, and additional // delivered policies are merged.
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 003477c..46ca65a 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -5630,7 +5630,6 @@ dom_storage_context, params->session_storage_namespace_id); } - network::CrossOriginOpenerPolicy popup_coop; network::CrossOriginEmbedderPolicy popup_coep; // On popup creation, if the opener and the openers's top-level document // are same origin, then the popup's initial empty document inherits its @@ -5638,10 +5637,8 @@ // https://gist.github.com/annevk/6f2dd8c79c77123f39797f6bdac43f3e#model RenderFrameHostImpl* top_level_opener = GetMainFrame(); // Verify that they are same origin. - if (top_level_opener->GetLastCommittedOrigin().IsSameOriginWith( + if (!top_level_opener->GetLastCommittedOrigin().IsSameOriginWith( GetLastCommittedOrigin())) { - popup_coop = top_level_opener->cross_origin_opener_policy(); - } else { // The documents are cross origin, leave COOP of the popup to the default // unsafe-none. switch (top_level_opener->cross_origin_opener_policy().value) { @@ -5716,8 +5713,8 @@ // because the flags should be already inherited by the CreateNewWindow call // above. main_frame->SetOriginDependentStateOfNewFrame(GetLastCommittedOrigin()); - main_frame->cross_origin_opener_policy_ = popup_coop; main_frame->cross_origin_embedder_policy_ = popup_coep; + main_frame->virtual_browsing_context_group_ = popup_virtual_browsing_context_group; @@ -5728,7 +5725,7 @@ main_frame->set_coop_reporter( std::make_unique<CrossOriginOpenerPolicyReporter>( GetProcess()->GetStoragePartition(), GetLastCommittedURL(), - params->referrer->url, popup_coop, + params->referrer->url, main_frame->cross_origin_opener_policy(), isolation_info_.network_isolation_key())); } @@ -9387,6 +9384,30 @@ TakeNewDocumentPropertiesFromNavigation(navigation_request); + // Set embedded documents' cross-origin-opener-policy from their top level: + // - Use top level's policy if they are same-origin. + // - Use the default policy if they are cross-origin. + // This COOP value is not used to enforce anything on this frame, but will be + // inherited to every local-scheme document created from them. + // It will also be inherited by the initial empty document from its opener. + + // TODO(https://crbug.com/888079) Computing and assigning the + // cross-origin-opener-policy of an embedded frame should be done in + // |NavigationRequest::ComputePoliciesToCommit| , but this is not currently + // possible because we need the origin for the computation. The linked bug + // moves the origin computation earlier in the navigation request, which will + // enable the move to |NavigationRequest::ComputePoliciesToCommit|. + if (parent_) { + if (GetMainFrame()->GetLastCommittedOrigin().IsSameOriginWith( + params.origin)) { + policy_container_host_->set_cross_origin_opener_policy( + GetMainFrame()->cross_origin_opener_policy()); + } else { + policy_container_host_->set_cross_origin_opener_policy( + network::CrossOriginOpenerPolicy()); + } + } + CrossOriginOpenerPolicyReporter::InstallAccessMonitorsIfNeeded( frame_tree_node_); @@ -9406,9 +9427,6 @@ last_base_url_ = navigation_request->common_params().base_url_for_data_url; - cross_origin_opener_policy_ = - navigation_request->coop_status().current_coop(); - coop_reporter_ = navigation_request->coop_status().TakeCoopReporter(); virtual_browsing_context_group_ = navigation_request->coop_status().virtual_browsing_context_group();
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 402df7e..9630c707 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -1639,12 +1639,9 @@ // Semi-formal definition of COOP: // https://gist.github.com/annevk/6f2dd8c79c77123f39797f6bdac43f3e network::CrossOriginOpenerPolicy cross_origin_opener_policy() const { - return cross_origin_opener_policy_; + return policy_container_host_->cross_origin_opener_policy(); } - void set_cross_origin_opener_policy_for_testing( - const network::CrossOriginOpenerPolicy& cross_origin_opener_policy) { - cross_origin_opener_policy_ = cross_origin_opener_policy; - } + CrossOriginOpenerPolicyReporter* coop_reporter() { return coop_reporter_.get(); } @@ -2962,8 +2959,6 @@ network::CrossOriginEmbedderPolicy cross_origin_embedder_policy_; - network::CrossOriginOpenerPolicy cross_origin_opener_policy_; - // Track the SiteInfo of the last site we committed successfully, as obtained // from SiteInstanceImpl::GetSiteInfoForURL(). SiteInfo last_committed_site_info_;
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index 3eac2b38..f2ccdb0 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -15,11 +15,11 @@ #include "base/check_op.h" #include "base/command_line.h" #include "base/containers/adapters.h" +#include "base/containers/contains.h" #include "base/debug/crash_logging.h" #include "base/debug/dump_without_crashing.h" #include "base/memory/ptr_util.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/trace_event/base_tracing.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h"
diff --git a/content/browser/renderer_host/render_frame_host_manager_unittest.cc b/content/browser/renderer_host/render_frame_host_manager_unittest.cc index 98b2677..b87449b 100644 --- a/content/browser/renderer_host/render_frame_host_manager_unittest.cc +++ b/content/browser/renderer_host/render_frame_host_manager_unittest.cc
@@ -424,6 +424,9 @@ TestRenderFrameHost* frame_host = static_cast<TestRenderFrameHost*>( manager->GetFrameHostForNavigation(navigation_request.get())); CHECK(frame_host); + + frame_host->SetPolicyContainerHost( + base::MakeRefCounted<PolicyContainerHost>()); return frame_host; }
diff --git a/content/browser/service_worker/service_worker_identifiability_metrics.cc b/content/browser/service_worker/service_worker_identifiability_metrics.cc index 8a5c3be..3b760723 100644 --- a/content/browser/service_worker/service_worker_identifiability_metrics.cc +++ b/content/browser/service_worker/service_worker_identifiability_metrics.cc
@@ -4,7 +4,7 @@ #include "content/browser/service_worker/service_worker_identifiability_metrics.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "content/public/browser/worker_type.h" #include "services/metrics/public/cpp/delegating_ukm_recorder.h" #include "services/metrics/public/cpp/ukm_builders.h" @@ -116,4 +116,4 @@ } } -} // namespace content \ No newline at end of file +} // namespace content
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc b/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc index b9b4ec5..fcc61e5 100644 --- a/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc +++ b/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
@@ -6,9 +6,9 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/optional.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/task/post_task.h" #include "base/test/metrics/histogram_tester.h" #include "content/browser/service_worker/embedded_worker_test_helper.h"
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc index bd1ec6c..9cc7f4d 100644 --- a/content/browser/service_worker/service_worker_registry.cc +++ b/content/browser/service_worker/service_worker_registry.cc
@@ -7,10 +7,10 @@ #include "content/browser/service_worker/service_worker_registry.h" +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" #include "base/trace_event/trace_event.h" #include "components/services/storage/public/mojom/storage_policy_update.mojom.h" #include "content/browser/service_worker/service_worker_context_core.h"
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 48dacdc..0eea147 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -14,6 +14,7 @@ #include "base/callback_helpers.h" #include "base/check.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/debug/dump_without_crashing.h" #include "base/guid.h" #include "base/location.h" @@ -21,7 +22,6 @@ #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index 66cc0f6..cf5ab229 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -8,10 +8,10 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/json/json_reader.h" #include "base/memory/scoped_refptr.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/task/post_task.h" #include "base/test/bind.h"
diff --git a/content/browser/snapshot_browsertest.cc b/content/browser/snapshot_browsertest.cc index 8bb707d9..068ee65 100644 --- a/content/browser/snapshot_browsertest.cc +++ b/content/browser/snapshot_browsertest.cc
@@ -10,9 +10,9 @@ #include "base/bind.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/rand_util.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h"
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index eaec6a41..31552d9 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/files/file_util.h" #include "base/macros.h" @@ -17,7 +18,6 @@ #include "base/optional.h" #include "base/path_service.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/strings/pattern.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h"
diff --git a/content/browser/webauth/authenticator_environment_impl.cc b/content/browser/webauth/authenticator_environment_impl.cc index a3175abe2..5bf6467 100644 --- a/content/browser/webauth/authenticator_environment_impl.cc +++ b/content/browser/webauth/authenticator_environment_impl.cc
@@ -8,7 +8,7 @@ #include <utility> #include "base/command_line.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "content/browser/webauth/virtual_authenticator.h" #include "content/browser/webauth/virtual_discovery.h" #include "content/browser/webauth/virtual_fido_discovery_factory.h"
diff --git a/content/browser/webrtc/resources/webrtc_internals.css b/content/browser/webrtc/resources/webrtc_internals.css index 934a8ff..456ea89 100644 --- a/content/browser/webrtc/resources/webrtc_internals.css +++ b/content/browser/webrtc/resources/webrtc_internals.css
@@ -132,3 +132,7 @@ details[open] details summary { background-color: rgb(220, 220, 220); } + +.peerconnection-deprecations { + font-weight: bold; +}
diff --git a/content/browser/webrtc/resources/webrtc_internals.js b/content/browser/webrtc/resources/webrtc_internals.js index 86139fc..9415259 100644 --- a/content/browser/webrtc/resources/webrtc_internals.js +++ b/content/browser/webrtc/resources/webrtc_internals.js
@@ -327,6 +327,25 @@ } peerConnectionElement.appendChild(p); + // Show deprecation notices as a list. + // Note: data.rtcConfiguration is not in JSON format and may + // not be defined in tests. + if (data.rtcConfiguration) { + const deprecationNotices = document.createElement('ul'); + deprecationNotices.className = 'peerconnection-deprecations'; + if (data.rtcConfiguration.indexOf('extmapAllowMixed: false') !== -1) { + // Hard deprecation, setting "false" will no longer work. + appendChildWithText(deprecationNotices, 'li', + 'Note: The RTCPeerConnection offerAllowExtmapMixed ' + + 'option is a non-standard feature. This feature will be removed ' + + 'in M93 (Canary: July 15, 2021; Stable: August 24, 2021). For ' + + 'interoperability with legacy WebRTC versions that throw errors ' + + 'when attempting to parse the a=extmap-allow-mixed line in the ' + + 'SDP remove the line from the SDP during signalling.'); + } + peerConnectionElement.appendChild(deprecationNotices); + } + return peerConnectionElement; }
diff --git a/content/browser/webui/url_data_manager.cc b/content/browser/webui/url_data_manager.cc index c44e9b4..8d48c81 100644 --- a/content/browser/webui/url_data_manager.cc +++ b/content/browser/webui/url_data_manager.cc
@@ -11,9 +11,9 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/memory/ref_counted_memory.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h"
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc index 5bfb5b76..de4e07c7 100644 --- a/content/browser/webui/url_data_manager_backend.cc +++ b/content/browser/webui/url_data_manager_backend.cc
@@ -8,13 +8,13 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/location.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/memory/ref_counted_memory.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/task/post_task.h"
diff --git a/content/browser/xr/service/browser_xr_runtime_impl.cc b/content/browser/xr/service/browser_xr_runtime_impl.cc index 71dc7800..cf0ea0ef 100644 --- a/content/browser/xr/service/browser_xr_runtime_impl.cc +++ b/content/browser/xr/service/browser_xr_runtime_impl.cc
@@ -13,8 +13,8 @@ #endif #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/numerics/ranges.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "content/browser/xr/service/vr_service_impl.h" #include "content/browser/xr/xr_utils.h"
diff --git a/content/browser/xr/service/vr_service_impl.cc b/content/browser/xr/service/vr_service_impl.cc index 082e7d40..5cf17a5 100644 --- a/content/browser/xr/service/vr_service_impl.cc +++ b/content/browser/xr/service/vr_service_impl.cc
@@ -7,9 +7,9 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/trace_event/common/trace_event_common.h" #include "components/viz/common/surfaces/frame_sink_id.h" #include "content/browser/permissions/permission_controller_impl.h"
diff --git a/content/common/font_cache_dispatcher_win.cc b/content/common/font_cache_dispatcher_win.cc index d08ecf3..6182cd6 100644 --- a/content/common/font_cache_dispatcher_win.cc +++ b/content/common/font_cache_dispatcher_win.cc
@@ -10,10 +10,10 @@ #include <utility> #include <vector> +#include "base/containers/contains.h" #include "base/logging.h" #include "base/macros.h" #include "base/numerics/checked_math.h" -#include "base/stl_util.h" #include "base/thread_annotations.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
diff --git a/content/common/origin_util.cc b/content/common/origin_util.cc index 858e2275..dc5b501 100644 --- a/content/common/origin_util.cc +++ b/content/common/origin_util.cc
@@ -4,9 +4,9 @@ #include "content/public/common/origin_util.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/pattern.h" #include "content/common/url_schemes.h" #include "services/network/public/cpp/is_potentially_trustworthy.h"
diff --git a/content/common/state_transitions.h b/content/common/state_transitions.h index 3117898..b3bf0ff 100644 --- a/content/common/state_transitions.h +++ b/content/common/state_transitions.h
@@ -8,8 +8,8 @@ #include <vector> #include "base/check_op.h" +#include "base/containers/contains.h" #include "base/no_destructor.h" -#include "base/stl_util.h" namespace content {
diff --git a/content/public/browser/notification_registrar.cc b/content/public/browser/notification_registrar.cc index 01299028..6f9583e 100644 --- a/content/public/browser/notification_registrar.cc +++ b/content/public/browser/notification_registrar.cc
@@ -9,7 +9,7 @@ #include <algorithm> #include "base/check_op.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "content/browser/notification_service_impl.h" namespace content {
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index 04f0158..89c4c22 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc
@@ -14,12 +14,12 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/files/file_util.h" #include "base/guid.h" #include "base/json/json_reader.h" #include "base/process/kill.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/strings/pattern.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h"
diff --git a/content/public/test/download_test_observer.cc b/content/public/test/download_test_observer.cc index 1d80f97..ac12c176 100644 --- a/content/public/test/download_test_observer.cc +++ b/content/public/test/download_test_observer.cc
@@ -8,9 +8,9 @@ #include "base/bind.h" #include "base/check_op.h" +#include "base/containers/contains.h" #include "base/notreached.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "components/download/public/common/download_url_parameters.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h"
diff --git a/content/renderer/accessibility/ax_image_annotator.cc b/content/renderer/accessibility/ax_image_annotator.cc index 0d44a60..1375b70 100644 --- a/content/renderer/accessibility/ax_image_annotator.cc +++ b/content/renderer/accessibility/ax_image_annotator.cc
@@ -9,9 +9,9 @@ #include <vector> #include "base/base64.h" +#include "base/containers/contains.h" #include "base/i18n/char_iterator.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h"
diff --git a/content/renderer/accessibility/ax_image_stopwords.cc b/content/renderer/accessibility/ax_image_stopwords.cc index 26238b73..477c0ae 100644 --- a/content/renderer/accessibility/ax_image_stopwords.cc +++ b/content/renderer/accessibility/ax_image_stopwords.cc
@@ -5,11 +5,11 @@ #include <string> #include <vector> +#include "base/containers/contains.h" #include "base/containers/flat_set.h" #include "base/i18n/case_conversion.h" #include "base/i18n/char_iterator.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h"
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index d1744de..89e1980 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -10,8 +10,8 @@ #include <set> #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h"
diff --git a/content/renderer/worker/worker_thread_registry.cc b/content/renderer/worker/worker_thread_registry.cc index 800b3749..316d3c85f 100644 --- a/content/renderer/worker/worker_thread_registry.cc +++ b/content/renderer/worker/worker_thread_registry.cc
@@ -9,12 +9,12 @@ #include <utility> #include "base/check.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/location.h" #include "base/memory/ptr_util.h" #include "base/observer_list.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/threading/thread_local.h" #include "base/threading/thread_task_runner_handle.h" #include "content/public/renderer/worker_thread.h"
diff --git a/content/test/data/gpu/mediapipe_zip/mediapipe_chromium_tests.zip.sha1 b/content/test/data/gpu/mediapipe_zip/mediapipe_chromium_tests.zip.sha1 new file mode 100644 index 0000000..171b068 --- /dev/null +++ b/content/test/data/gpu/mediapipe_zip/mediapipe_chromium_tests.zip.sha1
@@ -0,0 +1 @@ +1d6ca505c384ef8f5af14e7958f62d54ec126356 \ No newline at end of file
diff --git a/content/test/gpu/gpu_tests/mediapipe_integration_test.py b/content/test/gpu/gpu_tests/mediapipe_integration_test.py new file mode 100644 index 0000000..590fae2 --- /dev/null +++ b/content/test/gpu/gpu_tests/mediapipe_integration_test.py
@@ -0,0 +1,66 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import sys + +from gpu_tests import common_browser_args as cba +from gpu_tests import gpu_integration_test +from gpu_tests import path_util + +# Tests will be stored individually in subdirectories underneath this base +# directory. +_DATA_PATH = os.path.join(path_util.GetChromiumSrcDir(), 'content', 'test', + 'data', 'gpu', 'mediapipe') + + +class MediaPipeIntegrationTest(gpu_integration_test.GpuIntegrationTest): + """Google MediaPipe Tests + + The tests are generated by MediaPipe's test_harness and placed into a + zip file that is stored on the cloud. See mediapipe_update.py. + + Iterate through the subdirectories under _DATA_PATH and runs each test + individually. + """ + + @classmethod + def Name(cls): + return 'mediapipe' + + @classmethod + def SetUpProcess(cls): + super(MediaPipeIntegrationTest, cls).SetUpProcess() + cls.CustomizeBrowserArgs([ + cba.FORCE_BROWSER_CRASH_ON_GPU_CRASH, + ]) + + cls.SetStaticServerDirs([_DATA_PATH]) + cls.StartBrowser() + + @classmethod + def GenerateGpuTests(cls, options): + for entry in next(os.walk(_DATA_PATH))[1]: + yield ('MediaPipe_mediapipe_%s' % entry, _get_test_html(entry), ()) + + def RunActualGpuTest(self, url, *_): + action_runner = self.tab.action_runner + action_runner.Navigate(self.UrlOfStaticFilePath(url)) + action_runner.WaitForJavaScriptCondition('window.runTest !== undefined') + action_runner.EvaluateJavaScript('window.runTest()') + action_runner.WaitForJavaScriptCondition('window.isTestComplete()', + timeout=60) + errors = action_runner.EvaluateJavaScript('window.getErrors()') + + if errors: + self.fail(errors) + + +def _get_test_html(entry): + return '%s/_CLICK_ME_TO_RUN_%s_LOCALLY.html' % (entry, entry) + + +def load_tests(loader, tests, pattern): + del loader, tests, pattern # Unused. + return gpu_integration_test.LoadAllTestsInModule(sys.modules[__name__])
diff --git a/content/test/gpu/gpu_tests/mediapipe_update.py b/content/test/gpu/gpu_tests/mediapipe_update.py new file mode 100644 index 0000000..3859ba21 --- /dev/null +++ b/content/test/gpu/gpu_tests/mediapipe_update.py
@@ -0,0 +1,61 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import shutil +import subprocess +import sys +import zipfile +import filecmp + + +def GetChromiumSrcDir(): + return os.path.abspath( + os.path.join(os.path.dirname(__file__), '..', '..', '..', '..')) + + +_TEST_ROOT = os.path.join(GetChromiumSrcDir(), 'content', 'test', 'data', 'gpu') + + +def main(): + sha1_src = os.path.join(_TEST_ROOT, 'mediapipe_zip', + 'mediapipe_chromium_tests.zip.sha1') + sha1_dest = os.path.join(_TEST_ROOT, 'mediapipe', + 'mediapipe_chromium_tests.zip.sha1') + + download_script = 'download_from_google_storage' + if os.name == 'nt': + download_script += '.bat' + + subprocess.check_call([ + download_script, '--no_resume', '--no_auth', '--bucket', + 'chromium-telemetry', '-s', sha1_src + ]) + + # Check the SHA1 of the downloaded ZIP with the one we recorded + # previously. If we can't find the recorded SHA1, treat it like + # it's new. + sha1_recorded = os.path.isfile(sha1_dest) + if not (sha1_recorded and filecmp.cmp(sha1_src, sha1_dest)): + data_path = os.path.join(_TEST_ROOT, 'mediapipe') + + # Remove the existing unzipped tree and recreate it. + if os.path.isdir(data_path): + shutil.rmtree(data_path) + os.mkdir(data_path) + zip_file_path = os.path.join(_TEST_ROOT, 'mediapipe_zip', + 'mediapipe_chromium_tests.zip') + zip_file = zipfile.ZipFile(zip_file_path) + zip_file.extractall(data_path) + zip_file.close() + + # Store the SHA1 we used so we can detect if a new version + # got synced. + shutil.copyfile(sha1_src, sha1_dest) + + return 0 + + +if __name__ == '__main__': + sys.exit(main())
diff --git a/content/test/gpu/unexpected_pass_finder.py b/content/test/gpu/unexpected_pass_finder.py index 33478f2..cc45c61 100755 --- a/content/test/gpu/unexpected_pass_finder.py +++ b/content/test/gpu/unexpected_pass_finder.py
@@ -82,6 +82,7 @@ 'gpu_process', 'info_collection', 'maps', + 'mediapipe', 'pixel', 'power', 'screenshot_sync',
diff --git a/content/test/mock_clipboard_host.cc b/content/test/mock_clipboard_host.cc index aff4409..a22c5df2 100644 --- a/content/test/mock_clipboard_host.cc +++ b/content/test/mock_clipboard_host.cc
@@ -4,7 +4,7 @@ #include "content/test/mock_clipboard_host.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/utf_string_conversions.h" namespace content {
diff --git a/content/web_test/browser/web_test_control_host.cc b/content/web_test/browser/web_test_control_host.cc index e731956..500c767 100644 --- a/content/web_test/browser/web_test_control_host.cc +++ b/content/web_test/browser/web_test_control_host.cc
@@ -22,12 +22,12 @@ #include "base/callback.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/location.h" #include "base/logging.h" #include "base/path_service.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h"
diff --git a/content/web_test/renderer/gc_controller.cc b/content/web_test/renderer/gc_controller.cc index d487ca7..2e5a7c0 100644 --- a/content/web_test/renderer/gc_controller.cc +++ b/content/web_test/renderer/gc_controller.cc
@@ -97,6 +97,8 @@ v8::Local<v8::Context> context = func->CreationContext(); v8::Context::Scope context_scope(context); v8::TryCatch try_catch(isolate); + v8::MicrotasksScope microtasks_scope( + isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); auto result = func->Call(context, context->Global(), 0, nullptr); // Swallow potential exception. ignore_result(result);
diff --git a/device/bluetooth/bluetooth_device_android.cc b/device/bluetooth/bluetooth_device_android.cc index 2fe1844..b0b5fc9 100644 --- a/device/bluetooth/bluetooth_device_android.cc +++ b/device/bluetooth/bluetooth_device_android.cc
@@ -6,7 +6,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "device/bluetooth/bluetooth_adapter_android.h" #include "device/bluetooth/bluetooth_remote_gatt_service_android.h" #include "device/bluetooth/jni_headers/ChromeBluetoothDevice_jni.h"
diff --git a/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc b/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc index 17e4aaa..e5ac46cf9 100644 --- a/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc +++ b/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc
@@ -9,8 +9,8 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/win/post_async_results.h" #include "components/device_event_log/device_event_log.h"
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_android.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_android.cc index fe92a2b..4fd63137 100644 --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_android.cc +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_android.cc
@@ -10,10 +10,10 @@ #include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "base/bind.h" +#include "base/containers/contains.h" #include "base/location.h" #include "base/logging.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/threading/thread_task_runner_handle.h" #include "device/bluetooth/bluetooth_adapter_android.h" #include "device/bluetooth/bluetooth_remote_gatt_descriptor_android.h"
diff --git a/device/bluetooth/bluetooth_remote_gatt_service_android.cc b/device/bluetooth/bluetooth_remote_gatt_service_android.cc index cbdfbdb..228adf4f 100644 --- a/device/bluetooth/bluetooth_remote_gatt_service_android.cc +++ b/device/bluetooth/bluetooth_remote_gatt_service_android.cc
@@ -8,7 +8,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "device/bluetooth/bluetooth_adapter_android.h" #include "device/bluetooth/bluetooth_device_android.h" #include "device/bluetooth/bluetooth_remote_gatt_characteristic_android.h"
diff --git a/device/bluetooth/bluetooth_remote_gatt_service_win.cc b/device/bluetooth/bluetooth_remote_gatt_service_win.cc index 8c22cf9..bd7ed79 100644 --- a/device/bluetooth/bluetooth_remote_gatt_service_win.cc +++ b/device/bluetooth/bluetooth_remote_gatt_service_win.cc
@@ -8,8 +8,8 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "device/bluetooth/bluetooth_adapter_win.h" #include "device/bluetooth/bluetooth_device_win.h" #include "device/bluetooth/bluetooth_remote_gatt_characteristic_win.h"
diff --git a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc index 1bf27d3..ee3d96f 100644 --- a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc +++ b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc
@@ -11,8 +11,8 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task/current_thread.h" #include "base/test/bind.h"
diff --git a/device/bluetooth/bluez/metrics_recorder.cc b/device/bluetooth/bluez/metrics_recorder.cc index b5f04010..96d7ca7 100644 --- a/device/bluetooth/bluez/metrics_recorder.cc +++ b/device/bluetooth/bluez/metrics_recorder.cc
@@ -4,8 +4,8 @@ #include "device/bluetooth/bluez/metrics_recorder.h" +#include "base/containers/contains.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" namespace bluetooth { namespace {
diff --git a/device/bluetooth/dbus/fake_bluetooth_device_client.cc b/device/bluetooth/dbus/fake_bluetooth_device_client.cc index 2824e57..75b44c8 100644 --- a/device/bluetooth/dbus/fake_bluetooth_device_client.cc +++ b/device/bluetooth/dbus/fake_bluetooth_device_client.cc
@@ -17,13 +17,13 @@ #include "base/base64.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/location.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/rand_util.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/task/post_task.h" #include "base/task/thread_pool.h"
diff --git a/device/fido/auth_token_requester_unittest.cc b/device/fido/auth_token_requester_unittest.cc index e06f348..4111ee2 100644 --- a/device/fido/auth_token_requester_unittest.cc +++ b/device/fido/auth_token_requester_unittest.cc
@@ -10,12 +10,12 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "base/containers/contains.h" #include "base/containers/span.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/optional.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "base/test/task_environment.h" #include "device/fido/fido_constants.h"
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc index ec5f1ff..ab80b78 100644 --- a/device/fido/device_response_converter.cc +++ b/device/fido/device_response_converter.cc
@@ -8,11 +8,11 @@ #include <string> #include <utility> +#include "base/containers/contains.h" #include "base/containers/span.h" #include "base/i18n/streaming_utf8_validator.h" #include "base/numerics/safe_conversions.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "components/cbor/diagnostic_writer.h"
diff --git a/device/fido/fido_device.cc b/device/fido/fido_device.cc index 2d3c9337..00158839 100644 --- a/device/fido/fido_device.cc +++ b/device/fido/fido_device.cc
@@ -7,7 +7,7 @@ #include <utility> #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "components/device_event_log/device_event_log.h" #include "device/fido/device_response_converter.h" #include "device/fido/fido_constants.h"
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc index 7939aa2..161c2b0 100644 --- a/device/fido/get_assertion_handler_unittest.cc +++ b/device/fido/get_assertion_handler_unittest.cc
@@ -7,7 +7,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/test/task_environment.h" #include "build/build_config.h" #include "device/bluetooth/bluetooth_adapter_factory.h"
diff --git a/device/fido/hid/fido_hid_device.cc b/device/fido/hid/fido_hid_device.cc index c4a7491..1beaf183 100644 --- a/device/fido/hid/fido_hid_device.cc +++ b/device/fido/hid/fido_hid_device.cc
@@ -10,9 +10,9 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/containers/fixed_flat_set.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h"
diff --git a/device/fido/hid/fido_hid_discovery.cc b/device/fido/hid/fido_hid_discovery.cc index cdd7ec5..817e460 100644 --- a/device/fido/hid/fido_hid_discovery.cc +++ b/device/fido/hid/fido_hid_discovery.cc
@@ -7,8 +7,8 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "components/device_event_log/device_event_log.h" #include "device/fido/hid/fido_hid_device.h"
diff --git a/device/fido/hid/fido_hid_packet.cc b/device/fido/hid/fido_hid_packet.cc index ddf9e4e..088d029 100644 --- a/device/fido/hid/fido_hid_packet.cc +++ b/device/fido/hid/fido_hid_packet.cc
@@ -7,9 +7,9 @@ #include <algorithm> #include <utility> +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" namespace device {
diff --git a/device/vr/android/arcore/arcore_plane_manager.cc b/device/vr/android/arcore/arcore_plane_manager.cc index 60b2fef..24ebe70 100644 --- a/device/vr/android/arcore/arcore_plane_manager.cc +++ b/device/vr/android/arcore/arcore_plane_manager.cc
@@ -4,7 +4,7 @@ #include "device/vr/android/arcore/arcore_plane_manager.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "device/vr/android/arcore/type_converters.h" namespace device {
diff --git a/extensions/browser/api/audio/audio_service_chromeos.cc b/extensions/browser/api/audio/audio_service_chromeos.cc index a6c3c8d..e4292b4 100644 --- a/extensions/browser/api/audio/audio_service_chromeos.cc +++ b/extensions/browser/api/audio/audio_service_chromeos.cc
@@ -10,9 +10,9 @@ #include "ash/components/audio/audio_device.h" #include "ash/components/audio/cras_audio_handler.h" #include "base/callback.h" +#include "base/containers/contains.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/api/audio/audio_device_id_calculator.h"
diff --git a/extensions/browser/api/bluetooth/bluetooth_event_router.cc b/extensions/browser/api/bluetooth/bluetooth_event_router.cc index df60f16a..779ffc1 100644 --- a/extensions/browser/api/bluetooth/bluetooth_event_router.cc +++ b/extensions/browser/api/bluetooth/bluetooth_event_router.cc
@@ -10,10 +10,10 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "components/device_event_log/device_event_log.h"
diff --git a/extensions/browser/api/declarative/deduping_factory.h b/extensions/browser/api/declarative/deduping_factory.h index 67c7033..3763c00 100644 --- a/extensions/browser/api/declarative/deduping_factory.h +++ b/extensions/browser/api/declarative/deduping_factory.h
@@ -14,9 +14,9 @@ #include "base/check.h" #include "base/compiler_specific.h" +#include "base/containers/contains.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/stl_util.h" namespace base { class Value;
diff --git a/extensions/browser/api/declarative/rules_registry.cc b/extensions/browser/api/declarative/rules_registry.cc index 3d1f0c3..0336ed5 100644 --- a/extensions/browser/api/declarative/rules_registry.cc +++ b/extensions/browser/api/declarative/rules_registry.cc
@@ -8,9 +8,9 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h"
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_condition.cc b/extensions/browser/api/declarative_webrequest/webrequest_condition.cc index 84690189..c3b1ec6 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_condition.cc +++ b/extensions/browser/api/declarative_webrequest/webrequest_condition.cc
@@ -5,7 +5,7 @@ #include "extensions/browser/api/declarative_webrequest/webrequest_condition.h" #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/stringprintf.h" #include "base/values.h" #include "components/url_matcher/url_matcher_factory.h"
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc index 07da743b..deded07c 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc +++ b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
@@ -10,11 +10,11 @@ #include <vector> #include "base/check.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/values.h" #include "extensions/browser/api/declarative/deduping_factory.h"
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc b/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc index 679ad22..8f5cbc8 100644 --- a/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc +++ b/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc
@@ -10,7 +10,7 @@ #include <utility> #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/api/declarative_webrequest/webrequest_condition.h" #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
diff --git a/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc b/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc index d883201..8c52c94 100644 --- a/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc +++ b/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc
@@ -12,13 +12,13 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/containers/contains.h" #include "base/containers/queue.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/task/post_task.h" #include "base/time/time.h" #include "base/values.h"
diff --git a/extensions/browser/api/management/management_api.cc b/extensions/browser/api/management/management_api.cc index cd19627..e9abff54 100644 --- a/extensions/browser/api/management/management_api.cc +++ b/extensions/browser/api/management/management_api.cc
@@ -10,13 +10,13 @@ #include <vector> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/json/json_writer.h" #include "base/lazy_instance.h" #include "base/location.h" #include "base/logging.h" #include "base/metrics/histogram.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/extensions/browser/api/socket/udp_socket.cc b/extensions/browser/api/socket/udp_socket.cc index 0f129a6..0f667bc 100644 --- a/extensions/browser/api/socket/udp_socket.cc +++ b/extensions/browser/api/socket/udp_socket.cc
@@ -8,8 +8,8 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" -#include "base/stl_util.h" #include "extensions/browser/api/api_resource.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h"
diff --git a/extensions/browser/api/system_display/system_display_apitest.cc b/extensions/browser/api/system_display/system_display_apitest.cc index be40367..bbf92915 100644 --- a/extensions/browser/api/system_display/system_display_apitest.cc +++ b/extensions/browser/api/system_display/system_display_apitest.cc
@@ -8,9 +8,9 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/debug/leak_annotations.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h"
diff --git a/extensions/browser/app_window/app_window_geometry_cache.cc b/extensions/browser/app_window/app_window_geometry_cache.cc index 06f0dba..c9d569a6 100644 --- a/extensions/browser/app_window/app_window_geometry_cache.cc +++ b/extensions/browser/app_window/app_window_geometry_cache.cc
@@ -9,7 +9,7 @@ #include <utility> #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/string_number_conversions.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "extensions/browser/extension_prefs.h"
diff --git a/extensions/browser/app_window/app_window_registry.cc b/extensions/browser/app_window/app_window_registry.cc index 8ea7d102..d1ec152 100644 --- a/extensions/browser/app_window/app_window_registry.cc +++ b/extensions/browser/app_window/app_window_registry.cc
@@ -7,7 +7,7 @@ #include <string> #include <vector> -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/stringprintf.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "content/public/browser/browser_context.h"
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc index 6c3b7f8..eb068f0b 100644 --- a/extensions/browser/content_verifier.cc +++ b/extensions/browser/content_verifier.cc
@@ -10,11 +10,11 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/threading/thread_restrictions.h" #include "base/timer/elapsed_timer.h"
diff --git a/extensions/browser/extension_action.h b/extensions/browser/extension_action.h index 2b43afb..f3fb071 100644 --- a/extensions/browser/extension_action.h +++ b/extensions/browser/extension_action.h
@@ -10,8 +10,8 @@ #include <string> #include <vector> +#include "base/containers/contains.h" #include "base/macros.h" -#include "base/stl_util.h" #include "extensions/common/api/extension_action/action_info.h" #include "extensions/common/constants.h" #include "third_party/skia/include/core/SkColor.h"
diff --git a/extensions/browser/extension_registrar.cc b/extensions/browser/extension_registrar.cc index 4a9137f..9fe893a 100644 --- a/extensions/browser/extension_registrar.cc +++ b/extensions/browser/extension_registrar.cc
@@ -7,9 +7,9 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/check_op.h" +#include "base/containers/contains.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/devtools_agent_host.h"
diff --git a/extensions/browser/extension_user_script_loader.cc b/extensions/browser/extension_user_script_loader.cc index d0b5239..72b8b9e 100644 --- a/extensions/browser/extension_user_script_loader.cc +++ b/extensions/browser/extension_user_script_loader.cc
@@ -15,13 +15,13 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/one_shot_event.h" #include "base/optional.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/version.h" #include "content/public/browser/browser_context.h"
diff --git a/extensions/browser/renderer_startup_helper.cc b/extensions/browser/renderer_startup_helper.cc index d3fc519..0ac879e 100644 --- a/extensions/browser/renderer_startup_helper.cc +++ b/extensions/browser/renderer_startup_helper.cc
@@ -8,9 +8,9 @@ #include <vector> #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/debug/dump_without_crashing.h" #include "base/feature_list.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/values.h" #include "components/keyed_service/content/browser_context_dependency_manager.h"
diff --git a/extensions/browser/renderer_startup_helper_unittest.cc b/extensions/browser/renderer_startup_helper_unittest.cc index 4247b5f2..c9b9499e 100644 --- a/extensions/browser/renderer_startup_helper_unittest.cc +++ b/extensions/browser/renderer_startup_helper_unittest.cc
@@ -4,7 +4,7 @@ #include "extensions/browser/renderer_startup_helper.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "components/crx_file/id_util.h" #include "content/public/test/mock_render_process_host.h" #include "extensions/browser/extension_prefs.h"
diff --git a/extensions/browser/updater/extension_cache_fake.cc b/extensions/browser/updater/extension_cache_fake.cc index 9eb2503..5515c2a 100644 --- a/extensions/browser/updater/extension_cache_fake.cc +++ b/extensions/browser/updater/extension_cache_fake.cc
@@ -5,7 +5,7 @@ #include "extensions/browser/updater/extension_cache_fake.h" #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h"
diff --git a/extensions/common/extension_l10n_util.cc b/extensions/common/extension_l10n_util.cc index ecb88b2..1a51563 100644 --- a/extensions/common/extension_l10n_util.cc +++ b/extensions/common/extension_l10n_util.cc
@@ -10,13 +10,13 @@ #include <string> #include <vector> +#include "base/containers/contains.h" #include "base/files/file_enumerator.h" #include "base/files/file_util.h" #include "base/json/json_file_value_serializer.h" #include "base/json/json_string_value_serializer.h" #include "base/logging.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h"
diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc index cd4378cc..5f63558 100644 --- a/extensions/common/features/simple_feature.cc +++ b/extensions/common/features/simple_feature.cc
@@ -11,8 +11,8 @@ #include "base/bind.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h"
diff --git a/extensions/common/manifest_handler.cc b/extensions/common/manifest_handler.cc index bbba247..b22646b 100644 --- a/extensions/common/manifest_handler.cc +++ b/extensions/common/manifest_handler.cc
@@ -10,7 +10,7 @@ #include <vector> #include "base/check.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "extensions/common/extension.h" #include "extensions/common/permissions/manifest_permission.h" #include "extensions/common/permissions/manifest_permission_set.h"
diff --git a/extensions/common/manifest_handlers/permissions_parser.cc b/extensions/common/manifest_handlers/permissions_parser.cc index 77261ec..22bf78ee 100644 --- a/extensions/common/manifest_handlers/permissions_parser.cc +++ b/extensions/common/manifest_handlers/permissions_parser.cc
@@ -8,9 +8,9 @@ #include <utility> #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h"
diff --git a/extensions/common/message_bundle.cc b/extensions/common/message_bundle.cc index aeb728d..346a5e2 100644 --- a/extensions/common/message_bundle.cc +++ b/extensions/common/message_bundle.cc
@@ -8,9 +8,9 @@ #include <string> #include <vector> +#include "base/containers/contains.h" #include "base/i18n/rtl.h" #include "base/lazy_instance.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h"
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc index b3684159..3402feb 100644 --- a/extensions/common/permissions/permissions_data.cc +++ b/extensions/common/permissions/permissions_data.cc
@@ -8,8 +8,8 @@ #include <utility> #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "content/public/common/url_constants.h" #include "extensions/common/constants.h" #include "extensions/common/error_utils.h"
diff --git a/extensions/common/permissions/permissions_info.cc b/extensions/common/permissions/permissions_info.cc index 5657eb8..17fc3b0 100644 --- a/extensions/common/permissions/permissions_info.cc +++ b/extensions/common/permissions/permissions_info.cc
@@ -5,9 +5,9 @@ #include "extensions/common/permissions/permissions_info.h" #include "base/check.h" +#include "base/containers/contains.h" #include "base/lazy_instance.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "extensions/common/alias.h"
diff --git a/extensions/common/url_pattern_set_unittest.cc b/extensions/common/url_pattern_set_unittest.cc index 9610e6f..b125653 100644 --- a/extensions/common/url_pattern_set_unittest.cc +++ b/extensions/common/url_pattern_set_unittest.cc
@@ -8,7 +8,7 @@ #include <sstream> -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/values.h"
diff --git a/extensions/renderer/feature_cache_unittest.cc b/extensions/renderer/feature_cache_unittest.cc index afb9a55..826122d1 100644 --- a/extensions/renderer/feature_cache_unittest.cc +++ b/extensions/renderer/feature_cache_unittest.cc
@@ -4,7 +4,7 @@ #include "extensions/renderer/feature_cache.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "components/crx_file/id_util.h" #include "content/public/test/test_utils.h" #include "extensions/common/extension.h"
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.cc index 01b9e32..7d5666f8 100644 --- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.cc +++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.cc
@@ -7,10 +7,10 @@ #include <algorithm> #include <utility> +#include "base/containers/contains.h" #include "base/containers/flat_map.h" #include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "content/public/common/webplugininfo.h" #include "content/public/renderer/render_frame.h"
diff --git a/extensions/renderer/one_time_message_handler.cc b/extensions/renderer/one_time_message_handler.cc index cbdcba8e..32950b5 100644 --- a/extensions/renderer/one_time_message_handler.cc +++ b/extensions/renderer/one_time_message_handler.cc
@@ -8,7 +8,7 @@ #include "base/bind.h" #include "base/callback.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/supports_user_data.h" #include "content/public/renderer/render_frame.h" #include "extensions/common/api/messaging/message.h"
diff --git a/extensions/renderer/resource_bundle_source_map.cc b/extensions/renderer/resource_bundle_source_map.cc index 5c01db7..b81b628 100644 --- a/extensions/renderer/resource_bundle_source_map.cc +++ b/extensions/renderer/resource_bundle_source_map.cc
@@ -4,8 +4,8 @@ #include "extensions/renderer/resource_bundle_source_map.h" +#include "base/containers/contains.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/string_piece.h" #include "extensions/renderer/static_v8_external_one_byte_string_resource.h" #include "third_party/zlib/google/compression_utils.h"
diff --git a/extensions/renderer/script_context.cc b/extensions/renderer/script_context.cc index 0e5b9781b..76c4442 100644 --- a/extensions/renderer/script_context.cc +++ b/extensions/renderer/script_context.cc
@@ -5,9 +5,9 @@ #include "extensions/renderer/script_context.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/containers/flat_set.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/values.h"
diff --git a/fuchsia/engine/context_provider_impl.cc b/fuchsia/engine/context_provider_impl.cc index 8217231..6d5ac6ea 100644 --- a/fuchsia/engine/context_provider_impl.cc +++ b/fuchsia/engine/context_provider_impl.cc
@@ -27,6 +27,7 @@ #include "base/base_switches.h" #include "base/bind.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_file.h" @@ -37,7 +38,6 @@ #include "base/path_service.h" #include "base/process/launch.h" #include "base/process/process.h" -#include "base/stl_util.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h"
diff --git a/gpu/command_buffer/common/gpu_memory_buffer_support.cc b/gpu/command_buffer/common/gpu_memory_buffer_support.cc index da1bada..78eb758 100644 --- a/gpu/command_buffer/common/gpu_memory_buffer_support.cc +++ b/gpu/command_buffer/common/gpu_memory_buffer_support.cc
@@ -8,8 +8,8 @@ #include <GLES2/gl2extchromium.h> #include "base/check.h" +#include "base/containers/contains.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "gpu/command_buffer/common/capabilities.h"
diff --git a/gpu/command_buffer/tests/gl_test_utils.cc b/gpu/command_buffer/tests/gl_test_utils.cc index 7409e65..db38d9f 100644 --- a/gpu/command_buffer/tests/gl_test_utils.cc +++ b/gpu/command_buffer/tests/gl_test_utils.cc
@@ -12,8 +12,8 @@ #include <string> #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/logging.h" -#include "base/stl_util.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/config/gpu_driver_bug_workarounds.h" #include "gpu/config/gpu_info_collector.h"
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_android_hardware_buffer.cc b/gpu/ipc/service/gpu_memory_buffer_factory_android_hardware_buffer.cc index d058706f..c5cf83f 100644 --- a/gpu/ipc/service/gpu_memory_buffer_factory_android_hardware_buffer.cc +++ b/gpu/ipc/service/gpu_memory_buffer_factory_android_hardware_buffer.cc
@@ -6,8 +6,8 @@ #include "base/android/android_hardware_buffer_compat.h" #include "base/android/scoped_hardware_buffer_handle.h" +#include "base/containers/contains.h" #include "base/logging.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "components/viz/common/resources/resource_format_utils.h" #include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
diff --git a/ios/chrome/app/spotlight/base_spotlight_manager.mm b/ios/chrome/app/spotlight/base_spotlight_manager.mm index d346b7b7..015f4fc47 100644 --- a/ios/chrome/app/spotlight/base_spotlight_manager.mm +++ b/ios/chrome/app/spotlight/base_spotlight_manager.mm
@@ -9,8 +9,8 @@ #import <MaterialComponents/MaterialTypography.h> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/hash/md5.h" -#include "base/stl_util.h" #include "base/strings/sys_string_conversions.h" #include "base/task/cancelable_task_tracker.h" #include "components/favicon/core/fallback_url_util.h"
diff --git a/ios/chrome/browser/bookmarks/bookmarks_utils.cc b/ios/chrome/browser/bookmarks/bookmarks_utils.cc index 6c983454..aa1ca31 100644 --- a/ios/chrome/browser/bookmarks/bookmarks_utils.cc +++ b/ios/chrome/browser/bookmarks/bookmarks_utils.cc
@@ -5,8 +5,8 @@ #include "ios/chrome/browser/bookmarks/bookmarks_utils.h" #include "base/check.h" +#include "base/containers/contains.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/prefs/pref_service.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm index b5ca7e4..567c1900 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm +++ b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
@@ -15,11 +15,11 @@ #include "base/check_op.h" #include "base/command_line.h" #include "base/compiler_specific.h" +#include "base/containers/contains.h" #include "base/debug/alias.h" #include "base/memory/ptr_util.h" #include "base/path_service.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/task/post_task.h"
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn b/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn index ef6c842..790b0cf5 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn +++ b/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn
@@ -30,9 +30,9 @@ deps = [ ":browser_agent", "//base", + "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords", - "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_card", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/translate", "//ios/chrome/browser/main:public",
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm b/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm index d5032ca..495a8cf 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm
@@ -6,10 +6,10 @@ #include "base/feature_list.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm/confirm_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/password_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/update_password_infobar_interaction_handler.h" -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_card/save_card_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/translate/translate_infobar_interaction_handler.h" #import "ios/chrome/browser/ui/infobars/infobar_feature.h"
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/BUILD.gn b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/BUILD.gn similarity index 97% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/BUILD.gn rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/BUILD.gn index cd960ac3..8528d5d 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/BUILD.gn +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("save_address_profile") { +source_set("autofill_address_profile") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ "save_address_profile_infobar_banner_interaction_handler.h", @@ -39,7 +39,7 @@ "save_address_profile_infobar_modal_interaction_handler_unittest.mm", ] deps = [ - ":save_address_profile", + ":autofill_address_profile", "//base/test:test_support", "//components/autofill/core/browser:test_support", "//ios/chrome/browser/infobars",
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.h similarity index 81% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.h rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.h index 16276ae..bc145bb 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.h +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_INTERACTION_HANDLER_H_ -#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_INTERACTION_HANDLER_H_ +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_INTERACTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_INTERACTION_HANDLER_H_ #include <string.h> @@ -33,4 +33,4 @@ InfoBarIOS* infobar); }; -#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_INTERACTION_HANDLER_H_ +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_INTERACTION_HANDLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.mm similarity index 96% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.mm rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.mm index 70585ae..1f5a7bf 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.mm
@@ -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 "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.h" #include "base/check.h" #include "components/autofill/core/browser/autofill_save_address_profile_delegate_ios.h"
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler_unittest.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler_unittest.mm similarity index 95% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler_unittest.mm rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler_unittest.mm index f48d87b4..2e43e38 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler_unittest.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler_unittest.mm
@@ -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 "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.h" #include "base/guid.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.h similarity index 75% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.h rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.h index bbea078..175b0f4 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.h +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_INTERACTION_HANDLER_H_ -#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_INTERACTION_HANDLER_H_ +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_INTERACTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_INTERACTION_HANDLER_H_ #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/infobar_interaction_handler.h" @@ -18,4 +18,4 @@ ~SaveAddressProfileInfobarInteractionHandler() override; }; -#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_INTERACTION_HANDLER_H_ +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_INTERACTION_HANDLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.mm similarity index 78% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.mm rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.mm index 491ed193..ef845958 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.mm
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/infobar_type.h" -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_banner_interaction_handler.h" -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_banner_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.h similarity index 85% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.h rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.h index b0fae32..3cf0863d 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.h +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_INTERACTION_HANDLER_H_ -#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_INTERACTION_HANDLER_H_ +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_INTERACTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_INTERACTION_HANDLER_H_ #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_modal_interaction_handler.h" @@ -44,4 +44,4 @@ Browser* browser_ = nullptr; }; -#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_INTERACTION_HANDLER_H_ +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_INTERACTION_HANDLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.mm similarity index 90% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.mm rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.mm index cba1714..2b38148 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.mm
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.h" #include "components/autofill/core/browser/autofill_save_address_profile_delegate_ios.h" #include "ios/chrome/browser/infobars/infobar_ios.h" -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h" #include "ios/chrome/browser/main/browser.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler_unittest.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler_unittest.mm similarity index 95% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler_unittest.mm rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler_unittest.mm index 511f0e46..701389ce 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler_unittest.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler_unittest.mm
@@ -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 "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.h" #include <string>
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h similarity index 85% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h index d8d203a..05493cde 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_ -#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_ +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_ #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_modal_overlay_request_callback_installer.h" @@ -41,4 +41,4 @@ weak_factory_{this}; }; -#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_ +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.mm similarity index 92% rename from ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.mm rename to ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.mm index 8b619cb..236b76c 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.mm
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h" #include "base/check.h" #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/infobars/infobar_ios.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h" -#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile/save_address_profile_infobar_modal_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_interaction_handler.h" #include "ios/chrome/browser/infobars/overlays/infobar_overlay_util.h" #import "ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_responses.h"
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl_unittest.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl_unittest.mm index e0b7f46..e8d3593 100644 --- a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl_unittest.mm +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl_unittest.mm
@@ -7,20 +7,24 @@ #include "base/feature_list.h" #include "base/guid.h" #include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/autofill/core/browser/data_model/autofill_profile.h" #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/infobars/core/infobar.h" #include "components/password_manager/core/browser/mock_password_form_manager_for_ui.h" #include "components/password_manager/core/browser/password_form.h" #include "components/translate/core/browser/mock_translate_infobar_delegate.h" #include "ios/chrome/browser/infobars/infobar_ios.h" +#include "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/test/mock_autofill_save_address_profile_delegate_ios.h" #include "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/test/mock_autofill_save_card_infobar_delegate_mobile.h" #include "ios/chrome/browser/infobars/test/mock_infobar_delegate.h" #import "ios/chrome/browser/overlays/public/infobar_banner/confirm_infobar_banner_overlay_request_config.h" +#import "ios/chrome/browser/overlays/public/infobar_banner/save_address_profile_infobar_banner_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/infobar_banner/save_card_infobar_banner_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h" #import "ios/chrome/browser/overlays/public/infobar_banner/translate_infobar_banner_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/infobar_banner/update_password_infobar_banner_overlay.h" #import "ios/chrome/browser/overlays/public/infobar_modal/password_infobar_modal_overlay_request_config.h" +#import "ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/infobar_modal/save_card_infobar_modal_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/infobar_modal/translate_infobar_modal_overlay_request_config.h" #import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h" @@ -37,8 +41,12 @@ using infobars::InfoBar; using infobars::InfoBarDelegate; using confirm_infobar_overlays::ConfirmBannerRequestConfig; +using save_address_profile_infobar_overlays:: + SaveAddressProfileBannerRequestConfig; using save_card_infobar_overlays::SaveCardBannerRequestConfig; using translate_infobar_overlays::TranslateBannerRequestConfig; +using save_address_profile_infobar_overlays:: + SaveAddressProfileModalRequestConfig; using save_card_infobar_overlays::SaveCardModalRequestConfig; using translate_infobar_overlays::TranslateModalRequestConfig; @@ -48,6 +56,7 @@ InfobarOverlayRequestFactoryImplTest() : prefs_(autofill::test::PrefServiceForTesting()), card_(base::GenerateGUID(), "https://www.example.com/"), + profile_(base::GenerateGUID(), "https://www.example.com/"), translate_delegate_factory_("fr", "en") {} InfobarOverlayRequestFactory* factory() { return &factory_; } @@ -56,6 +65,7 @@ InfobarOverlayRequestFactoryImpl factory_; std::unique_ptr<PrefService> prefs_; autofill::CreditCard card_; + autofill::AutofillProfile profile_; std::unique_ptr<InfoBarIOS> infobar_; translate::testing::MockTranslateInfoBarDelegateFactory translate_delegate_factory_; @@ -161,3 +171,23 @@ factory()->CreateInfobarRequest(&infobar, InfobarOverlayType::kModal); EXPECT_TRUE(modal_request->GetConfig<TranslateModalRequestConfig>()); } + +// Tests that the factory creates a save address profile request. +TEST_F(InfobarOverlayRequestFactoryImplTest, SaveAddressProfile) { + GURL url("https://chromium.test"); + InfoBarIOS infobar( + InfobarType::kInfobarTypeSaveAutofillAddressProfile, + MockAutofillSaveAddressProfileDelegateIOSFactory:: + CreateMockAutofillSaveAddressProfileDelegateIOSFactory(profile_)); + + // Test banner request creation. + std::unique_ptr<OverlayRequest> banner_request = + factory()->CreateInfobarRequest(&infobar, InfobarOverlayType::kBanner); + EXPECT_TRUE( + banner_request->GetConfig<SaveAddressProfileBannerRequestConfig>()); + + // Test modal request creation. + std::unique_ptr<OverlayRequest> modal_request = + factory()->CreateInfobarRequest(&infobar, InfobarOverlayType::kModal); + EXPECT_TRUE(modal_request->GetConfig<SaveAddressProfileModalRequestConfig>()); +}
diff --git a/ios/chrome/browser/reading_list/url_downloader.cc b/ios/chrome/browser/reading_list/url_downloader.cc index 5e00a35..78ce9499 100644 --- a/ios/chrome/browser/reading_list/url_downloader.cc +++ b/ios/chrome/browser/reading_list/url_downloader.cc
@@ -9,12 +9,12 @@ #include "base/base64.h" #include "base/bind.h" +#include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/json/json_writer.h" #include "base/memory/ptr_util.h" #include "base/path_service.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/task/post_task.h"
diff --git a/ios/chrome/browser/reading_list/url_downloader_unittest.mm b/ios/chrome/browser/reading_list/url_downloader_unittest.mm index 2218f3e..93c4517 100644 --- a/ios/chrome/browser/reading_list/url_downloader_unittest.mm +++ b/ios/chrome/browser/reading_list/url_downloader_unittest.mm
@@ -7,9 +7,9 @@ #include <vector> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/files/file_util.h" #include "base/path_service.h" -#include "base/stl_util.h" #import "base/test/ios/wait_util.h" #include "base/test/task_environment.h" #include "components/reading_list/core/offline_url_utils.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_banner/BUILD.gn index dae6dfe..f03ffccd 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_banner/BUILD.gn
@@ -32,9 +32,9 @@ "//ios/chrome/browser/ui/infobars/presentation", "//ios/chrome/browser/ui/overlays:coordinators", "//ios/chrome/browser/ui/overlays:util", + "//ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile", "//ios/chrome/browser/ui/overlays/infobar_banner/confirm", "//ios/chrome/browser/ui/overlays/infobar_banner/passwords", - "//ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile", "//ios/chrome/browser/ui/overlays/infobar_banner/save_card", "//ios/chrome/browser/ui/overlays/infobar_banner/translate:mediators", "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/BUILD.gn similarity index 95% rename from ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/BUILD.gn rename to ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/BUILD.gn index 0d36872..a5dfd2a 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("save_address_profile") { +source_set("autofill_address_profile") { sources = [ "save_address_profile_infobar_banner_overlay_mediator.h", "save_address_profile_infobar_banner_overlay_mediator.mm", @@ -31,7 +31,7 @@ configs += [ "//build/config/compiler:enable_arc" ] deps = [ - ":save_address_profile", + ":autofill_address_profile", "//base/test:test_support", "//components/autofill/core/browser", "//components/autofill/core/browser:test_support",
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.h b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.h new file mode 100644 index 0000000..87d8902 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.h
@@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_BANNER_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_OVERLAY_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_BANNER_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_OVERLAY_MEDIATOR_H_ + +#import "ios/chrome/browser/ui/overlays/infobar_banner/infobar_banner_overlay_mediator.h" + +// Mediator that configures an infobar banner for a save address profile +// infobar. +@interface SaveAddressProfileInfobarBannerOverlayMediator + : InfobarBannerOverlayMediator +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_BANNER_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.mm similarity index 94% rename from ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.mm rename to ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.mm index b4cc6df..b73fc67 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.mm
@@ -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 "ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.h" #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/overlays/public/infobar_banner/infobar_banner_overlay_responses.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator_unittest.mm similarity index 95% rename from ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator_unittest.mm rename to ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator_unittest.mm index b29df1a7..b09fec6 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator_unittest.mm
@@ -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 "ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.h" #include "base/bind.h" #include "base/feature_list.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/infobar_banner_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/infobar_banner/infobar_banner_overlay_coordinator.mm index 7e113e2..2732a3d 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/infobar_banner_overlay_coordinator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_banner/infobar_banner_overlay_coordinator.mm
@@ -16,11 +16,11 @@ #import "ios/chrome/browser/ui/infobars/infobar_constants.h" #import "ios/chrome/browser/ui/infobars/presentation/infobar_banner_positioner.h" #import "ios/chrome/browser/ui/infobars/presentation/infobar_banner_transition_driver.h" +#import "ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile/save_address_profile_infobar_banner_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/infobar_banner/confirm/confirm_infobar_banner_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/infobar_banner/infobar_banner_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/infobar_banner/passwords/save_password_infobar_banner_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/infobar_banner/passwords/update_password_infobar_banner_overlay_mediator.h" -#import "ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/infobar_banner/translate/translate_infobar_banner_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator+subclassing.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.h b/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.h deleted file mode 100644 index 6eae2f4..0000000 --- a/ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile/save_address_profile_infobar_banner_overlay_mediator.h +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_BANNER_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_OVERLAY_MEDIATOR_H_ -#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_BANNER_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_OVERLAY_MEDIATOR_H_ - -#import "ios/chrome/browser/ui/overlays/infobar_banner/infobar_banner_overlay_mediator.h" - -// Mediator that configures an infobar banner for a save address profile -// infobar. -@interface SaveAddressProfileInfobarBannerOverlayMediator - : InfobarBannerOverlayMediator -@end - -#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_BANNER_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_BANNER_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_modal/BUILD.gn index a2a7acc..9999947 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_modal/BUILD.gn
@@ -9,8 +9,8 @@ configs += [ "//build/config/compiler:enable_arc" ] deps = [ + "//ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile", "//ios/chrome/browser/ui/overlays/infobar_modal/passwords", - "//ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile", "//ios/chrome/browser/ui/overlays/infobar_modal/save_card", "//ios/chrome/browser/ui/overlays/infobar_modal/translate", ]
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/BUILD.gn similarity index 95% rename from ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/BUILD.gn rename to ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/BUILD.gn index 0274ce71..9d00b52 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("save_address_profile") { +source_set("autofill_address_profile") { sources = [ "save_address_profile_infobar_modal_overlay_coordinator.h", "save_address_profile_infobar_modal_overlay_coordinator.mm",
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h new file mode 100644 index 0000000..f5ab126 --- /dev/null +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h
@@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_ + +#import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator.h" + +// A coordinator that displays the Save Address Profile infobar modal UI using +// OverlayPresenter. +@interface SaveAddressProfileInfobarModalOverlayCoordinator + : InfobarModalOverlayCoordinator +@end + +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.mm similarity index 90% rename from ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.mm rename to ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.mm index 277dbd1..6a7bf5c 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.mm
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h" +#import "ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h" #include "base/check.h" #import "ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h" #include "ios/chrome/browser/overlays/public/overlay_callback_manager.h" #include "ios/chrome/browser/overlays/public/overlay_response.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_save_address_profile_table_view_controller.h" +#import "ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator+modal_configuration.h" -#import "ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.h b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.h similarity index 66% rename from ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.h rename to ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.h index 64d2cfc..4c8afd9 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.h +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_ -#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_ +#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_ #import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_mediator.h" @@ -21,4 +21,4 @@ @end -#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_ +#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_AUTOFILL_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.mm similarity index 95% rename from ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.mm rename to ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.mm index d56eec210..c509b92 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.mm
@@ -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 "ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_mediator.h" +#import "ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator.h" #include "base/strings/sys_string_conversions.h" #import "ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_supported_overlay_coordinator_classes.mm b/ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_supported_overlay_coordinator_classes.mm index e027e00c..ea2b12f6 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_supported_overlay_coordinator_classes.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_supported_overlay_coordinator_classes.mm
@@ -4,8 +4,8 @@ #import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_supported_overlay_coordinator_classes.h" +#import "ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/passwords/password_infobar_modal_overlay_coordinator.h" -#import "ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/save_card/save_card_infobar_modal_overlay_coordinator.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/translate/translate_infobar_modal_overlay_coordinator.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h deleted file mode 100644 index a298c89..0000000 --- a/ios/chrome/browser/ui/overlays/infobar_modal/save_address_profile/save_address_profile_infobar_modal_overlay_coordinator.h +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_ -#define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_ - -#import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator.h" - -// A coordinator that displays the Save Address Profile infobar modal UI using -// OverlayPresenter. -@interface SaveAddressProfileInfobarModalOverlayCoordinator - : InfobarModalOverlayCoordinator -@end - -#endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_SAVE_ADDRESS_PROFILE_SAVE_ADDRESS_PROFILE_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/voice/speech_input_locale_config_impl.mm b/ios/chrome/browser/voice/speech_input_locale_config_impl.mm index d786627..a03eb96 100644 --- a/ios/chrome/browser/voice/speech_input_locale_config_impl.mm +++ b/ios/chrome/browser/voice/speech_input_locale_config_impl.mm
@@ -6,10 +6,10 @@ #import <Foundation/Foundation.h> +#include "base/containers/contains.h" #include "base/mac/bundle_locations.h" #include "base/mac/foundation_util.h" #include "base/mac/scoped_cftyperef.h" -#include "base/stl_util.h" #include "base/strings/string_split.h" #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/voice/speech_input_locale_match.h"
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 0315c05..2eb5646 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -187,10 +187,10 @@ "//ios/chrome/browser/infobars:unit_tests", "//ios/chrome/browser/infobars/overlays:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent:unit_tests", + "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords:unit_tests", - "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_address_profile:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_card:unit_tests", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/translate:unit_tests", "//ios/chrome/browser/itunes_urls:unit_tests", @@ -283,9 +283,9 @@ "//ios/chrome/browser/ui/open_in:unit_tests", "//ios/chrome/browser/ui/overlays:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_banner:unit_tests", + "//ios/chrome/browser/ui/overlays/infobar_banner/autofill_address_profile:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_banner/confirm:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_banner/passwords:unit_tests", - "//ios/chrome/browser/ui/overlays/infobar_banner/save_address_profile:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_banner/save_card:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_banner/translate:unit_tests", "//ios/chrome/browser/ui/overlays/infobar_modal:unit_tests",
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index 7c8d236..b75ad4e 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -eef3770852bb7da6928c116dd6e7ffbda3a30db7 \ No newline at end of file +048cd5631ad59a4fea59b557163f44d082b728d9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index de81c4e..7004c05 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -aeb1d917f8837e12f5c90cf6b801b61963bdc7b8 \ No newline at end of file +0b0f49306283948e277879986128680f39aea73f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 index af841ac..e90fab3 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -dd34ad80e6b0541dfc58b2f93abfb0ed1b54c874 \ No newline at end of file +482521668a5e900d51da504fe121ea97101e914c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 index d65853b..980f9b8 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -128e01acc824e6c646cab937b10dbf369aa98365 \ No newline at end of file +5f371c63572fa7a135116c9706b67f52cdcad701 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index 4dcf28c..e705527 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -913bf98d713131a8cf2b2c35d3fa7b1229078e78 \ No newline at end of file +b39b20b08f5a67536bbbbce42ce4f7aa98d3cc3d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index a392175..abd8480 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -0b8d0e6c979c4c666d7ba2fbf1984a3f3434f750 \ No newline at end of file +3193e5d149744941f26f882ba22b7cc263fabbb6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index 4e57681..2bbe9f8 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -49f2dc26606d38f05319842c54a7271e0101781e \ No newline at end of file +63b3d72e60c2b281e12e1c18650d44865b214af4 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index bc47828..761be1d6 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -e8a0b45e35a0090f91c42fa38b1e494d942a4bab \ No newline at end of file +d98727ce83ddcd8764dd3937ca247c578669d375 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index f1f8de1..f685578f 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -d8892f035855093a1563f0ea6d1b18be4408211b \ No newline at end of file +2005abb18663d5fd048f99edd889dd845527749f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index 961bd0f..e751ec80 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -bfb9431712c6abf09f457fbdc7c2a6d0a043fc35 \ No newline at end of file +abd53525722f74cdb483fc5510c40a48bb7c63ae \ No newline at end of file
diff --git a/ios/web/webui/url_data_manager_ios.cc b/ios/web/webui/url_data_manager_ios.cc index 32105a85..230353c8 100644 --- a/ios/web/webui/url_data_manager_ios.cc +++ b/ios/web/webui/url_data_manager_ios.cc
@@ -10,9 +10,9 @@ #include <vector> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/memory/ref_counted_memory.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/synchronization/lock.h" #include "base/task/post_task.h"
diff --git a/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc b/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc index 50567d6..48955b7 100644 --- a/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc +++ b/jingle/notifier/base/gaia_token_pre_xmpp_auth.cc
@@ -6,9 +6,9 @@ #include <algorithm> +#include "base/containers/contains.h" #include "base/logging.h" #include "base/macros.h" -#include "base/stl_util.h" #include "third_party/libjingle_xmpp/xmpp/constants.h" #include "third_party/libjingle_xmpp/xmpp/saslcookiemechanism.h" #include "third_party/webrtc/rtc_base/socket_address.h"
diff --git a/media/audio/audio_output_dispatcher_impl.cc b/media/audio/audio_output_dispatcher_impl.cc index 439331d..a8c428c 100644 --- a/media/audio/audio_output_dispatcher_impl.cc +++ b/media/audio/audio_output_dispatcher_impl.cc
@@ -9,8 +9,8 @@ #include "base/bind.h" #include "base/compiler_specific.h" +#include "base/containers/contains.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/time/time.h" #include "media/audio/audio_logging.h" #include "media/audio/audio_manager.h"
diff --git a/media/base/eme_constants.h b/media/base/eme_constants.h index 11e7c1e..6e47c0e 100644 --- a/media/base/eme_constants.h +++ b/media/base/eme_constants.h
@@ -187,19 +187,20 @@ IDENTIFIER_AND_PERSISTENCE_REQUIRED, // The configuration option prevents use of hardware-secure codecs. - // This rule only has meaning on platforms that distinguish hardware-secure - // codecs (i.e. Android, Windows and ChromeOS). HW_SECURE_CODECS_NOT_ALLOWED, // The configuration option is supported if hardware-secure codecs are used. - // This rule only has meaning on platforms that distinguish hardware-secure - // codecs (i.e. Android, Windows and ChromeOS). HW_SECURE_CODECS_REQUIRED, // The configuration option is supported on platforms where hardware-secure // codecs are used and an identifier is also required (i.e. ChromeOS). IDENTIFIER_AND_HW_SECURE_CODECS_REQUIRED, + // The configuration option is supported on platforms where hardware-secure + // codecs are used and both identifier and persistent state are required (i.e. + // Windows). + IDENTIFIER_PERSISTENCE_AND_HW_SECURE_CODECS_REQUIRED, + // The configuration option is supported without conditions. SUPPORTED, };
diff --git a/media/blink/cdm_session_adapter.cc b/media/blink/cdm_session_adapter.cc index ca04693..ed1a277 100644 --- a/media/blink/cdm_session_adapter.cc +++ b/media/blink/cdm_session_adapter.cc
@@ -8,10 +8,10 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/logging.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" #include "media/base/cdm_factory.h"
diff --git a/media/blink/key_system_config_selector.cc b/media/blink/key_system_config_selector.cc index 682cfe9..b99382fb 100644 --- a/media/blink/key_system_config_selector.cc +++ b/media/blink/key_system_config_selector.cc
@@ -261,8 +261,8 @@ case EmeConfigRule::PERSISTENCE_REQUIRED: return !is_persistence_not_allowed_; case EmeConfigRule::IDENTIFIER_AND_PERSISTENCE_REQUIRED: - return (!is_identifier_not_allowed_ && IsPermissionPossible() && - !is_persistence_not_allowed_); + return !is_identifier_not_allowed_ && IsPermissionPossible() && + !is_persistence_not_allowed_; case EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED: return !are_hw_secure_codecs_required_; case EmeConfigRule::HW_SECURE_CODECS_REQUIRED: @@ -270,6 +270,10 @@ case EmeConfigRule::IDENTIFIER_AND_HW_SECURE_CODECS_REQUIRED: return !is_identifier_not_allowed_ && IsPermissionPossible() && !are_hw_secure_codecs_not_allowed_; + case EmeConfigRule::IDENTIFIER_PERSISTENCE_AND_HW_SECURE_CODECS_REQUIRED: + return !is_identifier_not_allowed_ && IsPermissionPossible() && + !is_persistence_not_allowed_ && + !are_hw_secure_codecs_not_allowed_; case EmeConfigRule::SUPPORTED: return true; } @@ -313,6 +317,11 @@ is_identifier_required_ = true; are_hw_secure_codecs_required_ = true; return; + case EmeConfigRule::IDENTIFIER_PERSISTENCE_AND_HW_SECURE_CODECS_REQUIRED: + is_identifier_required_ = true; + is_persistence_required_ = true; + are_hw_secure_codecs_required_ = true; + return; case EmeConfigRule::SUPPORTED: return; }
diff --git a/media/blink/key_system_config_selector_unittest.cc b/media/blink/key_system_config_selector_unittest.cc index 346333b25..7b65983 100644 --- a/media/blink/key_system_config_selector_unittest.cc +++ b/media/blink/key_system_config_selector_unittest.cc
@@ -44,8 +44,10 @@ const char kRequireIdentifierRobustness[] = "require_identifier"; const char kDisallowHwSecureCodecRobustness[] = "disallow_hw_secure_codec"; const char kRequireHwSecureCodecRobustness[] = "require_hw_secure_codec"; -const char kRequireHwSecureCodecAndIdentifierRobustness[] = - "require_hw_secure_codec_and_identifier"; +const char kRequireIdentifierAndHwSecureCodecRobustness[] = + "require_identifier_and_hw_secure_codec"; +const char kRequireIdentifierPersistenceAndHwSecureCodecRobustness[] = + "require_identifier_persistence_and_hw_secure_codec"; const char kUnsupportedRobustness[] = "unsupported"; // Test container mime types. Supported types are prefixed with audio/video so @@ -296,8 +298,13 @@ return EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED; if (requested_robustness == kRequireHwSecureCodecRobustness) return EmeConfigRule::HW_SECURE_CODECS_REQUIRED; - if (requested_robustness == kRequireHwSecureCodecAndIdentifierRobustness) + if (requested_robustness == kRequireIdentifierAndHwSecureCodecRobustness) return EmeConfigRule::IDENTIFIER_AND_HW_SECURE_CODECS_REQUIRED; + if (requested_robustness == + kRequireIdentifierPersistenceAndHwSecureCodecRobustness) { + return EmeConfigRule:: + IDENTIFIER_PERSISTENCE_AND_HW_SECURE_CODECS_REQUIRED; + } if (requested_robustness == kUnsupportedRobustness) return EmeConfigRule::NOT_SUPPORTED; @@ -1486,10 +1493,10 @@ SelectConfigReturnsError(); } -// --- HW Secure and Identifier Robustness --- +// --- Identifier and HW Secure Robustness --- TEST_F(KeySystemConfigSelectorTest, - HwSecureCodecAndIdentifier_IncompatibleCodecAndRobustness) { + IdentifierAndHwSecureCodec_IncompatibleCodecAndRobustness) { media_permission_->is_granted = true; key_systems_->distinctive_identifier = EmeFeatureSupport::REQUESTABLE; @@ -1498,7 +1505,7 @@ video_capabilities[0].mime_type = kSupportedVideoContainer; video_capabilities[0].codecs = kDisallowHwSecureCodec; video_capabilities[0].robustness = - kRequireHwSecureCodecAndIdentifierRobustness; + kRequireIdentifierAndHwSecureCodecRobustness; auto config = EmptyConfiguration(); config.video_capabilities = video_capabilities; @@ -1508,7 +1515,7 @@ } TEST_F(KeySystemConfigSelectorTest, - HwSecureCodecAndIdentifier_IncompatibleCapabilities) { + IdentifierAndHwSecureCodec_IncompatibleCapabilities) { media_permission_->is_granted = true; key_systems_->distinctive_identifier = EmeFeatureSupport::REQUESTABLE; @@ -1517,7 +1524,7 @@ video_capabilities[0].mime_type = kSupportedVideoContainer; video_capabilities[0].codecs = kSupportedVideoCodec; video_capabilities[0].robustness = - kRequireHwSecureCodecAndIdentifierRobustness; + kRequireIdentifierAndHwSecureCodecRobustness; video_capabilities[1].content_type = "disallow_hw_secure_codec"; video_capabilities[1].mime_type = kSupportedVideoContainer; video_capabilities[1].codecs = kDisallowHwSecureCodec; @@ -1536,7 +1543,7 @@ } TEST_F(KeySystemConfigSelectorTest, - HwSecureCodecAndIdentifier_UnsupportedCapabilityNotAffectingRules) { + IdentifierAndHwSecureCodec_UnsupportedCapabilityNotAffectingRules) { media_permission_->is_granted = true; key_systems_->distinctive_identifier = EmeFeatureSupport::REQUESTABLE; @@ -1549,7 +1556,7 @@ video_capabilities[1].mime_type = kSupportedVideoContainer; video_capabilities[1].codecs = kRequireHwSecureCodec; video_capabilities[1].robustness = - kRequireHwSecureCodecAndIdentifierRobustness; + kRequireIdentifierAndHwSecureCodecRobustness; auto config = EmptyConfiguration(); config.video_capabilities = video_capabilities; @@ -1563,6 +1570,54 @@ EXPECT_TRUE(cdm_config_.use_hw_secure_codecs); } +// --- Identifier, Persistence and HW Secure Robustness --- + +TEST_F(KeySystemConfigSelectorTest, + IdentifierPersistenceAndHwSecureCodec_Supported) { + media_permission_->is_granted = true; + key_systems_->persistent_state = EmeFeatureSupport::REQUESTABLE; + key_systems_->distinctive_identifier = EmeFeatureSupport::REQUESTABLE; + + std::vector<WebMediaKeySystemMediaCapability> video_capabilities(1); + video_capabilities[0].content_type = "require_hw_secure_codec"; + video_capabilities[0].mime_type = kSupportedVideoContainer; + video_capabilities[0].codecs = kSupportedVideoCodec; + video_capabilities[0].robustness = + kRequireIdentifierPersistenceAndHwSecureCodecRobustness; + + auto config = EmptyConfiguration(); + config.video_capabilities = video_capabilities; + configs_.push_back(config); + + SelectConfigRequestsPermissionAndReturnsConfig(); + EXPECT_EQ(MediaKeysRequirement::kRequired, config_.distinctive_identifier); + EXPECT_EQ(MediaKeysRequirement::kRequired, config_.persistent_state); + ASSERT_EQ(1u, config_.video_capabilities.size()); + EXPECT_EQ("require_hw_secure_codec", + config_.video_capabilities[0].content_type); + EXPECT_TRUE(cdm_config_.use_hw_secure_codecs); +} + +TEST_F(KeySystemConfigSelectorTest, + IdentifierPersistenceAndHwSecureCodec_NotSupported) { + media_permission_->is_granted = true; + key_systems_->persistent_state = EmeFeatureSupport::NOT_SUPPORTED; + key_systems_->distinctive_identifier = EmeFeatureSupport::REQUESTABLE; + + std::vector<WebMediaKeySystemMediaCapability> video_capabilities(1); + video_capabilities[0].content_type = "require_hw_secure_codec"; + video_capabilities[0].mime_type = kSupportedVideoContainer; + video_capabilities[0].codecs = kSupportedVideoCodec; + video_capabilities[0].robustness = + kRequireIdentifierPersistenceAndHwSecureCodecRobustness; + + auto config = EmptyConfiguration(); + config.video_capabilities = video_capabilities; + configs_.push_back(config); + + SelectConfigReturnsError(); +} + // --- audioCapabilities --- // These are handled by the same code as |videoCapabilities|, so only minimal // additional testing is done.
diff --git a/media/blink/new_session_cdm_result_promise.cc b/media/blink/new_session_cdm_result_promise.cc index 4e718ca..0f19f3a 100644 --- a/media/blink/new_session_cdm_result_promise.cc +++ b/media/blink/new_session_cdm_result_promise.cc
@@ -4,9 +4,9 @@ #include "media/blink/new_session_cdm_result_promise.h" +#include "base/containers/contains.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" #include "media/blink/cdm_result_promise_helper.h" #include "third_party/blink/public/platform/web_string.h"
diff --git a/media/capture/video/chromeos/camera_buffer_factory.cc b/media/capture/video/chromeos/camera_buffer_factory.cc index 345c9dc..6099afb 100644 --- a/media/capture/video/chromeos/camera_buffer_factory.cc +++ b/media/capture/video/chromeos/camera_buffer_factory.cc
@@ -4,7 +4,7 @@ #include "media/capture/video/chromeos/camera_buffer_factory.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "media/capture/video/chromeos/video_capture_device_factory_chromeos.h" namespace media {
diff --git a/media/capture/video/chromeos/camera_metadata_utils.h b/media/capture/video/chromeos/camera_metadata_utils.h index 851b1fd..d6b4a30 100644 --- a/media/capture/video/chromeos/camera_metadata_utils.h +++ b/media/capture/video/chromeos/camera_metadata_utils.h
@@ -5,7 +5,7 @@ #ifndef MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_METADATA_UTILS_H_ #define MEDIA_CAPTURE_VIDEO_CHROMEOS_CAMERA_METADATA_UTILS_H_ -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "media/capture/capture_export.h" #include "media/capture/video/chromeos/mojom/camera_metadata.mojom.h"
diff --git a/media/gpu/chromeos/platform_video_frame_utils_unittest.cc b/media/gpu/chromeos/platform_video_frame_utils_unittest.cc index ba698cb..d6e8b8c 100644 --- a/media/gpu/chromeos/platform_video_frame_utils_unittest.cc +++ b/media/gpu/chromeos/platform_video_frame_utils_unittest.cc
@@ -10,13 +10,13 @@ #include <utility> #include <vector> +#include "base/containers/contains.h" #include "base/files/file.h" #include "base/files/file_path.h" #include "base/files/scoped_file.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/time/time.h" #include "gpu/ipc/service/gpu_memory_buffer_factory.h" #include "media/base/color_plane_layout.h"
diff --git a/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc b/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc index f25d7d2e..aa350bd 100644 --- a/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc +++ b/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc
@@ -479,6 +479,10 @@ while (!output_request_queue_.empty()) { if (!output_request_queue_.front().IsReady()) { DVLOGF(3) << "The first surface is not ready yet."; + // It is possible that that V4L2 buffers for this output surface are not + // even queued yet. Make sure that avd_->Decode() is called to continue + // that work and prevent the decoding thread from starving. + resume_decode = true; break; }
diff --git a/media/gpu/vaapi/vaapi_unittest.cc b/media/gpu/vaapi/vaapi_unittest.cc index 8ac7f30..fb2867c 100644 --- a/media/gpu/vaapi/vaapi_unittest.cc +++ b/media/gpu/vaapi/vaapi_unittest.cc
@@ -14,12 +14,12 @@ #include <va/va_str.h> #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/files/file.h" #include "base/files/scoped_file.h" #include "base/logging.h" #include "base/optional.h" #include "base/process/launch.h" -#include "base/stl_util.h" #include "base/strings/pattern.h" #include "base/strings/string_split.h" #include "base/test/launcher/unit_test_launcher.h"
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc index 8629994..61221d4a 100644 --- a/media/gpu/vaapi/vaapi_video_decoder.cc +++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -10,10 +10,10 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/containers/fixed_flat_map.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/trace_event/trace_event.h" #include "build/chromeos_buildflags.h" #include "media/base/bind_to_current_loop.h"
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc index 9dc2729..8fccf1a 100644 --- a/mojo/public/cpp/bindings/lib/multiplex_router.cc +++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc
@@ -9,12 +9,12 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/containers/flat_set.h" #include "base/location.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/sequenced_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/synchronization/waitable_event.h" #include "mojo/public/cpp/bindings/interface_endpoint_client.h"
diff --git a/mojo/public/cpp/bindings/receiver_set.h b/mojo/public/cpp/bindings/receiver_set.h index 783740b2..3121f58b 100644 --- a/mojo/public/cpp/bindings/receiver_set.h +++ b/mojo/public/cpp/bindings/receiver_set.h
@@ -13,9 +13,9 @@ #include "base/bind.h" #include "base/callback.h" #include "base/component_export.h" +#include "base/containers/contains.h" #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "mojo/public/cpp/bindings/connection_error_callback.h" #include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/mojo/public/cpp/bindings/remote_set.h b/mojo/public/cpp/bindings/remote_set.h index 6c826ee..eb98f73 100644 --- a/mojo/public/cpp/bindings/remote_set.h +++ b/mojo/public/cpp/bindings/remote_set.h
@@ -11,10 +11,10 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/containers/contains.h" #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/sequenced_task_runner.h" -#include "base/stl_util.h" #include "base/util/type_safety/id_type.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h"
diff --git a/mojo/public/cpp/bindings/service_factory.cc b/mojo/public/cpp/bindings/service_factory.cc index 1263b3d..9457381 100644 --- a/mojo/public/cpp/bindings/service_factory.cc +++ b/mojo/public/cpp/bindings/service_factory.cc
@@ -5,7 +5,7 @@ #include "mojo/public/cpp/bindings/service_factory.h" #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" namespace mojo {
diff --git a/net/base/expiring_cache_unittest.cc b/net/base/expiring_cache_unittest.cc index 1f3c5d38..536b954 100644 --- a/net/base/expiring_cache_unittest.cc +++ b/net/base/expiring_cache_unittest.cc
@@ -7,7 +7,7 @@ #include <functional> #include <string> -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/stringprintf.h" #include "base/time/time.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/net/base/filename_util_internal.cc b/net/base/filename_util_internal.cc index 90b8b40..ddb94271 100644 --- a/net/base/filename_util_internal.cc +++ b/net/base/filename_util_internal.cc
@@ -4,9 +4,9 @@ #include "net/base/filename_util.h" +#include "base/containers/contains.h" #include "base/files/file_path.h" #include "base/files/file_util.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h"
diff --git a/net/base/mime_util_unittest.cc b/net/base/mime_util_unittest.cc index 176b458..060caed 100644 --- a/net/base/mime_util_unittest.cc +++ b/net/base/mime_util_unittest.cc
@@ -4,7 +4,7 @@ #include "net/base/mime_util.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h"
diff --git a/net/dns/dns_util.cc b/net/dns/dns_util.cc index 09e1dce..ae4e063 100644 --- a/net/dns/dns_util.cc +++ b/net/dns/dns_util.cc
@@ -13,10 +13,10 @@ #include <vector> #include "base/big_endian.h" +#include "base/containers/contains.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram_macros.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "build/build_config.h"
diff --git a/net/http/http_auth_handler_factory.cc b/net/http/http_auth_handler_factory.cc index 3f065ce..4617186a 100644 --- a/net/http/http_auth_handler_factory.cc +++ b/net/http/http_auth_handler_factory.cc
@@ -6,8 +6,8 @@ #include <set> +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "build/build_config.h" #include "net/base/net_errors.h"
diff --git a/net/http/http_server_properties.cc b/net/http/http_server_properties.cc index 7f67a27..037d6b4 100644 --- a/net/http/http_server_properties.cc +++ b/net/http/http_server_properties.cc
@@ -6,11 +6,11 @@ #include "base/bind.h" #include "base/check_op.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/location.h" #include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc index 652c9432..7b1904c 100644 --- a/net/http/http_stream_factory_job.cc +++ b/net/http/http_stream_factory_job.cc
@@ -11,13 +11,13 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/check_op.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/location.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/notreached.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc index 5044657..b47f43a 100644 --- a/net/http/transport_security_state.cc +++ b/net/http/transport_security_state.cc
@@ -13,6 +13,7 @@ #include "base/base64.h" #include "base/bind.h" #include "base/build_time.h" +#include "base/containers/contains.h" #include "base/containers/span.h" #include "base/feature_list.h" #include "base/json/json_writer.h" @@ -22,7 +23,6 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h"
diff --git a/net/quic/platform/impl/quic_map_util_impl.h b/net/quic/platform/impl/quic_map_util_impl.h index c25e1c4..006877a9 100644 --- a/net/quic/platform/impl/quic_map_util_impl.h +++ b/net/quic/platform/impl/quic_map_util_impl.h
@@ -5,7 +5,7 @@ #ifndef NET_QUIC_PLATFORM_IMPL_QUIC_MAP_UTIL_IMPL_H_ #define NET_QUIC_PLATFORM_IMPL_QUIC_MAP_UTIL_IMPL_H_ -#include "base/stl_util.h" +#include "base/containers/contains.h" namespace quic {
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index bffd7d9..9575411 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/location.h" #include "base/memory/ptr_util.h" @@ -16,7 +17,6 @@ #include "base/metrics/sparse_histogram.h" #include "base/no_destructor.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/task/post_task.h"
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc index 9f249ae0..8f353ba 100644 --- a/net/spdy/spdy_session.cc +++ b/net/spdy/spdy_session.cc
@@ -11,12 +11,12 @@ #include <utility> #include "base/bind.h" +#include "base/containers/contains.h" #include "base/location.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/abseil_string_conversions.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h"
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc index 8841902..53a1201 100644 --- a/net/spdy/spdy_session_pool.cc +++ b/net/spdy/spdy_session_pool.cc
@@ -9,8 +9,8 @@ #include "base/bind.h" #include "base/check_op.h" +#include "base/containers/contains.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_allocator_dump.h"
diff --git a/net/url_request/url_request_job_factory.cc b/net/url_request/url_request_job_factory.cc index dceb26f..8ff76c5 100644 --- a/net/url_request/url_request_job_factory.cc +++ b/net/url_request/url_request_job_factory.cc
@@ -4,7 +4,7 @@ #include "net/url_request/url_request_job_factory.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "net/base/net_errors.h" #include "net/net_buildflags.h" #include "net/url_request/url_request.h"
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn index 796e3d7..16b6986 100644 --- a/pdf/BUILD.gn +++ b/pdf/BUILD.gn
@@ -355,6 +355,8 @@ "test/test_client.h", "test/test_document_loader.cc", "test/test_document_loader.h", + "test/test_helpers.cc", + "test/test_helpers.h", ] configs += [ ":common" ] @@ -365,6 +367,7 @@ "//base", "//ppapi/cpp:objects", "//testing/gtest", + "//ui/gfx:geometry_skia", "//ui/gfx/range", ] }
diff --git a/pdf/ppapi_migration/graphics_unittest.cc b/pdf/ppapi_migration/graphics_unittest.cc index 5e096bd..2269534 100644 --- a/pdf/ppapi_migration/graphics_unittest.cc +++ b/pdf/ppapi_migration/graphics_unittest.cc
@@ -12,6 +12,7 @@ #include "pdf/ppapi_migration/bitmap.h" #include "pdf/ppapi_migration/callback.h" #include "pdf/ppapi_migration/image.h" +#include "pdf/test/test_helpers.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkImage.h" @@ -38,12 +39,6 @@ sk_sp<SkImage> snapshot; }; -Image CreateSourceImage(const SkISize& src_size) { - SkBitmap bitmap = CreateN32PremulSkBitmap(src_size); - bitmap.eraseColor(SK_ColorRED); - return Image(bitmap); -} - SkBitmap GenerateExpectedBitmap(const SkISize& graphics_size, const SkIRect& rect) { SkBitmap bitmap = CreateN32PremulSkBitmap(graphics_size); @@ -70,7 +65,7 @@ class SkiaGraphicsTest : public testing::Test { protected: void TestPaintImageResult(const SkISize& graphics_size, - const SkISize& src_size, + const gfx::Size& src_size, const gfx::Rect& paint_rect, const SkIRect& overlapped_rect) { graphics_ = @@ -78,7 +73,8 @@ ASSERT_TRUE(graphics_); // Create snapshots as SkImage and SkBitmap after painting. - graphics_->PaintImage(CreateSourceImage(src_size), paint_rect); + graphics_->PaintImage(CreateSkiaImageForTesting(src_size, SK_ColorRED), + paint_rect); graphics_->Flush(base::DoNothing()); SkBitmap snapshot_bitmap; ASSERT_TRUE(client_.snapshot->asLegacyBitmap(&snapshot_bitmap)); @@ -159,7 +155,7 @@ SkISize graphics_size; // Size of the source image. - SkISize src_size; + gfx::Size src_size; // Painting area. gfx::Rect paint_rect;
diff --git a/pdf/test/test_helpers.cc b/pdf/test/test_helpers.cc new file mode 100644 index 0000000..e4fafbc --- /dev/null +++ b/pdf/test/test_helpers.cc
@@ -0,0 +1,21 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "pdf/test/test_helpers.h" + +#include "pdf/ppapi_migration/bitmap.h" +#include "pdf/ppapi_migration/image.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/gfx/skia_util.h" + +namespace chrome_pdf { + +Image CreateSkiaImageForTesting(const gfx::Size& size, SkColor color) { + SkBitmap bitmap = CreateN32PremulSkBitmap(gfx::SizeToSkISize(size)); + bitmap.eraseColor(color); + return Image(bitmap); +} + +} // namespace chrome_pdf
diff --git a/pdf/test/test_helpers.h b/pdf/test/test_helpers.h new file mode 100644 index 0000000..28b7c89 --- /dev/null +++ b/pdf/test/test_helpers.h
@@ -0,0 +1,22 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PDF_TEST_TEST_HELPERS_H_ +#define PDF_TEST_TEST_HELPERS_H_ + +#include "pdf/ppapi_migration/image.h" +#include "third_party/skia/include/core/SkColor.h" + +namespace gfx { +class Size; +} // namespace gfx + +namespace chrome_pdf { + +// Creates a Skia-format `Image` of a given size filled with a given color. +Image CreateSkiaImageForTesting(const gfx::Size& size, SkColor color); + +} // namespace chrome_pdf + +#endif // PDF_TEST_TEST_HELPERS_H_
diff --git a/ppapi/proxy/file_system_resource.cc b/ppapi/proxy/file_system_resource.cc index 5bb5e2a7..2d58afe8 100644 --- a/ppapi/proxy/file_system_resource.cc +++ b/ppapi/proxy/file_system_resource.cc
@@ -6,7 +6,7 @@ #include "base/barrier_closure.h" #include "base/bind.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "ipc/ipc_message.h" #include "ppapi/c/pp_errors.h" #include "ppapi/proxy/ppapi_messages.h"
diff --git a/printing/BUILD.gn b/printing/BUILD.gn index d5626f9..f49826d5 100644 --- a/printing/BUILD.gn +++ b/printing/BUILD.gn
@@ -15,9 +15,6 @@ if (is_android) { import("//build/config/android/rules.gni") } -if (use_cups && is_chromeos_ash) { - import("//printing/backend/tools/code_generator.gni") -} assert(enable_basic_printing) @@ -28,20 +25,44 @@ "set enable_pdf=true.") } -# Enable the CUPS IPP printing backend. -# TODO(crbug.com/226176): Remove this after CUPS PPD API calls are removed. -declare_args() { - use_cups_ipp = use_cups && !(is_linux || is_chromeos_lacros) -} - -if (use_cups_ipp && is_chromeos_ash) { - ipp_handler_map_path = "$target_gen_dir/backend/ipp_handler_map.cc" - - ipp_code_generate("ipp_handlers_generate") { - outputs = [ ipp_handler_map_path ] - args = [ "--ipp-handler-map=" + - rebase_path(ipp_handler_map_path, root_build_dir) ] +# Lower-dependency base printing files which are needed by both :printing and +# //printing/backend without incurring deeper UI dependencies (e.g., +# //ui/accessibility). New files should normally be added to :printing, and +# only be moved here if they are also required by //printing/backend. +component("printing_base") { + sources = [ + "print_job_constants.cc", + "print_job_constants.h", + "printing_features.cc", + "printing_features.h", + "printing_utils.cc", + "printing_utils.h", + "units.cc", + "units.h", + ] + if (use_cups_ipp || is_chromeos_ash) { + sources += [ + "printer_query_result.h", + "printer_status.cc", + "printer_status.h", + ] } + + if (use_cups) { + configs += [ ":cups" ] + } + + configs += [ "//build/config/compiler:noshadowing" ] + cflags = [] + defines = [ "IS_PRINTING_BASE_IMPL" ] + + public_deps = [ "//build:chromeos_buildflags" ] + deps = [ + "//base", + "//third_party/icu", + "//ui/gfx", + "//ui/gfx/geometry", + ] } if (is_linux || is_chromeos) { @@ -61,15 +82,6 @@ component("printing") { sources = [ - "backend/print_backend.cc", - "backend/print_backend.h", - "backend/print_backend_consts.cc", - "backend/print_backend_consts.h", - "backend/print_backend_dummy.cc", - "backend/print_backend_utils.cc", - "backend/print_backend_utils.h", - "backend/printing_restrictions.cc", - "backend/printing_restrictions.h", "metafile.cc", "metafile.h", "metafile_skia.cc", @@ -85,8 +97,6 @@ "page_setup.h", "pdf_render_settings.h", "print_dialog_gtk_interface.h", - "print_job_constants.cc", - "print_job_constants.h", "print_settings.cc", "print_settings.h", "print_settings_conversion.cc", @@ -95,20 +105,18 @@ "printed_document.h", "printing_context.cc", "printing_context.h", - "printing_features.cc", - "printing_features.h", - "printing_utils.cc", - "printing_utils.h", "pwg_raster_settings.h", - "units.cc", - "units.h", ] configs += [ "//build/config/compiler:noshadowing" ] cflags = [] defines = [ "IS_PRINTING_IMPL" ] - public_deps = [ "//printing/buildflags" ] + public_deps = [ + ":printing_base", + "//printing/backend", + "//printing/buildflags", + ] deps = [ "//base", "//base:i18n", @@ -139,10 +147,7 @@ } if (is_chromeos_ash) { - defines += [ "PRINT_BACKEND_AVAILABLE" ] - sources += [ - "backend/print_backend_chromeos.cc", "printed_document_chromeos.cc", "printing_context_no_system_dialog.cc", "printing_context_no_system_dialog.h", @@ -175,18 +180,14 @@ "CoreFoundation.framework", "CoreGraphics.framework", ] + + # TODO(crbug.com/1203935) Modernize macOS system API usage so that this + # flag can be removed. + cflags += [ "-Wno-deprecated-declarations" ] } if (is_win) { - # PRINT_BACKEND_AVAILABLE disables the default dummy implementation of the - # print backend and enables a custom implementation instead. - defines += [ "PRINT_BACKEND_AVAILABLE" ] sources += [ - "backend/print_backend_win.cc", - "backend/printing_info_win.cc", - "backend/printing_info_win.h", - "backend/win_helper.cc", - "backend/win_helper.h", "emf_win.cc", "emf_win.h", "print_settings_initializer_win.cc", @@ -208,85 +209,14 @@ if (use_cups) { configs += [ ":cups" ] - if (is_linux || is_chromeos) { - # CUPS 1.6 deprecated the PPD APIs, but we will stay with this API - # for now as the suitability of the replacement is unclear. - # More info: crbug.com/226176 - cflags += [ "-Wno-deprecated-declarations" ] - } - - if (is_mac) { - # CUPS 1.6 deprecated the PPD APIs. We need to evaluate the - # effect of migrating Mac. More info: crbug.com/226176 - cflags += [ "-Wno-deprecated-declarations" ] - } - - # PRINT_BACKEND_AVAILABLE disables the default dummy implementation - # of the print backend and enables a custom implementation instead. - defines += [ "PRINT_BACKEND_AVAILABLE" ] - - if (use_cups_ipp) { - sources += [ - "backend/cups_connection.cc", - "backend/cups_connection.h", - "backend/cups_deleters.cc", - "backend/cups_deleters.h", - "backend/cups_ipp_constants.cc", - "backend/cups_ipp_constants.h", - "backend/cups_ipp_helper.cc", - "backend/cups_ipp_helper.h", - "backend/cups_ipp_utils.cc", - "backend/cups_ipp_utils.h", - "backend/cups_jobs.cc", - "backend/cups_jobs.h", - "backend/cups_printer.cc", - "backend/cups_printer.h", - "backend/print_backend_cups_ipp.cc", - "backend/print_backend_cups_ipp.h", - ] - } - if (is_chromeos_ash) { - deps += [ ":ipp_handlers_generate" ] - sources += [ - "backend/ipp_handler_map.h", - "backend/ipp_handlers.cc", - "backend/ipp_handlers.h", "printing_context_chromeos.cc", "printing_context_chromeos.h", - ipp_handler_map_path, ] - } else { - # TODO(crbug.com/1062136): Remove the original CUPS backend for macOS - # when Cloud Print support is terminated. Follow up after Jan 1, 2021. - sources += [ - "backend/cups_helper.cc", - "backend/cups_helper.h", - "backend/print_backend_cups.cc", - "backend/print_backend_cups.h", - ] - - # We still build the utils for fuzzing if not already built. - if (use_fuzzing_engine && !use_cups_ipp) { - sources += [ - "backend/cups_ipp_constants.cc", - "backend/cups_ipp_constants.h", - "backend/cups_ipp_helper.cc", - "backend/cups_ipp_helper.h", - ] - } } } - if (use_cups_ipp || is_chromeos_ash) { - sources += [ - "printer_query_result.h", - "printer_status.cc", - "printer_status.h", - ] - } - if (is_linux || is_chromeos) { deps += [ ":printing_sandbox_hook" ] } @@ -295,8 +225,6 @@ static_library("test_support") { testonly = true sources = [ - "backend/test_print_backend.cc", - "backend/test_print_backend.h", "image.cc", "image.h", ] @@ -304,6 +232,7 @@ configs += [ "//build/config/compiler:noshadowing" ] public_deps = [ "//printing", + "//printing/backend:test_support", "//ui/gfx/geometry", ] deps = [ @@ -353,6 +282,8 @@ "//build:chromeos_buildflags", "//mojo/core/test:run_all_unittests", "//mojo/public/cpp/test_support:test_utils", + "//printing/backend", + "//printing/backend:test_support", "//printing/backend/mojom", "//printing/common", "//printing/mojom",
diff --git a/printing/backend/BUILD.gn b/printing/backend/BUILD.gn new file mode 100644 index 0000000..f73883cd --- /dev/null +++ b/printing/backend/BUILD.gn
@@ -0,0 +1,154 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/chromeos/ui_mode.gni") +import("//printing/buildflags/buildflags.gni") +if (use_cups && is_chromeos_ash) { + import("//printing/backend/tools/code_generator.gni") +} + +if (use_cups_ipp && is_chromeos_ash) { + ipp_handler_map_path = "$target_gen_dir/backend/ipp_handler_map.cc" + + ipp_code_generate("ipp_handlers_generate") { + outputs = [ ipp_handler_map_path ] + args = [ "--ipp-handler-map=" + + rebase_path(ipp_handler_map_path, root_build_dir) ] + } +} + +component("backend") { + sources = [ + "print_backend.cc", + "print_backend.h", + "print_backend_consts.cc", + "print_backend_consts.h", + "print_backend_dummy.cc", + "print_backend_utils.cc", + "print_backend_utils.h", + "printing_restrictions.cc", + "printing_restrictions.h", + ] + + configs += [ "//build/config/compiler:noshadowing" ] + cflags = [] + defines = [ "IS_PRINT_BACKEND_IMPL" ] + + public_deps = [ "//printing/buildflags" ] + deps = [ + "//base", + "//build:chromeos_buildflags", + "//printing:printing_base", + "//printing/mojom", + "//ui/gfx/geometry", + "//url", + ] + + if (is_chromeos_ash) { + # PRINT_BACKEND_AVAILABLE disables the default dummy implementation + # print backend and enables a custom implementation instead. + defines += [ "PRINT_BACKEND_AVAILABLE" ] + + sources += [ "print_backend_chromeos.cc" ] + } + + if (is_win) { + # PRINT_BACKEND_AVAILABLE disables the default dummy implementation of the + # print backend and enables a custom implementation instead. + defines += [ "PRINT_BACKEND_AVAILABLE" ] + sources += [ + "print_backend_win.cc", + "printing_info_win.cc", + "printing_info_win.h", + "win_helper.cc", + "win_helper.h", + ] + } + + if (use_cups) { + configs += [ "//printing:cups" ] + + if (is_linux || is_chromeos) { + # CUPS 1.6 deprecated the PPD APIs, but we will stay with this API + # for now as the suitability of the replacement is unclear. + # More info: crbug.com/226176 + cflags += [ "-Wno-deprecated-declarations" ] + } + + if (is_mac) { + # CUPS 1.6 deprecated the PPD APIs. We need to evaluate the + # effect of migrating Mac. More info: crbug.com/226176 + cflags += [ "-Wno-deprecated-declarations" ] + } + + # PRINT_BACKEND_AVAILABLE disables the default dummy implementation + # of the print backend and enables a custom implementation instead. + defines += [ "PRINT_BACKEND_AVAILABLE" ] + + if (use_cups_ipp) { + sources += [ + "cups_connection.cc", + "cups_connection.h", + "cups_deleters.cc", + "cups_deleters.h", + "cups_ipp_constants.cc", + "cups_ipp_constants.h", + "cups_ipp_helper.cc", + "cups_ipp_helper.h", + "cups_ipp_utils.cc", + "cups_ipp_utils.h", + "cups_jobs.cc", + "cups_jobs.h", + "cups_printer.cc", + "cups_printer.h", + "print_backend_cups_ipp.cc", + "print_backend_cups_ipp.h", + ] + } + + if (is_chromeos_ash) { + deps += [ ":ipp_handlers_generate" ] + + sources += [ + "ipp_handler_map.h", + "ipp_handlers.cc", + "ipp_handlers.h", + ipp_handler_map_path, + ] + } else { + # TODO(crbug.com/1062136): Remove the original CUPS backend for macOS + # when Cloud Print support is terminated. Follow up after Jan 1, 2021. + sources += [ + "cups_helper.cc", + "cups_helper.h", + "print_backend_cups.cc", + "print_backend_cups.h", + ] + + # We still build the utils for fuzzing if not already built. + if (use_fuzzing_engine && !use_cups_ipp) { + sources += [ + "cups_ipp_constants.cc", + "cups_ipp_constants.h", + "cups_ipp_helper.cc", + "cups_ipp_helper.h", + ] + } + } + } +} + +source_set("test_support") { + testonly = true + sources = [ + "test_print_backend.cc", + "test_print_backend.h", + ] + + configs += [ "//build/config/compiler:noshadowing" ] + deps = [ + ":backend", + "//base", + ] +}
diff --git a/printing/backend/cups_connection.h b/printing/backend/cups_connection.h index 0f9f7830..1d08c90 100644 --- a/printing/backend/cups_connection.h +++ b/printing/backend/cups_connection.h
@@ -22,7 +22,7 @@ namespace printing { // Represents the status of a printer queue. -struct COMPONENT_EXPORT(PRINTING) QueueStatus { +struct COMPONENT_EXPORT(PRINT_BACKEND) QueueStatus { QueueStatus(); QueueStatus(const QueueStatus& other); ~QueueStatus(); @@ -32,7 +32,7 @@ }; // Represents a connection to a CUPS server. -class COMPONENT_EXPORT(PRINTING) CupsConnection { +class COMPONENT_EXPORT(PRINT_BACKEND) CupsConnection { public: virtual ~CupsConnection() = default;
diff --git a/printing/backend/cups_deleters.h b/printing/backend/cups_deleters.h index 1d455b6d..9124e6a 100644 --- a/printing/backend/cups_deleters.h +++ b/printing/backend/cups_deleters.h
@@ -12,19 +12,19 @@ namespace printing { -struct COMPONENT_EXPORT(PRINTING) HttpDeleter { +struct COMPONENT_EXPORT(PRINT_BACKEND) HttpDeleter { void operator()(http_t* http) const; }; -struct COMPONENT_EXPORT(PRINTING) DestinationDeleter { +struct COMPONENT_EXPORT(PRINT_BACKEND) DestinationDeleter { void operator()(cups_dest_t* dest) const; }; -struct COMPONENT_EXPORT(PRINTING) DestInfoDeleter { +struct COMPONENT_EXPORT(PRINT_BACKEND) DestInfoDeleter { void operator()(cups_dinfo_t* info) const; }; -struct COMPONENT_EXPORT(PRINTING) OptionDeleter { +struct COMPONENT_EXPORT(PRINT_BACKEND) OptionDeleter { void operator()(cups_option_t* option) const; };
diff --git a/printing/backend/cups_helper.h b/printing/backend/cups_helper.h index 38f64668..3b6fb68 100644 --- a/printing/backend/cups_helper.h +++ b/printing/backend/cups_helper.h
@@ -19,7 +19,7 @@ // Helper wrapper around http_t structure, with connection and cleanup // functionality. -class COMPONENT_EXPORT(PRINTING) HttpConnectionCUPS { +class COMPONENT_EXPORT(PRINT_BACKEND) HttpConnectionCUPS { public: HttpConnectionCUPS(const GURL& print_server_url, http_encryption_t encryption, @@ -34,7 +34,7 @@ // Helper function to parse and convert PPD capabilitites to // semantic options. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) bool ParsePpdCapabilities(cups_dest_t* dest, base::StringPiece locale, base::StringPiece printer_capabilities,
diff --git a/printing/backend/cups_ipp_constants.h b/printing/backend/cups_ipp_constants.h index 6348f328..f3e0e3ce 100644 --- a/printing/backend/cups_ipp_constants.h +++ b/printing/backend/cups_ipp_constants.h
@@ -11,29 +11,29 @@ namespace printing { // property names -COMPONENT_EXPORT(PRINTING) extern const char kIppCollate[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppCopies[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppColor[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppMedia[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppDuplex[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppRequestingUserName[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppResolution[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppPin[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppPinEncryption[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppCollate[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppCopies[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppColor[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppMedia[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppDuplex[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppRequestingUserName[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppResolution[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppPin[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppPinEncryption[]; // collation values -COMPONENT_EXPORT(PRINTING) extern const char kCollated[]; -COMPONENT_EXPORT(PRINTING) extern const char kUncollated[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCollated[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kUncollated[]; #if BUILDFLAG(IS_CHROMEOS_ASH) -COMPONENT_EXPORT(PRINTING) extern const char kIppDocumentAttributes[]; -COMPONENT_EXPORT(PRINTING) extern const char kIppJobAttributes[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppDocumentAttributes[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kIppJobAttributes[]; -COMPONENT_EXPORT(PRINTING) extern const char kPinEncryptionNone[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kPinEncryptionNone[]; -COMPONENT_EXPORT(PRINTING) extern const char kOptionFalse[]; -COMPONENT_EXPORT(PRINTING) extern const char kOptionTrue[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kOptionFalse[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kOptionTrue[]; #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/printing/backend/cups_ipp_helper.cc b/printing/backend/cups_ipp_helper.cc index 7137f49..13e0ea72 100644 --- a/printing/backend/cups_ipp_helper.cc +++ b/printing/backend/cups_ipp_helper.cc
@@ -10,9 +10,9 @@ #include <string> #include <vector> +#include "base/containers/contains.h" #include "base/logging.h" #include "base/optional.h" -#include "base/stl_util.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h" #include "build/chromeos_buildflags.h"
diff --git a/printing/backend/cups_ipp_helper.h b/printing/backend/cups_ipp_helper.h index b6faae4..f8c0418 100644 --- a/printing/backend/cups_ipp_helper.h +++ b/printing/backend/cups_ipp_helper.h
@@ -19,17 +19,18 @@ using ScopedIppPtr = std::unique_ptr<ipp_t, void (*)(ipp_t*)>; // Returns the default paper setting for `printer`. +COMPONENT_EXPORT(PRINT_BACKEND) PrinterSemanticCapsAndDefaults::Paper DefaultPaper( const CupsOptionProvider& printer); // Populates the `printer_info` object with attributes retrieved using IPP from // `printer`. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) void CapsAndDefaultsFromPrinter(const CupsOptionProvider& printer, PrinterSemanticCapsAndDefaults* printer_info); // Wraps `ipp` in unique_ptr with appropriate deleter -COMPONENT_EXPORT(PRINTING) ScopedIppPtr WrapIpp(ipp_t* ipp); +COMPONENT_EXPORT(PRINT_BACKEND) ScopedIppPtr WrapIpp(ipp_t* ipp); } // namespace printing
diff --git a/printing/backend/cups_jobs.h b/printing/backend/cups_jobs.h index f276740..0cdd7dd9 100644 --- a/printing/backend/cups_jobs.h +++ b/printing/backend/cups_jobs.h
@@ -26,7 +26,7 @@ struct PrinterStatus; // Represents a print job sent to the queue. -struct COMPONENT_EXPORT(PRINTING) CupsJob { +struct COMPONENT_EXPORT(PRINT_BACKEND) CupsJob { // Corresponds to job-state from RFC2911. enum JobState { UNKNOWN, @@ -58,7 +58,7 @@ int processing_started = 0; }; -struct COMPONENT_EXPORT(PRINTING) PrinterInfo { +struct COMPONENT_EXPORT(PRINT_BACKEND) PrinterInfo { PrinterInfo(); PrinterInfo(const PrinterInfo& info); @@ -87,7 +87,7 @@ // Returns the uri for printer with `id` as served by CUPS. Assumes that `id` is // a valid CUPS printer name and performs no error checking or escaping. -std::string COMPONENT_EXPORT(PRINTING) +std::string COMPONENT_EXPORT(PRINT_BACKEND) PrinterUriFromName(const std::string& id); // Extracts structured job information from the `response` for `printer_id`. @@ -102,7 +102,7 @@ // Queries the printer at `address` on `port` with a Get-Printer-Attributes // request to populate `printer_info`. If `encrypted` is true, request is made // using ipps, otherwise, ipp is used. Returns false if the request failed. -PrinterQueryResult COMPONENT_EXPORT(PRINTING) +PrinterQueryResult COMPONENT_EXPORT(PRINT_BACKEND) GetPrinterInfo(const std::string& address, int port, const std::string& resource,
diff --git a/printing/backend/cups_printer.h b/printing/backend/cups_printer.h index e4dc672..2a06f89 100644 --- a/printing/backend/cups_printer.h +++ b/printing/backend/cups_printer.h
@@ -20,7 +20,7 @@ struct PrinterBasicInfo; // Provides information regarding cups options. -class COMPONENT_EXPORT(PRINTING) CupsOptionProvider { +class COMPONENT_EXPORT(PRINT_BACKEND) CupsOptionProvider { public: virtual ~CupsOptionProvider() = default; @@ -48,7 +48,7 @@ // Retrieves information from CUPS printer objects as requested. This class // is only valid as long as the CupsConnection which created it exists as they // share an http connection which the CupsConnection closes on destruction. -class COMPONENT_EXPORT(PRINTING) CupsPrinter : public CupsOptionProvider { +class COMPONENT_EXPORT(PRINT_BACKEND) CupsPrinter : public CupsOptionProvider { public: // Represents the margins that CUPS reports for some given media. // Its members are valued in PWG units (100ths of mm).
diff --git a/printing/backend/mojom/BUILD.gn b/printing/backend/mojom/BUILD.gn index ba216b9d..9cb5ed2 100644 --- a/printing/backend/mojom/BUILD.gn +++ b/printing/backend/mojom/BUILD.gn
@@ -32,8 +32,9 @@ traits_sources = [ "print_backend_mojom_traits.cc" ] traits_headers = [ "print_backend_mojom_traits.h" ] traits_deps = [ + "//base", "//build:chromeos_buildflags", - "//printing:printing", + "//printing/backend", ] }, ]
diff --git a/printing/backend/print_backend.h b/printing/backend/print_backend.h index 092853c..1ca5a20 100644 --- a/printing/backend/print_backend.h +++ b/printing/backend/print_backend.h
@@ -28,7 +28,7 @@ using PrinterBasicInfoOptions = std::map<std::string, std::string>; -struct COMPONENT_EXPORT(PRINTING) PrinterBasicInfo { +struct COMPONENT_EXPORT(PRINT_BACKEND) PrinterBasicInfo { PrinterBasicInfo(); PrinterBasicInfo(const std::string& printer_name, const std::string& display_name, @@ -58,7 +58,7 @@ #if defined(OS_CHROMEOS) -struct COMPONENT_EXPORT(PRINTING) AdvancedCapabilityValue { +struct COMPONENT_EXPORT(PRINT_BACKEND) AdvancedCapabilityValue { AdvancedCapabilityValue(); AdvancedCapabilityValue(const std::string& name, const std::string& display_name); @@ -74,7 +74,7 @@ std::string display_name; }; -struct COMPONENT_EXPORT(PRINTING) AdvancedCapability { +struct COMPONENT_EXPORT(PRINT_BACKEND) AdvancedCapability { enum class Type : uint8_t { kBoolean, kFloat, kInteger, kString }; AdvancedCapability(); @@ -109,7 +109,7 @@ #endif // defined(OS_CHROMEOS) -struct COMPONENT_EXPORT(PRINTING) PrinterSemanticCapsAndDefaults { +struct COMPONENT_EXPORT(PRINT_BACKEND) PrinterSemanticCapsAndDefaults { PrinterSemanticCapsAndDefaults(); PrinterSemanticCapsAndDefaults(const PrinterSemanticCapsAndDefaults& other); ~PrinterSemanticCapsAndDefaults(); @@ -130,7 +130,7 @@ mojom::ColorModel color_model = mojom::ColorModel::kUnknownColorModel; mojom::ColorModel bw_model = mojom::ColorModel::kUnknownColorModel; - struct COMPONENT_EXPORT(PRINTING) Paper { + struct COMPONENT_EXPORT(PRINT_BACKEND) Paper { std::string display_name; std::string vendor_id; gfx::Size size_um; @@ -151,7 +151,7 @@ #endif // defined(OS_CHROMEOS) }; -struct COMPONENT_EXPORT(PRINTING) PrinterCapsAndDefaults { +struct COMPONENT_EXPORT(PRINT_BACKEND) PrinterCapsAndDefaults { PrinterCapsAndDefaults(); PrinterCapsAndDefaults(const PrinterCapsAndDefaults& other); ~PrinterCapsAndDefaults(); @@ -169,7 +169,7 @@ // print system specific. For example, CUPS is available on both Linux and Mac, // but not available on ChromeOS, etc. This design allows us to add more // functionality on some platforms, while reusing core (CUPS) functions. -class COMPONENT_EXPORT(PRINTING) PrintBackend +class COMPONENT_EXPORT(PRINT_BACKEND) PrintBackend : public base::RefCountedThreadSafe<PrintBackend> { public: // Enumerates the list of installed local and network printers.
diff --git a/printing/backend/print_backend_consts.h b/printing/backend/print_backend_consts.h index 600c7d73..c90670a 100644 --- a/printing/backend/print_backend_consts.h +++ b/printing/backend/print_backend_consts.h
@@ -7,22 +7,22 @@ #include "base/component_export.h" -COMPONENT_EXPORT(PRINTING) extern const char kCUPSBlocking[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSEncryption[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSEnterprisePrinter[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSPrintServerURL[]; -COMPONENT_EXPORT(PRINTING) extern const char kDriverInfoTagName[]; -COMPONENT_EXPORT(PRINTING) extern const char kDriverNameTagName[]; -COMPONENT_EXPORT(PRINTING) extern const char kLocationTagName[]; -COMPONENT_EXPORT(PRINTING) extern const char kValueFalse[]; -COMPONENT_EXPORT(PRINTING) extern const char kValueTrue[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSBlocking[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSEncryption[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSEnterprisePrinter[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSPrintServerURL[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDriverInfoTagName[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDriverNameTagName[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kLocationTagName[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kValueFalse[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kValueTrue[]; // CUPS destination option names. -COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptDeviceUri[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterInfo[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterLocation[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterMakeAndModel[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterState[]; -COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterType[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptDeviceUri[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterInfo[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterLocation[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterMakeAndModel[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterState[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kCUPSOptPrinterType[]; #endif // PRINTING_BACKEND_PRINT_BACKEND_CONSTS_H_
diff --git a/printing/backend/print_backend_cups.h b/printing/backend/print_backend_cups.h index 0623192..9f35beab 100644 --- a/printing/backend/print_backend_cups.h +++ b/printing/backend/print_backend_cups.h
@@ -25,10 +25,10 @@ const std::string& locale); // These static functions are exposed here for use in the tests. - COMPONENT_EXPORT(PRINTING) + COMPONENT_EXPORT(PRINT_BACKEND) static bool PrinterBasicInfoFromCUPS(const cups_dest_t& printer, PrinterBasicInfo* printer_info); - COMPONENT_EXPORT(PRINTING) + COMPONENT_EXPORT(PRINT_BACKEND) static std::string PrinterDriverInfoFromCUPS(const cups_dest_t& printer); private:
diff --git a/printing/backend/print_backend_utils.h b/printing/backend/print_backend_utils.h index d2c661e..5f3c37f 100644 --- a/printing/backend/print_backend_utils.h +++ b/printing/backend/print_backend_utils.h
@@ -11,7 +11,7 @@ namespace printing { -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) PrinterSemanticCapsAndDefaults::Paper ParsePaper(base::StringPiece value); } // namespace printing
diff --git a/printing/backend/printing_info_win.h b/printing/backend/printing_info_win.h index 2ee907e..4aad87c 100644 --- a/printing/backend/printing_info_win.h +++ b/printing/backend/printing_info_win.h
@@ -17,8 +17,10 @@ namespace internal { -COMPONENT_EXPORT(PRINTING) uint8_t* GetDriverInfo(HANDLE printer, int level); -COMPONENT_EXPORT(PRINTING) uint8_t* GetPrinterInfo(HANDLE printer, int level); +COMPONENT_EXPORT(PRINT_BACKEND) +uint8_t* GetDriverInfo(HANDLE printer, int level); +COMPONENT_EXPORT(PRINT_BACKEND) +uint8_t* GetPrinterInfo(HANDLE printer, int level); // This class is designed to work with PRINTER_INFO_X structures // and calls GetPrinter internally with correctly allocated buffer.
diff --git a/printing/backend/printing_restrictions.h b/printing/backend/printing_restrictions.h index 149ecfb..f85f590 100644 --- a/printing/backend/printing_restrictions.h +++ b/printing/backend/printing_restrictions.h
@@ -40,12 +40,12 @@ // Dictionary key for printing policies. // Must coincide with the name of field in `print_preview.Policies` in // chrome/browser/resources/print_preview/data/destination.js -COMPONENT_EXPORT(PRINTING) extern const char kAllowedColorModes[]; -COMPONENT_EXPORT(PRINTING) extern const char kAllowedDuplexModes[]; -COMPONENT_EXPORT(PRINTING) extern const char kAllowedPinModes[]; -COMPONENT_EXPORT(PRINTING) extern const char kDefaultColorMode[]; -COMPONENT_EXPORT(PRINTING) extern const char kDefaultDuplexMode[]; -COMPONENT_EXPORT(PRINTING) extern const char kDefaultPinMode[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kAllowedColorModes[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kAllowedDuplexModes[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kAllowedPinModes[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDefaultColorMode[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDefaultDuplexMode[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kDefaultPinMode[]; #endif // BUILDFLAG(IS_CHROMEOS_ASH) // Allowed background graphics modes. @@ -57,11 +57,11 @@ }; // Dictionary keys to be used with `kPrintingPaperSizeDefault` policy. -COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeName[]; -COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeNameCustomOption[]; -COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeCustomSize[]; -COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeWidth[]; -COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeHeight[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kPaperSizeName[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kPaperSizeNameCustomOption[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kPaperSizeCustomSize[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kPaperSizeWidth[]; +COMPONENT_EXPORT(PRINT_BACKEND) extern const char kPaperSizeHeight[]; } // namespace printing
diff --git a/printing/backend/win_helper.h b/printing/backend/win_helper.h index 4b38b627..09aff42 100644 --- a/printing/backend/win_helper.h +++ b/printing/backend/win_helper.h
@@ -26,9 +26,9 @@ // These are helper functions for dealing with Windows Printing. namespace printing { -struct COMPONENT_EXPORT(PRINTING) PrinterBasicInfo; +struct COMPONENT_EXPORT(PRINT_BACKEND) PrinterBasicInfo; -class COMPONENT_EXPORT(PRINTING) PrinterHandleTraits { +class COMPONENT_EXPORT(PRINT_BACKEND) PrinterHandleTraits { public: PrinterHandleTraits() = delete; PrinterHandleTraits(const PrinterHandleTraits&) = delete; @@ -43,14 +43,14 @@ static HANDLE NullHandle() { return nullptr; } }; -class COMPONENT_EXPORT(PRINTING) ScopedPrinterHandle +class COMPONENT_EXPORT(PRINT_BACKEND) ScopedPrinterHandle : public base::win::GenericScopedHandle<PrinterHandleTraits, base::win::DummyVerifierTraits> { public: bool OpenPrinterWithName(const wchar_t* printer); }; -class COMPONENT_EXPORT(PRINTING) PrinterChangeHandleTraits { +class COMPONENT_EXPORT(PRINT_BACKEND) PrinterChangeHandleTraits { public: PrinterChangeHandleTraits() = delete; PrinterChangeHandleTraits(const PrinterChangeHandleTraits&) = delete; @@ -75,7 +75,7 @@ // this would mean having to add that to every binary that links with // printing.lib (which is a LOT of binaries). So choosing the GetProcAddress // route instead). -class COMPONENT_EXPORT(PRINTING) XPSModule { +class COMPONENT_EXPORT(PRINT_BACKEND) XPSModule { public: // All the other methods can ONLY be called after a successful call to Init. // Init can be called many times and by multiple threads. @@ -115,7 +115,7 @@ }; // See comments in cc file explaining why we need this. -class COMPONENT_EXPORT(PRINTING) ScopedXPSInitializer { +class COMPONENT_EXPORT(PRINT_BACKEND) ScopedXPSInitializer { public: ScopedXPSInitializer(); ScopedXPSInitializer(const ScopedXPSInitializer&) = delete; @@ -131,7 +131,7 @@ // Wrapper class to wrap the XPS Print APIs (these are different from the PTxxx // which deal with the XML Print Schema). This is needed because these // APIs are only available on Windows 7 and higher. -class COMPONENT_EXPORT(PRINTING) XPSPrintModule { +class COMPONENT_EXPORT(PRINT_BACKEND) XPSPrintModule { public: // All the other methods can ONLY be called after a successful call to Init. // Init can be called many times and by multiple threads. @@ -153,37 +153,37 @@ }; // Sets the function that gets friendly names for network printers. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) void SetGetDisplayNameFunction( std::string (*get_display_name_func)(const std::string& printer_name)); -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) bool InitBasicPrinterInfo(HANDLE printer, PrinterBasicInfo* printer_info); -COMPONENT_EXPORT(PRINTING) std::string GetDriverInfo(HANDLE printer); +COMPONENT_EXPORT(PRINT_BACKEND) std::string GetDriverInfo(HANDLE printer); -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( const std::wstring& printer_name, const std::string& print_ticket); -COMPONENT_EXPORT(PRINTING) bool IsDevModeWithColor(const DEVMODE* devmode); +COMPONENT_EXPORT(PRINT_BACKEND) bool IsDevModeWithColor(const DEVMODE* devmode); // Creates default DEVMODE and sets color option. Some devices need special // workaround for color. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( HANDLE printer, const std::wstring& printer_name, bool color); // Creates new DEVMODE. If `in` is not NULL copy settings from there. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, DEVMODE* in); // Prompts for new DEVMODE. If `in` is not NULL copy settings from there. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINT_BACKEND) std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( HANDLE printer, const std::wstring& printer_name,
diff --git a/printing/buildflags/buildflags.gni b/printing/buildflags/buildflags.gni index 058e7f7..2fe0c2a 100644 --- a/printing/buildflags/buildflags.gni +++ b/printing/buildflags/buildflags.gni
@@ -11,12 +11,11 @@ declare_args() { # Enable basic printing support and UI. enable_basic_printing = !is_chromecast && !is_ios && !is_fuchsia +} - # Enable printing with print preview. It implies enable_basic_printing. - # Note: It would be convenient to not repeat many of the same conditions in - # enable_basic_printing below. However, GN does not allow the use of - # enable_basic_printing within the same declare_args() block. - enable_print_preview = !is_android && !is_chromecast && !is_ios && !is_fuchsia +declare_args() { + # Enable printing with print preview. + enable_print_preview = enable_basic_printing && !is_android # Enable exporting to tagged PDF. enable_tagged_pdf = !is_android && !is_chromecast && !is_ios && !is_fuchsia @@ -29,3 +28,9 @@ is_mac) && !is_chromecast && !is_fuchsia } } + +declare_args() { + # Enable the CUPS IPP printing backend. + # TODO(crbug.com/226176): Remove this after CUPS PPD API calls are removed. + use_cups_ipp = use_cups && !(is_linux || is_chromeos_lacros) +}
diff --git a/printing/print_job_constants.h b/printing/print_job_constants.h index 5950ba0..cb3f3e2 100644 --- a/printing/print_job_constants.h +++ b/printing/print_job_constants.h
@@ -11,105 +11,165 @@ namespace printing { -COMPONENT_EXPORT(PRINTING) extern const char kIsFirstRequest[]; -COMPONENT_EXPORT(PRINTING) extern const char kPreviewRequestID[]; -COMPONENT_EXPORT(PRINTING) extern const char kPreviewUIID[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingCapabilities[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingCloudPrintId[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingCollate[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingColor[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingSetColorAsDefault[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingContentHeight[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingContentWidth[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingCopies[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingDeviceName[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingDisableScaling[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingDpiDefault[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingDpiHorizontal[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingDpiVertical[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingDuplexMode[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingFitToPageScaling[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterEnabled[]; -COMPONENT_EXPORT(PRINTING) extern const float kSettingHeaderFooterInterstice; -COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterDate[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterTitle[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterURL[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingLandscape[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSize[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeHeightMicrons[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeWidthMicrons[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeVendorId[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeIsDefault[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginBottom[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginLeft[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginRight[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginTop[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginsCustom[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginsType[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewPageCount[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPageRange[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPageRangeFrom[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPageRangeTo[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPageWidth[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPageHeight[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPagesPerSheet[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPinValue[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPolicies[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewIsFromArc[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewIsPdf[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewModifiable[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintToGoogleDrive[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaHeight[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaWidth[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaX[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaY[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterDescription[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterName[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterOptions[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterType[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingRasterizePdf[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingScaleFactor[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingScalingType[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingTicket[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingSendUserInfo[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingShouldPrintBackgrounds[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingShouldPrintSelectionOnly[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingShowSystemDialog[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingUsername[]; -COMPONENT_EXPORT(PRINTING) extern const char kSettingAdvancedSettings[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kIsFirstRequest[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kPreviewRequestID[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kPreviewUIID[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingCapabilities[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingCloudPrintId[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSettingCollate[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSettingColor[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingSetColorAsDefault[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingContentHeight[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingContentWidth[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSettingCopies[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingDeviceName[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingDisableScaling[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingDpiDefault[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingDpiHorizontal[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingDpiVertical[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingDuplexMode[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingFitToPageScaling[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingHeaderFooterEnabled[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const float kSettingHeaderFooterInterstice; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingHeaderFooterDate[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingHeaderFooterTitle[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingHeaderFooterURL[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingLandscape[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMediaSize[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMediaSizeHeightMicrons[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMediaSizeWidthMicrons[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMediaSizeVendorId[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMediaSizeIsDefault[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMarginBottom[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMarginLeft[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMarginRight[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMarginTop[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMarginsCustom[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingMarginsType[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPreviewPageCount[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPageRange[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPageRangeFrom[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPageRangeTo[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPageWidth[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPageHeight[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPagesPerSheet[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSettingPinValue[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSettingPolicies[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPreviewIsFromArc[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPreviewIsPdf[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPreviewModifiable[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrintToGoogleDrive[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrintableAreaHeight[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrintableAreaWidth[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrintableAreaX[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrintableAreaY[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrinterDescription[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrinterName[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrinterOptions[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingPrinterType[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingRasterizePdf[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingScaleFactor[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingScalingType[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSettingTicket[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingSendUserInfo[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingShouldPrintBackgrounds[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingShouldPrintSelectionOnly[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingShowSystemDialog[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSettingUsername[]; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingAdvancedSettings[]; -COMPONENT_EXPORT(PRINTING) extern const int FIRST_PAGE_INDEX; -COMPONENT_EXPORT(PRINTING) extern const int COMPLETE_PREVIEW_DOCUMENT_INDEX; -COMPONENT_EXPORT(PRINTING) extern const char kSettingOpenPDFInPreview[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const int FIRST_PAGE_INDEX; +COMPONENT_EXPORT(PRINTING_BASE) +extern const int COMPLETE_PREVIEW_DOCUMENT_INDEX; +COMPONENT_EXPORT(PRINTING_BASE) +extern const char kSettingOpenPDFInPreview[]; -COMPONENT_EXPORT(PRINTING) extern const uint32_t kInvalidPageIndex; -COMPONENT_EXPORT(PRINTING) extern const uint32_t kMaxPageCount; +COMPONENT_EXPORT(PRINTING_BASE) +extern const uint32_t kInvalidPageIndex; +COMPONENT_EXPORT(PRINTING_BASE) extern const uint32_t kMaxPageCount; #if defined(USE_CUPS) // Printer color models -COMPONENT_EXPORT(PRINTING) extern const char kBlack[]; -COMPONENT_EXPORT(PRINTING) extern const char kCMYK[]; -COMPONENT_EXPORT(PRINTING) extern const char kKCMY[]; -COMPONENT_EXPORT(PRINTING) extern const char kCMY_K[]; -COMPONENT_EXPORT(PRINTING) extern const char kCMY[]; -COMPONENT_EXPORT(PRINTING) extern const char kColor[]; -COMPONENT_EXPORT(PRINTING) extern const char kEpsonColor[]; -COMPONENT_EXPORT(PRINTING) extern const char kEpsonMono[]; -COMPONENT_EXPORT(PRINTING) extern const char kFullColor[]; -COMPONENT_EXPORT(PRINTING) extern const char kGray[]; -COMPONENT_EXPORT(PRINTING) extern const char kGrayscale[]; -COMPONENT_EXPORT(PRINTING) extern const char kGreyscale[]; -COMPONENT_EXPORT(PRINTING) extern const char kMono[]; -COMPONENT_EXPORT(PRINTING) extern const char kMonochrome[]; -COMPONENT_EXPORT(PRINTING) extern const char kNormal[]; -COMPONENT_EXPORT(PRINTING) extern const char kNormalGray[]; -COMPONENT_EXPORT(PRINTING) extern const char kRGB[]; -COMPONENT_EXPORT(PRINTING) extern const char kRGBA[]; -COMPONENT_EXPORT(PRINTING) extern const char kRGB16[]; -COMPONENT_EXPORT(PRINTING) extern const char kSharpCMColor[]; -COMPONENT_EXPORT(PRINTING) extern const char kSharpCMBW[]; -COMPONENT_EXPORT(PRINTING) extern const char kXeroxAutomatic[]; -COMPONENT_EXPORT(PRINTING) extern const char kXeroxBW[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kBlack[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kCMYK[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kKCMY[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kCMY_K[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kCMY[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kColor[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kEpsonColor[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kEpsonMono[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kFullColor[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kGray[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kGrayscale[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kGreyscale[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kMono[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kMonochrome[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kNormal[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kNormalGray[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kRGB[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kRGBA[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kRGB16[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSharpCMColor[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kSharpCMBW[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kXeroxAutomatic[]; +COMPONENT_EXPORT(PRINTING_BASE) extern const char kXeroxBW[]; #endif // Specifies the horizontal alignment of the headers and footers.
diff --git a/printing/printer_query_result.h b/printing/printer_query_result.h index a5fe727..39718db 100644 --- a/printing/printer_query_result.h +++ b/printing/printer_query_result.h
@@ -13,7 +13,7 @@ // This enum is used to record UMA histogram values and should not be // reordered. Please keep in sync with PrinterStatusQueryResult in // src/tools/metrics/histograms/enums.xml. -enum class COMPONENT_EXPORT(PRINTING) PrinterQueryResult { +enum class COMPONENT_EXPORT(PRINTING_BASE) PrinterQueryResult { kUnknownFailure = 0, // catchall error kSuccess = 1, // successful kUnreachable = 2, // failed to reach the host
diff --git a/printing/printer_status.h b/printing/printer_status.h index 5269655..7d86b5d4 100644 --- a/printing/printer_status.h +++ b/printing/printer_status.h
@@ -16,7 +16,7 @@ // Represents the status of a printer containing the properties printer-state, // printer-state-reasons, and printer-state-message. -struct COMPONENT_EXPORT(PRINTING) PrinterStatus { +struct COMPONENT_EXPORT(PRINTING_BASE) PrinterStatus { struct PrinterReason { // This enum is used to record UMA histogram values and should not be // reordered. Please keep in sync with PrinterStatusReasons in
diff --git a/printing/printing_features.h b/printing/printing_features.h index 9dc84aa..c75189cf 100644 --- a/printing/printing_features.h +++ b/printing/printing_features.h
@@ -17,27 +17,32 @@ // documented with descriptions of their behaviors in the .cc file. #if defined(OS_MAC) -COMPONENT_EXPORT(PRINTING) extern const base::Feature kCupsIppPrintingBackend; +COMPONENT_EXPORT(PRINTING_BASE) +extern const base::Feature kCupsIppPrintingBackend; #endif // defined(OS_MAC) #if defined(OS_WIN) -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) extern const base::Feature kPrintWithReducedRasterization; -COMPONENT_EXPORT(PRINTING) extern const base::Feature kUseXpsForPrinting; -COMPONENT_EXPORT(PRINTING) extern const base::Feature kUseXpsForPrintingFromPdf; +COMPONENT_EXPORT(PRINTING_BASE) +extern const base::Feature kUseXpsForPrinting; +COMPONENT_EXPORT(PRINTING_BASE) +extern const base::Feature kUseXpsForPrintingFromPdf; // Helper function to determine if there is any print path which could require // the use of XPS print capabilities. -COMPONENT_EXPORT(PRINTING) bool IsXpsPrintCapabilityRequired(); +COMPONENT_EXPORT(PRINTING_BASE) bool IsXpsPrintCapabilityRequired(); // Helper function to determine if printing of a document from a particular // source should be done using XPS printing API instead of with GDI. -COMPONENT_EXPORT(PRINTING) bool ShouldPrintUsingXps(bool source_is_pdf); +COMPONENT_EXPORT(PRINTING_BASE) +bool ShouldPrintUsingXps(bool source_is_pdf); #endif // defined(OS_WIN) #if defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) || \ defined(OS_CHROMEOS) -COMPONENT_EXPORT(PRINTING) extern const base::Feature kEnableOopPrintDrivers; +COMPONENT_EXPORT(PRINTING_BASE) +extern const base::Feature kEnableOopPrintDrivers; #endif // defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) || // defined(OS_CHROMEOS)
diff --git a/printing/printing_utils.h b/printing/printing_utils.h index 9000dde..2fd4834 100644 --- a/printing/printing_utils.h +++ b/printing/printing_utils.h
@@ -19,18 +19,18 @@ namespace printing { // Simplify title to resolve issue with some drivers. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) std::u16string SimplifyDocumentTitle(const std::u16string& title); -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) std::u16string SimplifyDocumentTitleWithLength(const std::u16string& title, size_t length); -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) std::u16string FormatDocumentTitleWithOwner(const std::u16string& owner, const std::u16string& title); -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) std::u16string FormatDocumentTitleWithOwnerAndLength( const std::u16string& owner, const std::u16string& title, @@ -38,12 +38,12 @@ // Returns the paper size (microns) most common in the locale to the nearest // millimeter. Defaults to ISO A4 for an empty or invalid locale. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) gfx::Size GetDefaultPaperSizeFromLocaleMicrons(base::StringPiece locale); // Returns true if both dimensions of the sizes have a delta less than or equal // to the epsilon value. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) bool SizesEqualWithinEpsilon(const gfx::Size& lhs, const gfx::Size& rhs, int epsilon);
diff --git a/printing/units.h b/printing/units.h index fc78236..7460ded2 100644 --- a/printing/units.h +++ b/printing/units.h
@@ -44,21 +44,23 @@ constexpr float kA3HeightInch = 16.54f; // Converts from one unit system to another using integer arithmetics. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) int ConvertUnit(double value, int old_unit, int new_unit); // Converts from one unit system to another using doubles. -COMPONENT_EXPORT(PRINTING) +COMPONENT_EXPORT(PRINTING_BASE) double ConvertUnitDouble(double value, double old_unit, double new_unit); // Converts from 1 pixel to 1 point using integers. -COMPONENT_EXPORT(PRINTING) int ConvertPixelsToPoint(int pixels); +COMPONENT_EXPORT(PRINTING_BASE) int ConvertPixelsToPoint(int pixels); // Converts from 1 pixel to 1 point using doubles. -COMPONENT_EXPORT(PRINTING) double ConvertPixelsToPointDouble(double pixels); +COMPONENT_EXPORT(PRINTING_BASE) +double ConvertPixelsToPointDouble(double pixels); // Converts from 1 point to 1 pixel using doubles. -COMPONENT_EXPORT(PRINTING) double ConvertPointsToPixelDouble(double points); +COMPONENT_EXPORT(PRINTING_BASE) +double ConvertPointsToPixelDouble(double points); } // namespace printing
diff --git a/services/device/public/cpp/test/fake_usb_device.cc b/services/device/public/cpp/test/fake_usb_device.cc index 22f5190..c1c222a 100644 --- a/services/device/public/cpp/test/fake_usb_device.cc +++ b/services/device/public/cpp/test/fake_usb_device.cc
@@ -11,9 +11,9 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" #include "base/ranges/algorithm.h" -#include "base/stl_util.h" #include "services/device/public/cpp/test/mock_usb_mojo_device.h" #include "services/device/public/cpp/usb/usb_utils.h"
diff --git a/services/device/usb/mojo/device_impl.cc b/services/device/usb/mojo/device_impl.cc index b3668db..976abef5 100644 --- a/services/device/usb/mojo/device_impl.cc +++ b/services/device/usb/mojo/device_impl.cc
@@ -14,9 +14,9 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/containers/contains.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted_memory.h" -#include "base/stl_util.h" #include "services/device/public/cpp/usb/usb_utils.h" #include "services/device/usb/usb_descriptors.h" #include "services/device/usb/usb_device.h"
diff --git a/storage/common/file_system/file_system_util.cc b/storage/common/file_system/file_system_util.cc index 4b457f80..1dba5ce 100644 --- a/storage/common/file_system/file_system_util.cc +++ b/storage/common/file_system/file_system_util.cc
@@ -9,9 +9,9 @@ #include <algorithm> #include "base/check.h" +#include "base/containers/contains.h" #include "base/macros.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" #include "build/build_config.h"
diff --git a/styleguide/web/web.md b/styleguide/web/web.md index c569316..fa4e4e7 100644 --- a/styleguide/web/web.md +++ b/styleguide/web/web.md
@@ -387,6 +387,8 @@ }; } } + +customElements.define(MyAppElement.is, MyAppElement); ``` * Use a consistent ordering for common methods (or, in legacy code, the
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 2973052..7b9e9cd 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -4675,11 +4675,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -4689,7 +4689,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4754,11 +4754,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -4768,7 +4768,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4912,11 +4912,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -4926,7 +4926,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4991,11 +4991,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -5005,7 +5005,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -5155,11 +5155,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -5169,7 +5169,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -5235,11 +5235,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -5249,7 +5249,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -5395,11 +5395,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -5409,7 +5409,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -5475,11 +5475,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -5489,7 +5489,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 75888be..899338c 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -53951,11 +53951,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -53965,7 +53965,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54030,11 +54030,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -54044,7 +54044,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54188,11 +54188,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -54202,7 +54202,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54267,11 +54267,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -54281,7 +54281,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54492,11 +54492,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -54506,7 +54506,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54571,11 +54571,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -54585,7 +54585,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54729,11 +54729,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.100" + "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.101" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.100", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.101", "resultdb": { "enable": true }, @@ -54743,7 +54743,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M90", - "revision": "version:90.0.4430.100" + "revision": "version:90.0.4430.101" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54808,11 +54808,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.28" + "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.29" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.28", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.29", "resultdb": { "enable": true }, @@ -54822,7 +54822,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.28" + "revision": "version:91.0.4472.29" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 95e19f3..c4f364d 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -10286,7 +10286,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -11839,7 +11839,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "idempotent": false, @@ -11867,7 +11867,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "idempotent": false, @@ -12401,7 +12401,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -13748,7 +13748,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "idempotent": false, @@ -13775,7 +13775,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "idempotent": false,
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 0525ab2..833d802 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1172,6 +1172,25 @@ 'shards': 15, }, }, + # TODO(crbug/1199425): Remove it once bionic is the default option. + 'Linux Tests': { + 'swarming': { + 'dimension_sets': [ + { + 'os': 'Ubuntu-18.04', + } + ], + }, + }, + 'Linux Tests (dbg)(1)': { + 'swarming': { + 'dimension_sets': [ + { + 'os': 'Ubuntu-18.04', + } + ], + }, + }, 'Lollipop Phone Tester': { 'swarming': { 'shards': 10, @@ -2658,12 +2677,28 @@ '--xvfb', '--jobs=1', ], + # TODO(crbug/1199425): Remove it once bionic is the default option. + 'swarming': { + 'dimension_sets': [ + { + 'os': 'Ubuntu-18.04', + } + ], + }, }, 'Linux Tests (dbg)(1)': { 'args': [ '--xvfb', '--jobs=1', ], + # TODO(crbug/1199425): Remove it once bionic is the default option. + 'swarming': { + 'dimension_sets': [ + { + 'os': 'Ubuntu-18.04', + } + ], + }, }, # TODO crbug.com/1143924: Remove when experimentation is complete 'Linux Tests Robocrop': { @@ -2746,6 +2781,25 @@ }, 'telemetry_unittests': { 'modifications': { + # TODO(crbug/1199425): Remove it once bionic is the default option. + 'Linux Tests': { + 'swarming': { + 'dimension_sets': [ + { + 'os': 'Ubuntu-18.04', + } + ], + }, + }, + 'Linux Tests (dbg)(1)': { + 'swarming': { + 'dimension_sets': [ + { + 'os': 'Ubuntu-18.04', + } + ], + }, + }, 'Win10 Tests x64 (dbg)': { 'experiment_percentage': 100, # crbug.com/870673 },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 47a8db3..9ad99fc6 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -331,13 +331,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=91', ], - 'identifier': 'Implementation Library Skew Tests For 91.0.4472.28', + 'identifier': 'Implementation Library Skew Tests For 91.0.4472.29', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M91', - 'revision': 'version:91.0.4472.28', + 'revision': 'version:91.0.4472.29', } ], }, @@ -355,13 +355,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=90', ], - 'identifier': 'Implementation Library Skew Tests For 90.0.4430.100', + 'identifier': 'Implementation Library Skew Tests For 90.0.4430.101', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M90', - 'revision': 'version:90.0.4430.100', + 'revision': 'version:90.0.4430.101', } ], }, @@ -403,13 +403,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=91', ], - 'identifier': 'Implementation Library Skew Tests For 91.0.4472.28', + 'identifier': 'Implementation Library Skew Tests For 91.0.4472.29', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M91', - 'revision': 'version:91.0.4472.28', + 'revision': 'version:91.0.4472.29', } ], }, @@ -427,13 +427,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=90', ], - 'identifier': 'Implementation Library Skew Tests For 90.0.4430.100', + 'identifier': 'Implementation Library Skew Tests For 90.0.4430.101', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M90', - 'revision': 'version:90.0.4430.100', + 'revision': 'version:90.0.4430.101', } ], }, @@ -475,13 +475,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--client-version=91', ], - 'identifier': 'Client Library Skew Tests For 91.0.4472.28', + 'identifier': 'Client Library Skew Tests For 91.0.4472.29', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M91', - 'revision': 'version:91.0.4472.28', + 'revision': 'version:91.0.4472.29', } ], }, @@ -499,13 +499,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--client-version=90', ], - 'identifier': 'Client Library Skew Tests For 90.0.4430.100', + 'identifier': 'Client Library Skew Tests For 90.0.4430.101', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M90', - 'revision': 'version:90.0.4430.100', + 'revision': 'version:90.0.4430.101', } ], },
diff --git a/third_party/abseil-cpp/BUILD.gn b/third_party/abseil-cpp/BUILD.gn index d3497e509..e7fbd6c0 100644 --- a/third_party/abseil-cpp/BUILD.gn +++ b/third_party/abseil-cpp/BUILD.gn
@@ -189,6 +189,11 @@ "absl/memory:memory_test", "absl/meta:type_traits_test", "absl/strings:ascii_test", + "absl/strings:cordz_functions_test", + "absl/strings:cordz_info_test", + "absl/strings:cordz_test", + "absl/strings:cordz_update_scope_test", + "absl/strings:cordz_update_tracker_test", "absl/strings:match_test", "absl/strings:str_replace_test", "absl/strings:string_view_test",
diff --git a/third_party/abseil-cpp/CMake/AbseilDll.cmake b/third_party/abseil-cpp/CMake/AbseilDll.cmake index 253c73f..8ee4120 100644 --- a/third_party/abseil-cpp/CMake/AbseilDll.cmake +++ b/third_party/abseil-cpp/CMake/AbseilDll.cmake
@@ -197,16 +197,27 @@ "strings/cord.h" "strings/escaping.cc" "strings/escaping.h" + "strings/internal/charconv_bigint.cc" + "strings/internal/charconv_bigint.h" + "strings/internal/charconv_parse.cc" + "strings/internal/charconv_parse.h" "strings/internal/cord_internal.cc" "strings/internal/cord_internal.h" "strings/internal/cord_rep_flat.h" "strings/internal/cord_rep_ring.cc" "strings/internal/cord_rep_ring.h" "strings/internal/cord_rep_ring_reader.h" - "strings/internal/charconv_bigint.cc" - "strings/internal/charconv_bigint.h" - "strings/internal/charconv_parse.cc" - "strings/internal/charconv_parse.h" + "strings/internal/cordz_functions.cc" + "strings/internal/cordz_functions.h" + "strings/internal/cordz_handle.cc" + "strings/internal/cordz_handle.h" + "strings/internal/cordz_info.cc" + "strings/internal/cordz_info.h" + "strings/internal/cordz_sample_token.cc" + "strings/internal/cordz_sample_token.h" + "strings/internal/cordz_statistics.h" + "strings/internal/cordz_update_scope.h" + "strings/internal/cordz_update_tracker.h" "strings/internal/stl_type_traits.h" "strings/internal/string_constant.h" "strings/match.cc"
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium index 2afaf70..57d8d56b 100644 --- a/third_party/abseil-cpp/README.chromium +++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@ License: Apache 2.0 License File: LICENSE Version: 0 -Revision: db1b7310d7021700b5a7bcea1989b2a625529f40 +Revision: bcc11a8918f8cc9b43c9a0dc5da7b52d48452bd3 Security Critical: yes Description:
diff --git a/third_party/abseil-cpp/absl/algorithm/container.h b/third_party/abseil-cpp/absl/algorithm/container.h index 6398438..1652e7b 100644 --- a/third_party/abseil-cpp/absl/algorithm/container.h +++ b/third_party/abseil-cpp/absl/algorithm/container.h
@@ -905,11 +905,11 @@ // Overload of c_sort() for performing a `comp` comparison other than the // default `operator<`. -template <typename C, typename Compare> -void c_sort(C& c, Compare&& comp) { +template <typename C, typename LessThan> +void c_sort(C& c, LessThan&& comp) { std::sort(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_stable_sort() @@ -925,11 +925,11 @@ // Overload of c_stable_sort() for performing a `comp` comparison other than the // default `operator<`. -template <typename C, typename Compare> -void c_stable_sort(C& c, Compare&& comp) { +template <typename C, typename LessThan> +void c_stable_sort(C& c, LessThan&& comp) { std::stable_sort(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_is_sorted() @@ -944,11 +944,11 @@ // c_is_sorted() overload for performing a `comp` comparison other than the // default `operator<`. -template <typename C, typename Compare> -bool c_is_sorted(const C& c, Compare&& comp) { +template <typename C, typename LessThan> +bool c_is_sorted(const C& c, LessThan&& comp) { return std::is_sorted(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_partial_sort() @@ -966,14 +966,14 @@ // Overload of c_partial_sort() for performing a `comp` comparison other than // the default `operator<`. -template <typename RandomAccessContainer, typename Compare> +template <typename RandomAccessContainer, typename LessThan> void c_partial_sort( RandomAccessContainer& sequence, container_algorithm_internal::ContainerIter<RandomAccessContainer> middle, - Compare&& comp) { + LessThan&& comp) { std::partial_sort(container_algorithm_internal::c_begin(sequence), middle, container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_partial_sort_copy() @@ -994,15 +994,15 @@ // Overload of c_partial_sort_copy() for performing a `comp` comparison other // than the default `operator<`. -template <typename C, typename RandomAccessContainer, typename Compare> +template <typename C, typename RandomAccessContainer, typename LessThan> container_algorithm_internal::ContainerIter<RandomAccessContainer> c_partial_sort_copy(const C& sequence, RandomAccessContainer& result, - Compare&& comp) { + LessThan&& comp) { return std::partial_sort_copy(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), container_algorithm_internal::c_begin(result), container_algorithm_internal::c_end(result), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_is_sorted_until() @@ -1018,12 +1018,12 @@ // Overload of c_is_sorted_until() for performing a `comp` comparison other than // the default `operator<`. -template <typename C, typename Compare> +template <typename C, typename LessThan> container_algorithm_internal::ContainerIter<C> c_is_sorted_until( - C& c, Compare&& comp) { + C& c, LessThan&& comp) { return std::is_sorted_until(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_nth_element() @@ -1043,14 +1043,14 @@ // Overload of c_nth_element() for performing a `comp` comparison other than // the default `operator<`. -template <typename RandomAccessContainer, typename Compare> +template <typename RandomAccessContainer, typename LessThan> void c_nth_element( RandomAccessContainer& sequence, container_algorithm_internal::ContainerIter<RandomAccessContainer> nth, - Compare&& comp) { + LessThan&& comp) { std::nth_element(container_algorithm_internal::c_begin(sequence), nth, container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } //------------------------------------------------------------------------------ @@ -1072,12 +1072,12 @@ // Overload of c_lower_bound() for performing a `comp` comparison other than // the default `operator<`. -template <typename Sequence, typename T, typename Compare> +template <typename Sequence, typename T, typename LessThan> container_algorithm_internal::ContainerIter<Sequence> c_lower_bound( - Sequence& sequence, T&& value, Compare&& comp) { + Sequence& sequence, T&& value, LessThan&& comp) { return std::lower_bound(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<T>(value), std::forward<Compare>(comp)); + std::forward<T>(value), std::forward<LessThan>(comp)); } // c_upper_bound() @@ -1095,12 +1095,12 @@ // Overload of c_upper_bound() for performing a `comp` comparison other than // the default `operator<`. -template <typename Sequence, typename T, typename Compare> +template <typename Sequence, typename T, typename LessThan> container_algorithm_internal::ContainerIter<Sequence> c_upper_bound( - Sequence& sequence, T&& value, Compare&& comp) { + Sequence& sequence, T&& value, LessThan&& comp) { return std::upper_bound(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<T>(value), std::forward<Compare>(comp)); + std::forward<T>(value), std::forward<LessThan>(comp)); } // c_equal_range() @@ -1118,12 +1118,12 @@ // Overload of c_equal_range() for performing a `comp` comparison other than // the default `operator<`. -template <typename Sequence, typename T, typename Compare> +template <typename Sequence, typename T, typename LessThan> container_algorithm_internal::ContainerIterPairType<Sequence, Sequence> -c_equal_range(Sequence& sequence, T&& value, Compare&& comp) { +c_equal_range(Sequence& sequence, T&& value, LessThan&& comp) { return std::equal_range(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<T>(value), std::forward<Compare>(comp)); + std::forward<T>(value), std::forward<LessThan>(comp)); } // c_binary_search() @@ -1140,12 +1140,12 @@ // Overload of c_binary_search() for performing a `comp` comparison other than // the default `operator<`. -template <typename Sequence, typename T, typename Compare> -bool c_binary_search(Sequence&& sequence, T&& value, Compare&& comp) { +template <typename Sequence, typename T, typename LessThan> +bool c_binary_search(Sequence&& sequence, T&& value, LessThan&& comp) { return std::binary_search(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), std::forward<T>(value), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } //------------------------------------------------------------------------------ @@ -1166,14 +1166,14 @@ // Overload of c_merge() for performing a `comp` comparison other than // the default `operator<`. -template <typename C1, typename C2, typename OutputIterator, typename Compare> +template <typename C1, typename C2, typename OutputIterator, typename LessThan> OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result, - Compare&& comp) { + LessThan&& comp) { return std::merge(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), container_algorithm_internal::c_end(c2), result, - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_inplace_merge() @@ -1189,13 +1189,13 @@ // Overload of c_inplace_merge() for performing a merge using a `comp` other // than `operator<`. -template <typename C, typename Compare> +template <typename C, typename LessThan> void c_inplace_merge(C& c, container_algorithm_internal::ContainerIter<C> middle, - Compare&& comp) { + LessThan&& comp) { std::inplace_merge(container_algorithm_internal::c_begin(c), middle, container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_includes() @@ -1213,13 +1213,13 @@ // Overload of c_includes() for performing a merge using a `comp` other than // `operator<`. -template <typename C1, typename C2, typename Compare> -bool c_includes(const C1& c1, const C2& c2, Compare&& comp) { +template <typename C1, typename C2, typename LessThan> +bool c_includes(const C1& c1, const C2& c2, LessThan&& comp) { return std::includes(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), container_algorithm_internal::c_end(c2), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_set_union() @@ -1243,7 +1243,7 @@ // Overload of c_set_union() for performing a merge using a `comp` other than // `operator<`. -template <typename C1, typename C2, typename OutputIterator, typename Compare, +template <typename C1, typename C2, typename OutputIterator, typename LessThan, typename = typename std::enable_if< !container_algorithm_internal::IsUnorderedContainer<C1>::value, void>::type, @@ -1251,12 +1251,12 @@ !container_algorithm_internal::IsUnorderedContainer<C2>::value, void>::type> OutputIterator c_set_union(const C1& c1, const C2& c2, OutputIterator output, - Compare&& comp) { + LessThan&& comp) { return std::set_union(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), container_algorithm_internal::c_end(c2), output, - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_set_intersection() @@ -1280,7 +1280,7 @@ // Overload of c_set_intersection() for performing a merge using a `comp` other // than `operator<`. -template <typename C1, typename C2, typename OutputIterator, typename Compare, +template <typename C1, typename C2, typename OutputIterator, typename LessThan, typename = typename std::enable_if< !container_algorithm_internal::IsUnorderedContainer<C1>::value, void>::type, @@ -1288,12 +1288,12 @@ !container_algorithm_internal::IsUnorderedContainer<C2>::value, void>::type> OutputIterator c_set_intersection(const C1& c1, const C2& c2, - OutputIterator output, Compare&& comp) { + OutputIterator output, LessThan&& comp) { return std::set_intersection(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), container_algorithm_internal::c_end(c2), output, - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_set_difference() @@ -1318,7 +1318,7 @@ // Overload of c_set_difference() for performing a merge using a `comp` other // than `operator<`. -template <typename C1, typename C2, typename OutputIterator, typename Compare, +template <typename C1, typename C2, typename OutputIterator, typename LessThan, typename = typename std::enable_if< !container_algorithm_internal::IsUnorderedContainer<C1>::value, void>::type, @@ -1326,12 +1326,12 @@ !container_algorithm_internal::IsUnorderedContainer<C2>::value, void>::type> OutputIterator c_set_difference(const C1& c1, const C2& c2, - OutputIterator output, Compare&& comp) { + OutputIterator output, LessThan&& comp) { return std::set_difference(container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), container_algorithm_internal::c_end(c2), output, - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_set_symmetric_difference() @@ -1357,7 +1357,7 @@ // Overload of c_set_symmetric_difference() for performing a merge using a // `comp` other than `operator<`. -template <typename C1, typename C2, typename OutputIterator, typename Compare, +template <typename C1, typename C2, typename OutputIterator, typename LessThan, typename = typename std::enable_if< !container_algorithm_internal::IsUnorderedContainer<C1>::value, void>::type, @@ -1366,13 +1366,13 @@ void>::type> OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2, OutputIterator output, - Compare&& comp) { + LessThan&& comp) { return std::set_symmetric_difference( container_algorithm_internal::c_begin(c1), container_algorithm_internal::c_end(c1), container_algorithm_internal::c_begin(c2), container_algorithm_internal::c_end(c2), output, - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } //------------------------------------------------------------------------------ @@ -1391,11 +1391,11 @@ // Overload of c_push_heap() for performing a push operation on a heap using a // `comp` other than `operator<`. -template <typename RandomAccessContainer, typename Compare> -void c_push_heap(RandomAccessContainer& sequence, Compare&& comp) { +template <typename RandomAccessContainer, typename LessThan> +void c_push_heap(RandomAccessContainer& sequence, LessThan&& comp) { std::push_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_pop_heap() @@ -1410,11 +1410,11 @@ // Overload of c_pop_heap() for performing a pop operation on a heap using a // `comp` other than `operator<`. -template <typename RandomAccessContainer, typename Compare> -void c_pop_heap(RandomAccessContainer& sequence, Compare&& comp) { +template <typename RandomAccessContainer, typename LessThan> +void c_pop_heap(RandomAccessContainer& sequence, LessThan&& comp) { std::pop_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_make_heap() @@ -1429,11 +1429,11 @@ // Overload of c_make_heap() for performing heap comparisons using a // `comp` other than `operator<` -template <typename RandomAccessContainer, typename Compare> -void c_make_heap(RandomAccessContainer& sequence, Compare&& comp) { +template <typename RandomAccessContainer, typename LessThan> +void c_make_heap(RandomAccessContainer& sequence, LessThan&& comp) { std::make_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_sort_heap() @@ -1448,11 +1448,11 @@ // Overload of c_sort_heap() for performing heap comparisons using a // `comp` other than `operator<` -template <typename RandomAccessContainer, typename Compare> -void c_sort_heap(RandomAccessContainer& sequence, Compare&& comp) { +template <typename RandomAccessContainer, typename LessThan> +void c_sort_heap(RandomAccessContainer& sequence, LessThan&& comp) { std::sort_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_is_heap() @@ -1467,11 +1467,11 @@ // Overload of c_is_heap() for performing heap comparisons using a // `comp` other than `operator<` -template <typename RandomAccessContainer, typename Compare> -bool c_is_heap(const RandomAccessContainer& sequence, Compare&& comp) { +template <typename RandomAccessContainer, typename LessThan> +bool c_is_heap(const RandomAccessContainer& sequence, LessThan&& comp) { return std::is_heap(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_is_heap_until() @@ -1487,12 +1487,12 @@ // Overload of c_is_heap_until() for performing heap comparisons using a // `comp` other than `operator<` -template <typename RandomAccessContainer, typename Compare> +template <typename RandomAccessContainer, typename LessThan> container_algorithm_internal::ContainerIter<RandomAccessContainer> -c_is_heap_until(RandomAccessContainer& sequence, Compare&& comp) { +c_is_heap_until(RandomAccessContainer& sequence, LessThan&& comp) { return std::is_heap_until(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } //------------------------------------------------------------------------------ @@ -1513,12 +1513,12 @@ // Overload of c_min_element() for performing a `comp` comparison other than // `operator<`. -template <typename Sequence, typename Compare> +template <typename Sequence, typename LessThan> container_algorithm_internal::ContainerIter<Sequence> c_min_element( - Sequence& sequence, Compare&& comp) { + Sequence& sequence, LessThan&& comp) { return std::min_element(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_max_element() @@ -1535,12 +1535,12 @@ // Overload of c_max_element() for performing a `comp` comparison other than // `operator<`. -template <typename Sequence, typename Compare> +template <typename Sequence, typename LessThan> container_algorithm_internal::ContainerIter<Sequence> c_max_element( - Sequence& sequence, Compare&& comp) { + Sequence& sequence, LessThan&& comp) { return std::max_element(container_algorithm_internal::c_begin(sequence), container_algorithm_internal::c_end(sequence), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_minmax_element() @@ -1558,12 +1558,12 @@ // Overload of c_minmax_element() for performing `comp` comparisons other than // `operator<`. -template <typename C, typename Compare> +template <typename C, typename LessThan> container_algorithm_internal::ContainerIterPairType<C, C> -c_minmax_element(C& c, Compare&& comp) { +c_minmax_element(C& c, LessThan&& comp) { return std::minmax_element(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } //------------------------------------------------------------------------------ @@ -1588,15 +1588,15 @@ // Overload of c_lexicographical_compare() for performing a lexicographical // comparison using a `comp` operator instead of `operator<`. -template <typename Sequence1, typename Sequence2, typename Compare> +template <typename Sequence1, typename Sequence2, typename LessThan> bool c_lexicographical_compare(Sequence1&& sequence1, Sequence2&& sequence2, - Compare&& comp) { + LessThan&& comp) { return std::lexicographical_compare( container_algorithm_internal::c_begin(sequence1), container_algorithm_internal::c_end(sequence1), container_algorithm_internal::c_begin(sequence2), container_algorithm_internal::c_end(sequence2), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_next_permutation() @@ -1612,11 +1612,11 @@ // Overload of c_next_permutation() for performing a lexicographical // comparison using a `comp` operator instead of `operator<`. -template <typename C, typename Compare> -bool c_next_permutation(C& c, Compare&& comp) { +template <typename C, typename LessThan> +bool c_next_permutation(C& c, LessThan&& comp) { return std::next_permutation(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } // c_prev_permutation() @@ -1632,11 +1632,11 @@ // Overload of c_prev_permutation() for performing a lexicographical // comparison using a `comp` operator instead of `operator<`. -template <typename C, typename Compare> -bool c_prev_permutation(C& c, Compare&& comp) { +template <typename C, typename LessThan> +bool c_prev_permutation(C& c, LessThan&& comp) { return std::prev_permutation(container_algorithm_internal::c_begin(c), container_algorithm_internal::c_end(c), - std::forward<Compare>(comp)); + std::forward<LessThan>(comp)); } //------------------------------------------------------------------------------
diff --git a/third_party/abseil-cpp/absl/base/attributes.h b/third_party/abseil-cpp/absl/base/attributes.h index 294e5d0..d710f28 100644 --- a/third_party/abseil-cpp/absl/base/attributes.h +++ b/third_party/abseil-cpp/absl/base/attributes.h
@@ -281,10 +281,7 @@ // ABSL_ATTRIBUTE_RETURNS_NONNULL // // Tells the compiler that a particular function never returns a null pointer. -#if ABSL_HAVE_ATTRIBUTE(returns_nonnull) || \ - (defined(__GNUC__) && \ - (__GNUC__ > 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) && \ - !defined(__clang__)) +#if ABSL_HAVE_ATTRIBUTE(returns_nonnull) #define ABSL_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull)) #else #define ABSL_ATTRIBUTE_RETURNS_NONNULL @@ -622,7 +619,7 @@ #if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough") #define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]] #endif -#elif defined(__GNUC__) && __GNUC__ >= 7 +#elif ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(7, 0) #define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]] #endif
diff --git a/third_party/abseil-cpp/absl/base/config.h b/third_party/abseil-cpp/absl/base/config.h index 7abc75a..0524196 100644 --- a/third_party/abseil-cpp/absl/base/config.h +++ b/third_party/abseil-cpp/absl/base/config.h
@@ -166,6 +166,22 @@ #define ABSL_HAVE_FEATURE(f) 0 #endif +// Portable check for GCC minimum version: +// https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html +#if defined(__GNUC__) && defined(__GNUC_MINOR__) +#define ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(x, y) \ + (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) +#else +#define ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(x, y) 0 +#endif + +#if defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__) +#define ABSL_INTERNAL_HAVE_MIN_CLANG_VERSION(x, y) \ + (__clang_major__ > (x) || __clang_major__ == (x) && __clang_minor__ >= (y)) +#else +#define ABSL_INTERNAL_HAVE_MIN_CLANG_VERSION(x, y) 0 +#endif + // ABSL_HAVE_TLS is defined to 1 when __thread should be supported. // We assume __thread is supported on Linux when compiled with Clang or compiled // against libstdc++ with _GLIBCXX_HAVE_TLS defined. @@ -183,10 +199,9 @@ // gcc >= 4.8.1 using libstdc++, and Visual Studio. #ifdef ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE #error ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE cannot be directly set -#elif defined(_LIBCPP_VERSION) || \ - (!defined(__clang__) && defined(__GNUC__) && defined(__GLIBCXX__) && \ - (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || \ - defined(_MSC_VER) +#elif defined(_LIBCPP_VERSION) || defined(_MSC_VER) || \ + (!defined(__clang__) && defined(__GLIBCXX__) && \ + ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(4, 8)) #define ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE 1 #endif @@ -205,10 +220,9 @@ #error ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE cannot be directly set #elif defined(ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE) #error ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE cannot directly set -#elif (defined(__clang__) && defined(_LIBCPP_VERSION)) || \ - (!defined(__clang__) && defined(__GNUC__) && \ - (__GNUC__ > 7 || (__GNUC__ == 7 && __GNUC_MINOR__ >= 4)) && \ - (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__))) || \ +#elif (defined(__clang__) && defined(_LIBCPP_VERSION)) || \ + (!defined(__clang__) && ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(7, 4) && \ + (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__))) || \ (defined(_MSC_VER) && !defined(__NVCC__)) #define ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE 1 #define ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE 1 @@ -222,7 +236,7 @@ #if ABSL_INTERNAL_HAS_KEYWORD(__builtin_LINE) && \ ABSL_INTERNAL_HAS_KEYWORD(__builtin_FILE) #define ABSL_HAVE_SOURCE_LOCATION_CURRENT 1 -#elif defined(__GNUC__) && __GNUC__ >= 5 +#elif ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(5, 0) #define ABSL_HAVE_SOURCE_LOCATION_CURRENT 1 #endif #endif @@ -319,25 +333,21 @@ // For further details, consult the compiler's documentation. #ifdef ABSL_HAVE_EXCEPTIONS #error ABSL_HAVE_EXCEPTIONS cannot be directly set. - -#elif defined(__clang__) - -#if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6) +#elif ABSL_INTERNAL_HAVE_MIN_CLANG_VERSION(3, 6) // Clang >= 3.6 #if ABSL_HAVE_FEATURE(cxx_exceptions) #define ABSL_HAVE_EXCEPTIONS 1 #endif // ABSL_HAVE_FEATURE(cxx_exceptions) -#else +#elif defined(__clang__) // Clang < 3.6 // http://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html#the-exceptions-macro #if defined(__EXCEPTIONS) && ABSL_HAVE_FEATURE(cxx_exceptions) #define ABSL_HAVE_EXCEPTIONS 1 #endif // defined(__EXCEPTIONS) && ABSL_HAVE_FEATURE(cxx_exceptions) -#endif // __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6) - // Handle remaining special cases and default to exceptions being supported. -#elif !(defined(__GNUC__) && (__GNUC__ < 5) && !defined(__EXCEPTIONS)) && \ - !(defined(__GNUC__) && (__GNUC__ >= 5) && !defined(__cpp_exceptions)) && \ +#elif !(defined(__GNUC__) && (__GNUC__ < 5) && !defined(__EXCEPTIONS)) && \ + !(ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(5, 0) && \ + !defined(__cpp_exceptions)) && \ !(defined(_MSC_VER) && !defined(_CPPUNWIND)) #define ABSL_HAVE_EXCEPTIONS 1 #endif
diff --git a/third_party/abseil-cpp/absl/base/dynamic_annotations.h b/third_party/abseil-cpp/absl/base/dynamic_annotations.h index bf874db9..065bd5b 100644 --- a/third_party/abseil-cpp/absl/base/dynamic_annotations.h +++ b/third_party/abseil-cpp/absl/base/dynamic_annotations.h
@@ -468,7 +468,7 @@ __sanitizer_annotate_contiguous_container(beg, end, old_mid, new_mid) #define ABSL_ADDRESS_SANITIZER_REDZONE(name) \ struct { \ - char x[8] __attribute__((aligned(8))); \ + alignas(8) char x[8]; \ } name #else
diff --git a/third_party/abseil-cpp/absl/container/internal/hash_generator_testing.h b/third_party/abseil-cpp/absl/container/internal/hash_generator_testing.h index 6869fe4..f1f555a5 100644 --- a/third_party/abseil-cpp/absl/container/internal/hash_generator_testing.h +++ b/third_party/abseil-cpp/absl/container/internal/hash_generator_testing.h
@@ -21,11 +21,13 @@ #include <stdint.h> #include <algorithm> +#include <cassert> #include <iosfwd> #include <random> #include <tuple> #include <type_traits> #include <utility> +#include <vector> #include "absl/container/internal/hash_policy_testing.h" #include "absl/memory/memory.h" @@ -153,6 +155,25 @@ typename Container::value_type, typename Container::key_type>::type>&>()()); +// Naive wrapper that performs a linear search of previous values. +// Beware this is O(SQR), which is reasonable for smaller kMaxValues. +template <class T, size_t kMaxValues = 64, class E = void> +struct UniqueGenerator { + Generator<T, E> gen; + std::vector<T> values; + + T operator()() { + assert(values.size() < kMaxValues); + for (;;) { + T value = gen(); + if (std::find(values.begin(), values.end(), value) == values.end()) { + values.push_back(value); + return value; + } + } + } +}; + } // namespace hash_internal } // namespace container_internal ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h b/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h index 3f90ad7..c1d20f3c 100644 --- a/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +++ b/third_party/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h
@@ -179,7 +179,7 @@ A alloc(0); std::vector<T> values; std::generate_n(std::back_inserter(values), 10, - hash_internal::Generator<T>()); + hash_internal::UniqueGenerator<T>()); TypeParam m(values.begin(), values.end(), 123, hasher, equal, alloc); EXPECT_EQ(m.hash_function(), hasher); EXPECT_EQ(m.key_eq(), equal); @@ -198,7 +198,7 @@ A alloc(0); std::vector<T> values; std::generate_n(std::back_inserter(values), 10, - hash_internal::Generator<T>()); + hash_internal::UniqueGenerator<T>()); TypeParam m(values.begin(), values.end(), 123, alloc); EXPECT_EQ(m.get_allocator(), alloc); EXPECT_THAT(items(m), ::testing::UnorderedElementsAreArray(values)); @@ -221,7 +221,7 @@ A alloc(0); std::vector<T> values; std::generate_n(std::back_inserter(values), 10, - hash_internal::Generator<T>()); + hash_internal::UniqueGenerator<T>()); TypeParam m(values.begin(), values.end(), 123, hasher, alloc); EXPECT_EQ(m.hash_function(), hasher); EXPECT_EQ(m.get_allocator(), alloc); @@ -241,8 +241,9 @@ H hasher; E equal; A alloc(0); + hash_internal::UniqueGenerator<T> gen; TypeParam m(123, hasher, equal, alloc); - for (size_t i = 0; i != 10; ++i) m.insert(hash_internal::Generator<T>()()); + for (size_t i = 0; i != 10; ++i) m.insert(gen()); TypeParam n(m); EXPECT_EQ(m.hash_function(), n.hash_function()); EXPECT_EQ(m.key_eq(), n.key_eq()); @@ -262,8 +263,9 @@ H hasher; E equal; A alloc(0); + hash_internal::UniqueGenerator<T> gen; TypeParam m(123, hasher, equal, alloc); - for (size_t i = 0; i != 10; ++i) m.insert(hash_internal::Generator<T>()()); + for (size_t i = 0; i != 10; ++i) m.insert(gen()); TypeParam n(m, A(11)); EXPECT_EQ(m.hash_function(), n.hash_function()); EXPECT_EQ(m.key_eq(), n.key_eq()); @@ -285,8 +287,9 @@ H hasher; E equal; A alloc(0); + hash_internal::UniqueGenerator<T> gen; TypeParam m(123, hasher, equal, alloc); - for (size_t i = 0; i != 10; ++i) m.insert(hash_internal::Generator<T>()()); + for (size_t i = 0; i != 10; ++i) m.insert(gen()); TypeParam t(m); TypeParam n(std::move(t)); EXPECT_EQ(m.hash_function(), n.hash_function()); @@ -307,8 +310,9 @@ H hasher; E equal; A alloc(0); + hash_internal::UniqueGenerator<T> gen; TypeParam m(123, hasher, equal, alloc); - for (size_t i = 0; i != 10; ++i) m.insert(hash_internal::Generator<T>()()); + for (size_t i = 0; i != 10; ++i) m.insert(gen()); TypeParam t(m); TypeParam n(std::move(t), A(1)); EXPECT_EQ(m.hash_function(), n.hash_function()); @@ -325,7 +329,7 @@ TYPED_TEST_P(ConstructorTest, InitializerListBucketHashEqualAlloc) { using T = hash_internal::GeneratedType<TypeParam>; - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; std::initializer_list<T> values = {gen(), gen(), gen(), gen(), gen()}; using H = typename TypeParam::hasher; using E = typename TypeParam::key_equal; @@ -348,7 +352,7 @@ void InitializerListBucketAllocTest(std::true_type) { using T = hash_internal::GeneratedType<TypeParam>; using A = typename TypeParam::allocator_type; - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; std::initializer_list<T> values = {gen(), gen(), gen(), gen(), gen()}; A alloc(0); TypeParam m(values, 123, alloc); @@ -371,7 +375,7 @@ using A = typename TypeParam::allocator_type; H hasher; A alloc(0); - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; std::initializer_list<T> values = {gen(), gen(), gen(), gen(), gen()}; TypeParam m(values, 123, hasher, alloc); EXPECT_EQ(m.hash_function(), hasher); @@ -392,7 +396,7 @@ H hasher; E equal; A alloc(0); - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; TypeParam m({gen(), gen(), gen()}, 123, hasher, equal, alloc); TypeParam n; n = m; @@ -412,7 +416,7 @@ H hasher; E equal; A alloc(0); - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; TypeParam m({gen(), gen(), gen()}, 123, hasher, equal, alloc); TypeParam t(m); TypeParam n; @@ -424,7 +428,7 @@ TYPED_TEST_P(ConstructorTest, AssignmentFromInitializerList) { using T = hash_internal::GeneratedType<TypeParam>; - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; std::initializer_list<T> values = {gen(), gen(), gen(), gen(), gen()}; TypeParam m; m = values; @@ -433,7 +437,7 @@ TYPED_TEST_P(ConstructorTest, AssignmentOverwritesExisting) { using T = hash_internal::GeneratedType<TypeParam>; - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; TypeParam m({gen(), gen(), gen()}); TypeParam n({gen()}); n = m; @@ -442,7 +446,7 @@ TYPED_TEST_P(ConstructorTest, MoveAssignmentOverwritesExisting) { using T = hash_internal::GeneratedType<TypeParam>; - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; TypeParam m({gen(), gen(), gen()}); TypeParam t(m); TypeParam n({gen()}); @@ -452,7 +456,7 @@ TYPED_TEST_P(ConstructorTest, AssignmentFromInitializerListOverwritesExisting) { using T = hash_internal::GeneratedType<TypeParam>; - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; std::initializer_list<T> values = {gen(), gen(), gen(), gen(), gen()}; TypeParam m; m = values; @@ -461,7 +465,7 @@ TYPED_TEST_P(ConstructorTest, AssignmentOnSelf) { using T = hash_internal::GeneratedType<TypeParam>; - hash_internal::Generator<T> gen; + hash_internal::UniqueGenerator<T> gen; std::initializer_list<T> values = {gen(), gen(), gen(), gen(), gen()}; TypeParam m(values); m = *&m; // Avoid -Wself-assign
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake index 51742c9b..18a1e5c3 100644 --- a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +++ b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
@@ -71,6 +71,7 @@ "-Wformat-security" "-Wgnu-redeclared-enum" "-Winfinite-recursion" + "-Winvalid-constexpr" "-Wliteral-conversion" "-Wmissing-declarations" "-Woverlength-strings"
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl index 6707488f..d2bd560 100644 --- a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl +++ b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
@@ -72,6 +72,7 @@ "-Wformat-security", "-Wgnu-redeclared-enum", "-Winfinite-recursion", + "-Winvalid-constexpr", "-Wliteral-conversion", "-Wmissing-declarations", "-Woverlength-strings",
diff --git a/third_party/abseil-cpp/absl/copts/copts.py b/third_party/abseil-cpp/absl/copts/copts.py index cf52981..ce30df8 100644 --- a/third_party/abseil-cpp/absl/copts/copts.py +++ b/third_party/abseil-cpp/absl/copts/copts.py
@@ -87,6 +87,7 @@ "-Wformat-security", "-Wgnu-redeclared-enum", "-Winfinite-recursion", + "-Winvalid-constexpr", "-Wliteral-conversion", "-Wmissing-declarations", "-Woverlength-strings",
diff --git a/third_party/abseil-cpp/absl/copts/generate_copts.py b/third_party/abseil-cpp/absl/copts/generate_copts.py index 0e5dc9fa..34be2fc2 100755 --- a/third_party/abseil-cpp/absl/copts/generate_copts.py +++ b/third_party/abseil-cpp/absl/copts/generate_copts.py
@@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 """Generate Abseil compile compile option configs. Usage: <path_to_absl>/copts/generate_copts.py
diff --git a/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc b/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc index f4d5727b..87dbd078 100644 --- a/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +++ b/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc
@@ -701,6 +701,16 @@ const char *start_address = ComputeOffset(original_start_address, relocation); +#ifdef __arm__ + // ARM functions are always aligned to multiples of two bytes; the + // lowest-order bit in start_address is ignored by the CPU and indicates + // whether the function contains ARM (0) or Thumb (1) code. We don't care + // about what encoding is being used; we just want the real start address + // of the function. + start_address = reinterpret_cast<const char *>( + reinterpret_cast<uintptr_t>(start_address) & ~1); +#endif + if (deref_function_descriptor_pointer && InSection(original_start_address, opd)) { // The opd section is mapped into memory. Just dereference
diff --git a/third_party/abseil-cpp/absl/debugging/symbolize_test.cc b/third_party/abseil-cpp/absl/debugging/symbolize_test.cc index a2dd495..35de02e 100644 --- a/third_party/abseil-cpp/absl/debugging/symbolize_test.cc +++ b/third_party/abseil-cpp/absl/debugging/symbolize_test.cc
@@ -477,6 +477,46 @@ #endif } +#if defined(__arm__) && ABSL_HAVE_ATTRIBUTE(target) +// Test that we correctly identify bounds of Thumb functions on ARM. +// +// Thumb functions have the lowest-order bit set in their addresses in the ELF +// symbol table. This requires some extra logic to properly compute function +// bounds. To test this logic, nudge a Thumb function right up against an ARM +// function and try to symbolize the ARM function. +// +// A naive implementation will simply use the Thumb function's entry point as +// written in the symbol table and will therefore treat the Thumb function as +// extending one byte further in the instruction stream than it actually does. +// When asked to symbolize the start of the ARM function, it will identify an +// overlap between the Thumb and ARM functions, and it will return the name of +// the Thumb function. +// +// A correct implementation, on the other hand, will null out the lowest-order +// bit in the Thumb function's entry point. It will correctly compute the end of +// the Thumb function, it will find no overlap between the Thumb and ARM +// functions, and it will return the name of the ARM function. + +__attribute__((target("thumb"))) int ArmThumbOverlapThumb(int x) { + return x * x * x; +} + +__attribute__((target("arm"))) int ArmThumbOverlapArm(int x) { + return x * x * x; +} + +void ABSL_ATTRIBUTE_NOINLINE TestArmThumbOverlap() { +#if defined(ABSL_HAVE_ATTRIBUTE_NOINLINE) + const char *symbol = TrySymbolize((void *)&ArmThumbOverlapArm); + ABSL_RAW_CHECK(symbol != nullptr, "TestArmThumbOverlap failed"); + ABSL_RAW_CHECK(strcmp("ArmThumbOverlapArm()", symbol) == 0, + "TestArmThumbOverlap failed"); + std::cout << "TestArmThumbOverlap passed" << std::endl; +#endif +} + +#endif // defined(__arm__) && ABSL_HAVE_ATTRIBUTE(target) + #elif defined(_WIN32) #if !defined(ABSL_CONSUME_DLL) @@ -551,6 +591,9 @@ TestWithPCInsideInlineFunction(); TestWithPCInsideNonInlineFunction(); TestWithReturnAddress(); +#if defined(__arm__) && ABSL_HAVE_ATTRIBUTE(target) + TestArmThumbOverlap(); +#endif #endif return RUN_ALL_TESTS();
diff --git a/third_party/abseil-cpp/absl/numeric/int128.h b/third_party/abseil-cpp/absl/numeric/int128.h index 0dd814a..235361a 100644 --- a/third_party/abseil-cpp/absl/numeric/int128.h +++ b/third_party/abseil-cpp/absl/numeric/int128.h
@@ -817,27 +817,27 @@ return MakeUint128(hi, lo); } -inline bool operator!(uint128 val) { +constexpr inline bool operator!(uint128 val) { return !Uint128High64(val) && !Uint128Low64(val); } // Logical operators. -inline uint128 operator~(uint128 val) { +constexpr inline uint128 operator~(uint128 val) { return MakeUint128(~Uint128High64(val), ~Uint128Low64(val)); } -inline uint128 operator|(uint128 lhs, uint128 rhs) { +constexpr inline uint128 operator|(uint128 lhs, uint128 rhs) { return MakeUint128(Uint128High64(lhs) | Uint128High64(rhs), Uint128Low64(lhs) | Uint128Low64(rhs)); } -inline uint128 operator&(uint128 lhs, uint128 rhs) { +constexpr inline uint128 operator&(uint128 lhs, uint128 rhs) { return MakeUint128(Uint128High64(lhs) & Uint128High64(rhs), Uint128Low64(lhs) & Uint128Low64(rhs)); } -inline uint128 operator^(uint128 lhs, uint128 rhs) { +constexpr inline uint128 operator^(uint128 lhs, uint128 rhs) { return MakeUint128(Uint128High64(lhs) ^ Uint128High64(rhs), Uint128Low64(lhs) ^ Uint128Low64(rhs)); }
diff --git a/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc b/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc index 5bee530..725100a4 100644 --- a/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +++ b/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc
@@ -194,11 +194,10 @@ // Not all the platforms that we build for have std::aligned_alloc, however // since we never free these objects, we can over allocate and munge the // pointers to the correct alignment. - void* memory = std::malloc(sizeof(RandenPoolEntry) + kAlignment); - auto x = reinterpret_cast<intptr_t>(memory); + intptr_t x = reinterpret_cast<intptr_t>( + new char[sizeof(RandenPoolEntry) + kAlignment]); auto y = x % kAlignment; - void* aligned = - (y == 0) ? memory : reinterpret_cast<void*>(x + kAlignment - y); + void* aligned = reinterpret_cast<void*>(y == 0 ? x : (x + kAlignment - y)); return new (aligned) RandenPoolEntry(); }
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.bazel b/third_party/abseil-cpp/absl/strings/BUILD.bazel index 123b5ef..68c71f0 100644 --- a/third_party/abseil-cpp/absl/strings/BUILD.bazel +++ b/third_party/abseil-cpp/absl/strings/BUILD.bazel
@@ -297,6 +297,26 @@ ) cc_library( + name = "cordz_update_tracker", + hdrs = ["internal/cordz_update_tracker.h"], + copts = ABSL_DEFAULT_COPTS, + visibility = ["//visibility:private"], + deps = ["//absl/base:config"], +) + +cc_test( + name = "cordz_update_tracker_test", + srcs = ["internal/cordz_update_tracker_test.cc"], + deps = [ + ":cordz_update_tracker", + "//absl/base:config", + "//absl/base:core_headers", + "//absl/synchronization", + "@com_google_googletest//:gtest_main", + ], +) + +cc_library( name = "cord", srcs = [ "cord.cc", @@ -307,10 +327,16 @@ copts = ABSL_DEFAULT_COPTS, deps = [ ":cord_internal", + ":cordz_functions", + ":cordz_info", + ":cordz_statistics", + ":cordz_update_scope", + ":cordz_update_tracker", ":internal", ":str_format", ":strings", "//absl/base", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:endian", "//absl/base:raw_logging_internal", @@ -323,6 +349,176 @@ ) cc_library( + name = "cordz_handle", + srcs = ["internal/cordz_handle.cc"], + hdrs = ["internal/cordz_handle.h"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + "//absl/base", + "//absl/base:config", + "//absl/base:raw_logging_internal", + "//absl/synchronization", + ], +) + +cc_library( + name = "cordz_info", + srcs = ["internal/cordz_info.cc"], + hdrs = ["internal/cordz_info.h"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + ":cord_internal", + ":cordz_functions", + ":cordz_handle", + ":cordz_statistics", + ":cordz_update_tracker", + "//absl/base", + "//absl/base:config", + "//absl/base:core_headers", + "//absl/base:raw_logging_internal", + "//absl/debugging:stacktrace", + "//absl/synchronization", + "//absl/types:span", + ], +) + +cc_library( + name = "cordz_update_scope", + hdrs = ["internal/cordz_update_scope.h"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + ":cord_internal", + ":cordz_info", + ":cordz_update_tracker", + "//absl/base:config", + "//absl/base:core_headers", + ], +) + +cc_test( + name = "cordz_update_scope_test", + srcs = ["internal/cordz_update_scope_test.cc"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + ":cord_internal", + ":cordz_info", + ":cordz_test_helpers", + ":cordz_update_scope", + ":cordz_update_tracker", + "//absl/base:config", + "@com_google_googletest//:gtest_main", + ], +) + +cc_library( + name = "cordz_sample_token", + srcs = ["internal/cordz_sample_token.cc"], + hdrs = ["internal/cordz_sample_token.h"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + ":cordz_handle", + ":cordz_info", + "//absl/base:config", + ], +) + +cc_library( + name = "cordz_functions", + srcs = ["internal/cordz_functions.cc"], + hdrs = ["internal/cordz_functions.h"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + "//absl/base:config", + "//absl/base:core_headers", + "//absl/base:exponential_biased", + "//absl/base:raw_logging_internal", + ], +) + +cc_library( + name = "cordz_statistics", + hdrs = ["internal/cordz_statistics.h"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + ":cordz_update_tracker", + "//absl/base:config", + ], +) + +cc_test( + name = "cordz_functions_test", + srcs = [ + "internal/cordz_functions_test.cc", + ], + deps = [ + ":cordz_functions", + ":cordz_test_helpers", + "//absl/base:config", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "cordz_handle_test", + srcs = [ + "internal/cordz_handle_test.cc", + ], + deps = [ + ":cordz_handle", + "//absl/base:config", + "//absl/memory", + "//absl/random", + "//absl/random:distributions", + "//absl/synchronization", + "//absl/synchronization:thread_pool", + "//absl/time", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "cordz_info_test", + srcs = [ + "internal/cordz_info_test.cc", + ], + deps = [ + ":cord_internal", + ":cordz_handle", + ":cordz_info", + ":cordz_statistics", + ":cordz_test_helpers", + ":cordz_update_tracker", + ":strings", + "//absl/base:config", + "//absl/debugging:stacktrace", + "//absl/debugging:symbolize", + "//absl/types:span", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "cordz_sample_token_test", + srcs = [ + "internal/cordz_sample_token_test.cc", + ], + deps = [ + ":cord_internal", + ":cordz_handle", + ":cordz_info", + ":cordz_sample_token", + ":cordz_test_helpers", + "//absl/base:config", + "//absl/memory", + "//absl/random", + "//absl/synchronization", + "//absl/synchronization:thread_pool", + "//absl/time", + "@com_google_googletest//:gtest_main", + ], +) + +cc_library( name = "cord_test_helpers", testonly = 1, hdrs = [ @@ -331,6 +527,26 @@ copts = ABSL_DEFAULT_COPTS, deps = [ ":cord", + ":cord_internal", + ":strings", + ], +) + +cc_library( + name = "cordz_test_helpers", + testonly = 1, + hdrs = ["cordz_test_helpers.h"], + copts = ABSL_DEFAULT_COPTS, + deps = [ + ":cord", + ":cord_internal", + ":cordz_info", + ":cordz_sample_token", + ":cordz_statistics", + ":cordz_update_tracker", + "//absl/base:config", + "//absl/base:core_headers", + "@com_google_googletest//:gtest", ], ) @@ -343,6 +559,8 @@ deps = [ ":cord", ":cord_test_helpers", + ":cordz_functions", + ":cordz_test_helpers", ":str_format", ":strings", "//absl/base", @@ -356,6 +574,39 @@ ) cc_test( + name = "cordz_test", + size = "medium", + srcs = ["cordz_test.cc"], + copts = ABSL_TEST_COPTS, + tags = [ + "benchmark", + "no_test_android_arm", + "no_test_android_arm64", + "no_test_android_x86", + "no_test_darwin_x86_64", + "no_test_ios_x86_64", + "no_test_loonix", + "no_test_msvc_x64", + ], + visibility = ["//visibility:private"], + deps = [ + ":cord", + ":cord_test_helpers", + ":cordz_functions", + ":cordz_info", + ":cordz_sample_token", + ":cordz_statistics", + ":cordz_test_helpers", + ":cordz_update_tracker", + ":strings", + "//absl/base:config", + "//absl/base:core_headers", + "//absl/base:raw_logging_internal", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( name = "cord_ring_test", size = "medium", srcs = ["cord_ring_test.cc"],
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.gn b/third_party/abseil-cpp/absl/strings/BUILD.gn index 404cc03..435f4a90 100644 --- a/third_party/abseil-cpp/absl/strings/BUILD.gn +++ b/third_party/abseil-cpp/absl/strings/BUILD.gn
@@ -144,15 +144,40 @@ ] } +absl_source_set("cordz_update_tracker") { + public = ["internal/cordz_update_tracker.h"] + visibility = [ ":*" ] + deps = ["//third_party/abseil-cpp/absl/base:config"] +} + +absl_source_set("cordz_update_tracker_test") { + testonly = true + sources = ["internal/cordz_update_tracker_test.cc"] + deps = [ + ":cordz_update_tracker", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/synchronization", + "//third_party/googletest:gmock", + "//third_party/googletest:gtest", + ] +} + absl_source_set("cord") { sources = [ "cord.cc" ] public = [ "cord.h" ] deps = [ ":cord_internal", + ":cordz_functions", + ":cordz_info", + ":cordz_statistics", + ":cordz_update_scope", + ":cordz_update_tracker", ":internal", ":str_format", ":strings", "//third_party/abseil-cpp/absl/base", + "//third_party/abseil-cpp/absl/base:config", "//third_party/abseil-cpp/absl/base:core_headers", "//third_party/abseil-cpp/absl/base:endian", "//third_party/abseil-cpp/absl/base:raw_logging_internal", @@ -164,10 +189,207 @@ ] } +absl_source_set("cordz_handle") { + sources = ["internal/cordz_handle.cc"] + public = ["internal/cordz_handle.h"] + deps = [ + "//third_party/abseil-cpp/absl/base", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:raw_logging_internal", + "//third_party/abseil-cpp/absl/synchronization", + ] +} + +absl_source_set("cordz_info") { + sources = ["internal/cordz_info.cc"] + public = ["internal/cordz_info.h"] + deps = [ + ":cord_internal", + ":cordz_functions", + ":cordz_handle", + ":cordz_statistics", + ":cordz_update_tracker", + "//third_party/abseil-cpp/absl/base", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:raw_logging_internal", + "//third_party/abseil-cpp/absl/debugging:stacktrace", + "//third_party/abseil-cpp/absl/synchronization", + "//third_party/abseil-cpp/absl/types:span", + ] +} + +absl_source_set("cordz_update_scope") { + public = ["internal/cordz_update_scope.h"] + deps = [ + ":cord_internal", + ":cordz_info", + ":cordz_update_tracker", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + ] +} + +absl_source_set("cordz_update_scope_test") { + testonly = true + sources = ["internal/cordz_update_scope_test.cc"] + deps = [ + ":cord_internal", + ":cordz_info", + ":cordz_test_helpers", + ":cordz_update_scope", + ":cordz_update_tracker", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/googletest:gmock", + "//third_party/googletest:gtest", + ] +} + +absl_source_set("cordz_sample_token") { + sources = ["internal/cordz_sample_token.cc"] + public = ["internal/cordz_sample_token.h"] + deps = [ + ":cordz_handle", + ":cordz_info", + "//third_party/abseil-cpp/absl/base:config", + ] +} + +absl_source_set("cordz_functions") { + sources = ["internal/cordz_functions.cc"] + public = ["internal/cordz_functions.h"] + deps = [ + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:exponential_biased", + "//third_party/abseil-cpp/absl/base:raw_logging_internal", + ] +} + +absl_source_set("cordz_statistics") { + public = ["internal/cordz_statistics.h"] + deps = [ + ":cordz_update_tracker", + "//third_party/abseil-cpp/absl/base:config", + ] +} + +absl_source_set("cordz_functions_test") { + testonly = true + sources = [ "internal/cordz_functions_test.cc" ] + deps = [ + ":cordz_functions", + ":cordz_test_helpers", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/googletest:gmock", + "//third_party/googletest:gtest", + ] +} + +# TODO(b/186638384): Re-enable when random is compilable on win32-archive-rel bot +# absl_source_set("cordz_handle_test") { +# testonly = true +# sources = [ "internal/cordz_handle_test.cc" ] +# deps = [ +# ":cordz_handle", +# "//third_party/abseil-cpp/absl/base:config", +# "//third_party/abseil-cpp/absl/memory", +# "//third_party/abseil-cpp/absl/random", +# "//third_party/abseil-cpp/absl/random:distributions", +# "//third_party/abseil-cpp/absl/synchronization", +# "//third_party/abseil-cpp/absl/synchronization:thread_pool", +# "//third_party/abseil-cpp/absl/time", +# "//third_party/googletest:gmock", +# "//third_party/googletest:gtest", +# ] +# } + +absl_source_set("cordz_info_test") { + testonly = true + sources = [ "internal/cordz_info_test.cc" ] + deps = [ + ":cord_internal", + ":cordz_handle", + ":cordz_info", + ":cordz_statistics", + ":cordz_test_helpers", + ":cordz_update_tracker", + ":strings", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/debugging:stacktrace", + "//third_party/abseil-cpp/absl/debugging:symbolize", + "//third_party/abseil-cpp/absl/types:span", + "//third_party/googletest:gmock", + "//third_party/googletest:gtest", + ] +} + +# TODO(b/186638384): Re-enable when random is compilable on win32-archive-rel bot +# absl_source_set("cordz_sample_token_test") { +# testonly = true +# sources = [ "internal/cordz_sample_token_test.cc" ] +# deps = [ +# ":cord_internal", +# ":cordz_handle", +# ":cordz_info", +# ":cordz_sample_token", +# ":cordz_test_helpers", +# "//third_party/abseil-cpp/absl/base:config", +# "//third_party/abseil-cpp/absl/memory", +# "//third_party/abseil-cpp/absl/random", +# "//third_party/abseil-cpp/absl/synchronization", +# "//third_party/abseil-cpp/absl/synchronization:thread_pool", +# "//third_party/abseil-cpp/absl/time", +# "//third_party/googletest:gmock", +# "//third_party/googletest:gtest", +# ] +# } + absl_source_set("cord_test_helpers") { testonly = true public = [ "cord_test_helpers.h" ] - deps = [ ":cord" ] + deps = [ + ":cord", + ":cord_internal", + ":strings", + ] +} + +absl_source_set("cordz_test_helpers") { + testonly = true + public = ["cordz_test_helpers.h"] + deps = [ + ":cord", + ":cord_internal", + ":cordz_info", + ":cordz_sample_token", + ":cordz_statistics", + ":cordz_update_tracker", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/googletest:gtest", + ] +} + +absl_source_set("cordz_test") { + testonly = true + sources = ["cordz_test.cc"] + deps = [ + ":cord", + ":cord_test_helpers", + ":cordz_functions", + ":cordz_info", + ":cordz_sample_token", + ":cordz_statistics", + ":cordz_test_helpers", + ":cordz_update_tracker", + ":strings", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/base:raw_logging_internal", + "//third_party/googletest:gmock", + "//third_party/googletest:gtest", + ] } absl_source_set("pow10_helper") {
diff --git a/third_party/abseil-cpp/absl/strings/CMakeLists.txt b/third_party/abseil-cpp/absl/strings/CMakeLists.txt index 3b7ae63..80ae2a6 100644 --- a/third_party/abseil-cpp/absl/strings/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
@@ -259,7 +259,7 @@ absl_cc_test( NAME str_join_test - SRCS +ss SRCS "str_join_test.cc" COPTS ${ABSL_TEST_COPTS} @@ -552,24 +552,264 @@ absl_cc_library( NAME + cord_internal + HDRS + "internal/cord_internal.h" + "internal/cord_rep_flat.h" + "internal/cord_rep_ring.h" + "internal/cord_rep_ring_reader.h" + SRCS + "internal/cord_internal.cc" + "internal/cord_rep_ring.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base_internal + absl::compressed_tuple + absl::config + absl::core_headers + absl::endian + absl::inlined_vector + absl::layout + absl::raw_logging_internal + absl::strings + absl::throw_delegate + absl::type_traits +) + +absl_cc_library( + NAME + cordz_update_tracker + HDRS + "internal/cordz_update_tracker.h" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config +) + +absl_cc_test( + NAME + cordz_update_tracker_test + SRCS + "internal/cordz_update_tracker_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::cordz_update_tracker + absl::core_headers + absl::synchronization + gmock_main +) + +absl_cc_library( + NAME + cordz_functions + HDRS + "internal/cordz_functions.h" + SRCS + "internal/cordz_functions.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::core_headers + absl::exponential_biased + absl::raw_logging_internal +) + +absl_cc_test( + NAME + cordz_functions_test + SRCS + "internal/cordz_functions_test.cc" + DEPS + absl::config + absl::cordz_functions + absl::cordz_test_helpers + gmock_main +) + +absl_cc_library( + NAME + cordz_statistics + HDRS + "internal/cordz_statistics.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::core_headers + absl::cordz_update_tracker + absl::synchronization +) + +absl_cc_library( + NAME + cordz_handle + HDRS + "internal/cordz_handle.h" + SRCS + "internal/cordz_handle.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::base + absl::config + absl::raw_logging_internal + absl::synchronization +) + +absl_cc_test( + NAME + cordz_handle_test + SRCS + "internal/cordz_handle_test.cc" + DEPS + absl::config + absl::cordz_handle + absl::cordz_test_helpers + absl::memory + absl::random_random + absl::random_distributions + absl::synchronization + absl::time + gmock_main +) + +absl_cc_library( + NAME + cordz_info + HDRS + "internal/cordz_info.h" + SRCS + "internal/cordz_info.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::base + absl::config + absl::cord_internal + absl::cordz_functions + absl::cordz_handle + absl::cordz_statistics + absl::cordz_update_tracker + absl::core_headers + absl::span + absl::raw_logging_internal + absl::stacktrace + absl::synchronization +) + +absl_cc_test( + NAME + cordz_info_test + SRCS + "internal/cordz_info_test.cc" + DEPS + absl::config + absl::cord_internal + absl::cordz_test_helpers + absl::cordz_handle + absl::cordz_info + absl::cordz_statistics + absl::cordz_test_helpers + absl::cordz_update_tracker + absl::span + absl::stacktrace + absl::symbolize + gmock_main +) + +absl_cc_library( + NAME + cordz_sample_token + HDRS + "internal/cordz_sample_token.h" + SRCS + "internal/cordz_sample_token.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::cordz_handle + absl::cordz_info +) + +absl_cc_test( + NAME + cordz_sample_token_test + SRCS + "internal/cordz_sample_token_test.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::cord_internal + absl::cordz_handle + absl::cordz_info + absl::cordz_info + absl::cordz_sample_token + absl::cordz_test_helpers + absl::memory + absl::random_random + absl::synchronization + absl::thread_pool + absl::time + gmock_main +) + +absl_cc_library( + NAME + cordz_update_scope + HDRS + "internal/cordz_update_scope.h" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::cord_internal + absl::cordz_info + absl::cordz_update_tracker + absl::core_headers +) + +absl_cc_test( + NAME + cordz_update_scope_test + SRCS + "internal/cordz_update_scope_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::cord_internal + absl::cordz_info + absl::cordz_test_helpers + absl::cordz_update_scope + absl::cordz_update_tracker + absl::core_headers + gmock_main +) + +absl_cc_library( + NAME cord HDRS "cord.h" SRCS "cord.cc" - "internal/cord_internal.cc" - "internal/cord_internal.h" - "internal/cord_rep_ring.h" - "internal/cord_rep_ring.cc" - "internal/cord_rep_ring_reader.h" - "internal/cord_rep_flat.h" COPTS ${ABSL_DEFAULT_COPTS} DEPS absl::base - absl::base_internal - absl::compressed_tuple absl::config + absl::cord_internal + absl::cordz_functions + absl::cordz_info + absl::cordz_update_scope + absl::cordz_update_tracker absl::core_headers absl::endian absl::fixed_array @@ -578,8 +818,6 @@ absl::optional absl::raw_logging_internal absl::strings - absl::strings_internal - absl::throw_delegate absl::type_traits PUBLIC ) @@ -593,6 +831,27 @@ ${ABSL_TEST_COPTS} DEPS absl::cord + absl::cord_internal + absl::strings + TESTONLY +) + +absl_cc_library( + NAME + cordz_test_helpers + HDRS + "cordz_test_helpers.h" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::cord + absl::cord_internal + absl::cordz_info + absl::cordz_sample_token + absl::cordz_statistics + absl::cordz_update_tracker + absl::core_headers TESTONLY ) @@ -609,6 +868,8 @@ absl::strings absl::base absl::config + absl::cord_test_helpers + absl::cordz_test_helpers absl::core_headers absl::endian absl::raw_logging_internal @@ -624,12 +885,12 @@ COPTS ${ABSL_TEST_COPTS} DEPS - absl::config - absl::cord - absl::strings absl::base + absl::config + absl::cord_internal absl::core_headers absl::raw_logging_internal + absl::strings gmock_main ) @@ -641,9 +902,33 @@ COPTS ${ABSL_TEST_COPTS} DEPS - absl::cord - absl::strings absl::base + absl::cord_internal absl::core_headers + absl::strings + gmock_main +) + +absl_cc_test( + NAME + cordz_test + SRCS + "cordz_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::cord + absl::cord_test_helpers + absl::cordz_test_helpers + absl::cordz_functions + absl::cordz_info + absl::cordz_sample_token + absl::cordz_statistics + absl::cordz_update_tracker + absl::base + absl::config + absl::core_headers + absl::raw_logging_internal + absl::strings gmock_main )
diff --git a/third_party/abseil-cpp/absl/strings/cord.cc b/third_party/abseil-cpp/absl/strings/cord.cc index 8f0999f8..15d1733 100644 --- a/third_party/abseil-cpp/absl/strings/cord.cc +++ b/third_party/abseil-cpp/absl/strings/cord.cc
@@ -38,6 +38,9 @@ #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/cord_rep_flat.h" #include "absl/strings/internal/cord_rep_ring.h" +#include "absl/strings/internal/cordz_statistics.h" +#include "absl/strings/internal/cordz_update_scope.h" +#include "absl/strings/internal/cordz_update_tracker.h" #include "absl/strings/internal/resize_uninitialized.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" @@ -53,8 +56,9 @@ using ::absl::cord_internal::CordRepFlat; using ::absl::cord_internal::CordRepRing; using ::absl::cord_internal::CordRepSubstring; -using ::absl::cord_internal::kMinFlatLength; +using ::absl::cord_internal::InlineData; using ::absl::cord_internal::kMaxFlatLength; +using ::absl::cord_internal::kMinFlatLength; using ::absl::cord_internal::CONCAT; using ::absl::cord_internal::EXTERNAL; @@ -206,7 +210,7 @@ } static CordRepFlat* CreateFlat(const char* data, size_t length, - size_t alloc_hint) { + size_t alloc_hint) { CordRepFlat* flat = CordRepFlat::New(length + alloc_hint); flat->length = length; memcpy(flat->Data(), data, length); @@ -230,9 +234,7 @@ // Create a new tree out of the specified array. // The returned node has a refcount of 1. -static CordRep* NewTree(const char* data, - size_t length, - size_t alloc_hint) { +static CordRep* NewTree(const char* data, size_t length, size_t alloc_hint) { if (length == 0) return nullptr; if (cord_ring_enabled()) { return RingNewTree(data, length, alloc_hint); @@ -299,20 +301,6 @@ return data_.as_chars(); } -inline CordRep* Cord::InlineRep::force_tree(size_t extra_hint) { - if (data_.is_tree()) { - return data_.as_tree(); - } - - size_t len = inline_size(); - CordRepFlat* result = CordRepFlat::New(len + extra_hint); - result->length = len; - static_assert(kMinFlatLength >= sizeof(data_), ""); - memcpy(result->Data(), data_.as_chars(), sizeof(data_)); - set_tree(result); - return result; -} - inline void Cord::InlineRep::reduce_size(size_t n) { size_t tag = inline_size(); assert(tag <= kMaxInline); @@ -334,25 +322,72 @@ return (rep->tag == RING) ? rep->ring() : CordRepRing::Create(rep, extra); } -void Cord::InlineRep::AppendTree(CordRep* tree) { - if (tree == nullptr) return; - if (data_.is_empty()) { - set_tree(tree); - } else if (cord_ring_enabled()) { - set_tree(CordRepRing::Append(ForceRing(force_tree(0), 1), tree)); +void Cord::InlineRep::AppendTreeToInlined(CordRep* tree, + MethodIdentifier method) { + assert(!is_tree()); + if (!data_.is_empty()) { + CordRepFlat* flat = MakeFlatWithExtraCapacity(0); + if (cord_ring_enabled()) { + tree = CordRepRing::Append(CordRepRing::Create(flat, 1), tree); + } else { + tree = Concat(flat, tree); + } + } + EmplaceTree(tree, method); +} + +void Cord::InlineRep::AppendTreeToTree(CordRep* tree, MethodIdentifier method) { + assert(is_tree()); + const CordzUpdateScope scope(data_.cordz_info(), method); + if (cord_ring_enabled()) { + tree = CordRepRing::Append(ForceRing(data_.as_tree(), 1), tree); } else { - set_tree(Concat(force_tree(0), tree)); + tree = Concat(data_.as_tree(), tree); + } + SetTree(tree, scope); +} + +void Cord::InlineRep::AppendTree(CordRep* tree, MethodIdentifier method) { + if (tree == nullptr) return; + if (data_.is_tree()) { + AppendTreeToTree(tree, method); + } else { + AppendTreeToInlined(tree, method); } } -void Cord::InlineRep::PrependTree(CordRep* tree) { - assert(tree != nullptr); - if (data_.is_empty()) { - set_tree(tree); - } else if (cord_ring_enabled()) { - set_tree(CordRepRing::Prepend(ForceRing(force_tree(0), 1), tree)); +void Cord::InlineRep::PrependTreeToInlined(CordRep* tree, + MethodIdentifier method) { + assert(!is_tree()); + if (!data_.is_empty()) { + CordRepFlat* flat = MakeFlatWithExtraCapacity(0); + if (cord_ring_enabled()) { + tree = CordRepRing::Prepend(CordRepRing::Create(flat, 1), tree); + } else { + tree = Concat(tree, flat); + } + } + EmplaceTree(tree, method); +} + +void Cord::InlineRep::PrependTreeToTree(CordRep* tree, + MethodIdentifier method) { + assert(is_tree()); + const CordzUpdateScope scope(data_.cordz_info(), method); + if (cord_ring_enabled()) { + tree = CordRepRing::Prepend(ForceRing(data_.as_tree(), 1), tree); } else { - set_tree(Concat(tree, force_tree(0))); + tree = Concat(tree, data_.as_tree()); + } + SetTree(tree, scope); +} + +void Cord::InlineRep::PrependTree(CordRep* tree, MethodIdentifier method) { + assert(tree != nullptr); + if (data_.is_tree()) { + PrependTreeToTree(tree, method); + } else { + PrependTreeToInlined(tree, method); } } @@ -404,76 +439,43 @@ return true; } +template <bool has_length> void Cord::InlineRep::GetAppendRegion(char** region, size_t* size, - size_t max_length) { - if (max_length == 0) { - *region = nullptr; - *size = 0; - return; - } + size_t length) { + auto constexpr method = CordzUpdateTracker::kGetAppendRegion; - // Try to fit in the inline buffer if possible. - if (!is_tree()) { - size_t inline_length = inline_size(); - if (max_length <= kMaxInline - inline_length) { - *region = data_.as_chars() + inline_length; - *size = max_length; - set_inline_size(inline_length + max_length); + CordRep* root = tree(); + size_t sz = root ? root->length : inline_size(); + if (root == nullptr) { + size_t available = kMaxInline - sz; + if (available >= (has_length ? length : 1)) { + *region = data_.as_chars() + sz; + *size = has_length ? length : available; + set_inline_size(has_length ? sz + length : kMaxInline); return; } } - CordRep* root = force_tree(max_length); - - if (PrepareAppendRegion(root, region, size, max_length)) { + size_t extra = has_length ? length : (std::max)(sz, kMinFlatLength); + CordRep* rep = root ? root : MakeFlatWithExtraCapacity(extra); + CordzUpdateScope scope(root ? data_.cordz_info() : nullptr, method); + if (PrepareAppendRegion(rep, region, size, length)) { + CommitTree(root, rep, scope, method); return; } // Allocate new node. - CordRepFlat* new_node = - CordRepFlat::New(std::max(static_cast<size_t>(root->length), max_length)); - new_node->length = std::min(new_node->Capacity(), max_length); + CordRepFlat* new_node = CordRepFlat::New(extra); + new_node->length = std::min(new_node->Capacity(), length); *region = new_node->Data(); *size = new_node->length; if (cord_ring_enabled()) { - replace_tree(CordRepRing::Append(ForceRing(root, 1), new_node)); - return; + rep = CordRepRing::Append(ForceRing(rep, 1), new_node); + } else { + rep = Concat(rep, new_node); } - replace_tree(Concat(root, new_node)); -} - -void Cord::InlineRep::GetAppendRegion(char** region, size_t* size) { - const size_t max_length = std::numeric_limits<size_t>::max(); - - // Try to fit in the inline buffer if possible. - if (!data_.is_tree()) { - size_t inline_length = inline_size(); - if (inline_length < kMaxInline) { - *region = data_.as_chars() + inline_length; - *size = kMaxInline - inline_length; - set_inline_size(kMaxInline); - return; - } - } - - CordRep* root = force_tree(max_length); - - if (PrepareAppendRegion(root, region, size, max_length)) { - return; - } - - // Allocate new node. - CordRepFlat* new_node = CordRepFlat::New(root->length); - new_node->length = new_node->Capacity(); - *region = new_node->Data(); - *size = new_node->length; - - if (cord_ring_enabled()) { - replace_tree(CordRepRing::Append(ForceRing(root, 1), new_node)); - return; - } - replace_tree(Concat(root, new_node)); + CommitTree(root, rep, scope, method); } // If the rep is a leaf, this will increment the value at total_mem_usage and @@ -490,18 +492,32 @@ return false; } -void Cord::InlineRep::AssignSlow(const Cord::InlineRep& src) { - UnrefTree(); +void Cord::InlineRep::UpdateCordzStatisticsSlow() { + CordRep* tree = as_tree(); + data_.cordz_info()->RecordMetrics(tree->length); +} - data_ = src.data_; - if (is_tree()) { - CordRep::Ref(tree()); - clear_cordz_info(); +void Cord::InlineRep::AssignSlow(const Cord::InlineRep& src) { + assert(&src != this); + assert(is_tree() || src.is_tree()); + auto constexpr method = CordzUpdateTracker::kAssignCord; + if (CordRep* tree = this->tree()) { + CordzUpdateScope scope(data_.cordz_info(), method); + CordRep::Unref(tree); + if (CordRep* src_tree = src.tree()) { + SetTree(CordRep::Ref(src_tree), scope); + } else { + scope.SetCordRep(nullptr); + data_ = src.data_; + } + } else { + EmplaceTree(CordRep::Ref(src.as_tree()), method); } } void Cord::InlineRep::UnrefTree() { if (is_tree()) { + CordzInfo::MaybeUntrackCord(data_.cordz_info()); CordRep::Unref(tree()); } } @@ -509,12 +525,13 @@ // -------------------------------------------------------------------- // Constructors and destructors -Cord::Cord(absl::string_view src) { +Cord::Cord(absl::string_view src) : contents_(InlineData::kDefaultInit) { const size_t n = src.size(); if (n <= InlineRep::kMaxInline) { - contents_.set_data(src.data(), n, false); + contents_.set_data(src.data(), n, true); } else { - contents_.set_tree(NewTree(src.data(), n, 0)); + CordRep* rep = NewTree(src.data(), n, 0); + contents_.EmplaceTree(rep, CordzUpdateTracker::kConstructorString); } } @@ -552,9 +569,9 @@ // The destruction code is separate so that the compiler can determine // that it does not need to call the destructor on a moved-from Cord. void Cord::DestroyCordSlow() { - if (CordRep* tree = contents_.tree()) { - CordRep::Unref(VerifyTree(tree)); - } + assert(contents_.is_tree()); + CordzInfo::MaybeUntrackCord(contents_.cordz_info()); + CordRep::Unref(VerifyTree(contents_.as_tree())); } // -------------------------------------------------------------------- @@ -567,19 +584,18 @@ } Cord& Cord::operator=(absl::string_view src) { - const char* data = src.data(); size_t length = src.size(); CordRep* tree = contents_.tree(); if (length <= InlineRep::kMaxInline) { // Embed into this->contents_ + if (tree) CordzInfo::MaybeUntrackCord(contents_.cordz_info()); contents_.set_data(data, length, true); if (tree) CordRep::Unref(tree); return *this; } if (tree != nullptr && tree->tag >= FLAT && - tree->flat()->Capacity() >= length && - tree->refcount.IsOne()) { + tree->flat()->Capacity() >= length && tree->refcount.IsOne()) { // Copy in place if the existing FLAT node is reusable. memmove(tree->flat()->Data(), data, length); tree->length = length; @@ -605,70 +621,70 @@ // TODO(sanjay): Move to Cord::InlineRep section of file. For now, // we keep it here to make diffs easier. -void Cord::InlineRep::AppendArray(const char* src_data, size_t src_size) { - if (src_size == 0) return; // memcpy(_, nullptr, 0) is undefined. +void Cord::InlineRep::AppendArray(absl::string_view src, + MethodIdentifier method) { + if (src.empty()) return; // memcpy(_, nullptr, 0) is undefined. size_t appended = 0; - CordRep* root = nullptr; - if (is_tree()) { - root = data_.as_tree(); + CordRep* rep = tree(); + const CordRep* const root = rep; + CordzUpdateScope scope(root ? cordz_info() : nullptr, method); + if (root != nullptr) { char* region; - if (PrepareAppendRegion(root, ®ion, &appended, src_size)) { - memcpy(region, src_data, appended); + if (PrepareAppendRegion(rep, ®ion, &appended, src.size())) { + memcpy(region, src.data(), appended); } } else { // Try to fit in the inline buffer if possible. size_t inline_length = inline_size(); - if (src_size <= kMaxInline - inline_length) { + if (src.size() <= kMaxInline - inline_length) { // Append new data to embedded array - memcpy(data_.as_chars() + inline_length, src_data, src_size); - set_inline_size(inline_length + src_size); + memcpy(data_.as_chars() + inline_length, src.data(), src.size()); + set_inline_size(inline_length + src.size()); return; } - // It is possible that src_data == data_, but when we transition from an + // It is possible that src.data() == data_, but when we transition from an // InlineRep to a tree we need to assign data_ = root via set_tree. To // avoid corrupting the source data before we copy it, delay calling // set_tree until after we've copied data. // We are going from an inline size to beyond inline size. Make the new size // either double the inlined size, or the added size + 10%. - const size_t size1 = inline_length * 2 + src_size; - const size_t size2 = inline_length + src_size / 10; - root = CordRepFlat::New(std::max<size_t>(size1, size2)); - appended = std::min( - src_size, root->flat()->Capacity() - inline_length); - memcpy(root->flat()->Data(), data_.as_chars(), inline_length); - memcpy(root->flat()->Data() + inline_length, src_data, appended); - root->length = inline_length + appended; - set_tree(root); + const size_t size1 = inline_length * 2 + src.size(); + const size_t size2 = inline_length + src.size() / 10; + rep = CordRepFlat::New(std::max<size_t>(size1, size2)); + appended = std::min(src.size(), rep->flat()->Capacity() - inline_length); + memcpy(rep->flat()->Data(), data_.as_chars(), inline_length); + memcpy(rep->flat()->Data() + inline_length, src.data(), appended); + rep->length = inline_length + appended; } - src_data += appended; - src_size -= appended; - if (src_size == 0) { + src.remove_prefix(appended); + if (src.empty()) { + CommitTree(root, rep, scope, method); return; } if (cord_ring_enabled()) { - absl::string_view data(src_data, src_size); - root = ForceRing(root, (data.size() - 1) / kMaxFlatLength + 1); - replace_tree(CordRepRing::Append(root->ring(), data)); - return; + rep = ForceRing(rep, (src.size() - 1) / kMaxFlatLength + 1); + rep = CordRepRing::Append(rep->ring(), src); + } else { + // Use new block(s) for any remaining bytes that were not handled above. + // Alloc extra memory only if the right child of the root of the new tree + // is going to be a FLAT node, which will permit further inplace appends. + size_t length = src.size(); + if (src.size() < kMaxFlatLength) { + // The new length is either + // - old size + 10% + // - old_size + src.size() + // This will cause a reasonable conservative step-up in size that is + // still large enough to avoid excessive amounts of small fragments + // being added. + length = std::max<size_t>(rep->length / 10, src.size()); + } + rep = Concat(rep, NewTree(src.data(), src.size(), length - src.size())); } - - // Use new block(s) for any remaining bytes that were not handled above. - // Alloc extra memory only if the right child of the root of the new tree is - // going to be a FLAT node, which will permit further inplace appends. - size_t length = src_size; - if (src_size < kMaxFlatLength) { - // The new length is either - // - old size + 10% - // - old_size + src_size - // This will cause a reasonable conservative step-up in size that is still - // large enough to avoid excessive amounts of small fragments being added. - length = std::max<size_t>(root->length / 10, src_size); - } - set_tree(Concat(root, NewTree(src_data, src_size, length - src_size))); + CommitTree(root, rep, scope, method); } inline CordRep* Cord::TakeRep() const& { @@ -683,10 +699,17 @@ template <typename C> inline void Cord::AppendImpl(C&& src) { + auto constexpr method = CordzUpdateTracker::kAppendCord; if (empty()) { - // In case of an empty destination avoid allocating a new node, do not copy - // data. - *this = std::forward<C>(src); + // Since destination is empty, we can avoid allocating a node, + if (src.contents_.is_tree()) { + // by taking the tree directly + CordRep* rep = std::forward<C>(src).TakeRep(); + contents_.EmplaceTree(rep, method); + } else { + // or copying over inline data + contents_.data_ = src.contents_.data_; + } return; } @@ -696,12 +719,12 @@ CordRep* src_tree = src.contents_.tree(); if (src_tree == nullptr) { // src has embedded data. - contents_.AppendArray(src.contents_.data(), src_size); + contents_.AppendArray({src.contents_.data(), src_size}, method); return; } if (src_tree->tag >= FLAT) { // src tree just has one flat node. - contents_.AppendArray(src_tree->flat()->Data(), src_size); + contents_.AppendArray({src_tree->flat()->Data(), src_size}, method); return; } if (&src == this) { @@ -717,7 +740,8 @@ } // Guaranteed to be a tree (kMaxBytesToCopy > kInlinedSize) - contents_.AppendTree(std::forward<C>(src).TakeRep()); + CordRep* rep = std::forward<C>(src).TakeRep(); + contents_.AppendTree(rep, CordzUpdateTracker::kAppendCord); } void Cord::Append(const Cord& src) { AppendImpl(src); } @@ -739,7 +763,7 @@ CordRep* src_tree = src.contents_.tree(); if (src_tree != nullptr) { CordRep::Ref(src_tree); - contents_.PrependTree(src_tree); + contents_.PrependTree(src_tree, CordzUpdateTracker::kPrependCord); return; } @@ -762,7 +786,8 @@ return; } } - contents_.PrependTree(NewTree(src.data(), src.size(), 0)); + CordRep* rep = NewTree(src.data(), src.size(), 0); + contents_.PrependTree(rep, CordzUpdateTracker::kPrependString); } template <typename T, Cord::EnableIfString<T>> @@ -1789,8 +1814,7 @@ *os << absl::CEscape(std::string(rep->external()->base, rep->length)); *os << "]\n"; } else if (rep->tag >= FLAT) { - *os << "FLAT cap=" << rep->flat()->Capacity() - << " ["; + *os << "FLAT cap=" << rep->flat()->Capacity() << " ["; if (include_data) *os << absl::CEscape(std::string(rep->flat()->Data(), rep->length)); *os << "]\n"; @@ -1802,7 +1826,7 @@ do { DumpNode(ring->entry_child(head), include_data, os, indent + kIndentStep); - head = ring->advance(head);; + head = ring->advance(head); } while (head != ring->tail()); } if (stack.empty()) break; @@ -1848,9 +1872,8 @@ worklist.push_back(node->concat()->left); } } else if (node->tag >= FLAT) { - ABSL_INTERNAL_CHECK( - node->length <= node->flat()->Capacity(), - ReportError(root, node)); + ABSL_INTERNAL_CHECK(node->length <= node->flat()->Capacity(), + ReportError(root, node)); } else if (node->tag == EXTERNAL) { ABSL_INTERNAL_CHECK(node->external()->base != nullptr, ReportError(root, node));
diff --git a/third_party/abseil-cpp/absl/strings/cord.h b/third_party/abseil-cpp/absl/strings/cord.h index 7ce938ca..d5a13b34 100644 --- a/third_party/abseil-cpp/absl/strings/cord.h +++ b/third_party/abseil-cpp/absl/strings/cord.h
@@ -70,6 +70,7 @@ #include <string> #include <type_traits> +#include "absl/base/config.h" #include "absl/base/internal/endian.h" #include "absl/base/internal/per_thread_tls.h" #include "absl/base/macros.h" @@ -80,6 +81,11 @@ #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/cord_rep_ring.h" #include "absl/strings/internal/cord_rep_ring_reader.h" +#include "absl/strings/internal/cordz_functions.h" +#include "absl/strings/internal/cordz_info.h" +#include "absl/strings/internal/cordz_statistics.h" +#include "absl/strings/internal/cordz_update_scope.h" +#include "absl/strings/internal/cordz_update_tracker.h" #include "absl/strings/internal/resize_uninitialized.h" #include "absl/strings/internal/string_constant.h" #include "absl/strings/string_view.h" @@ -664,10 +670,20 @@ explicit constexpr Cord(strings_internal::StringConstant<T>); private: + using CordRep = absl::cord_internal::CordRep; + using CordRepFlat = absl::cord_internal::CordRepFlat; + using CordzInfo = cord_internal::CordzInfo; + using CordzUpdateScope = cord_internal::CordzUpdateScope; + using CordzUpdateTracker = cord_internal::CordzUpdateTracker; + using InlineData = cord_internal::InlineData; + using MethodIdentifier = CordzUpdateTracker::MethodIdentifier; + friend class CordTestPeer; friend bool operator==(const Cord& lhs, const Cord& rhs); friend bool operator==(const Cord& lhs, absl::string_view rhs); + friend const CordzInfo* GetCordzInfoForTesting(const Cord& cord); + // Calls the provided function once for each cord chunk, in order. Unlike // Chunks(), this API will not allocate memory. void ForEachChunk(absl::FunctionRef<void(absl::string_view)>) const; @@ -687,6 +703,7 @@ static_assert(kMaxInline >= sizeof(absl::cord_internal::CordRep*), ""); constexpr InlineRep() : data_() {} + explicit InlineRep(InlineData::DefaultInitType init) : data_(init) {} InlineRep(const InlineRep& src); InlineRep(InlineRep&& src); InlineRep& operator=(const InlineRep& src); @@ -712,15 +729,44 @@ // Returns non-null iff was holding a pointer absl::cord_internal::CordRep* clear(); // Converts to pointer if necessary. - absl::cord_internal::CordRep* force_tree(size_t extra_hint); void reduce_size(size_t n); // REQUIRES: holding data void remove_prefix(size_t n); // REQUIRES: holding data - void AppendArray(const char* src_data, size_t src_size); + void AppendArray(absl::string_view src, MethodIdentifier method); absl::string_view FindFlatStartPiece() const; - void AppendTree(absl::cord_internal::CordRep* tree); - void PrependTree(absl::cord_internal::CordRep* tree); - void GetAppendRegion(char** region, size_t* size, size_t max_length); - void GetAppendRegion(char** region, size_t* size); + + // Creates a CordRepFlat instance from the current inlined data with `extra' + // bytes of desired additional capacity. + CordRepFlat* MakeFlatWithExtraCapacity(size_t extra); + + // Sets the tree value for this instance. `rep` must not be null. + // Requires the current instance to hold a tree, and a lock to be held on + // any CordzInfo referenced by this instance. The latter is enforced through + // the CordzUpdateScope argument. If the current instance is sampled, then + // the CordzInfo instance is updated to reference the new `rep` value. + void SetTree(CordRep* rep, const CordzUpdateScope& scope); + + // Sets the tree value for this instance, and randomly samples this cord. + // This function disregards existing contents in `data_`, and should be + // called when a Cord is 'promoted' from an 'uninitialized' or 'inlined' + // value to a non-inlined (tree / ring) value. + void EmplaceTree(CordRep* rep, MethodIdentifier method); + + // Commits the change of a newly created, or updated `rep` root value into + // this cord. `old_rep` indicates the old (inlined or tree) value of the + // cord, and determines if the commit invokes SetTree() or EmplaceTree(). + void CommitTree(const CordRep* old_rep, CordRep* rep, + const CordzUpdateScope& scope, MethodIdentifier method); + + void AppendTreeToInlined(CordRep* tree, MethodIdentifier method); + void AppendTreeToTree(CordRep* tree, MethodIdentifier method); + void AppendTree(CordRep* tree, MethodIdentifier method); + void PrependTreeToInlined(CordRep* tree, MethodIdentifier method); + void PrependTreeToTree(CordRep* tree, MethodIdentifier method); + void PrependTree(CordRep* tree, MethodIdentifier method); + + template <bool has_length> + void GetAppendRegion(char** region, size_t* size, size_t length); + bool IsSame(const InlineRep& other) const { return memcmp(&data_, &other.data_, sizeof(data_)) == 0; } @@ -772,6 +818,11 @@ // Resets the current cordz_info to null / empty. void clear_cordz_info() { data_.clear_cordz_info(); } + // Updates the cordz statistics. info may be nullptr if the CordzInfo object + // is unknown. + void UpdateCordzStatistics(); + void UpdateCordzStatisticsSlow(); + private: friend class Cord; @@ -943,6 +994,8 @@ if (is_tree()) { data_.clear_cordz_info(); absl::cord_internal::CordRep::Ref(as_tree()); + CordzInfo::MaybeTrackCord(data_, src.data_, + CordzUpdateTracker::kConstructorCord); } } @@ -1002,8 +1055,45 @@ return is_tree() ? as_tree()->length : inline_size(); } +inline cord_internal::CordRepFlat* Cord::InlineRep::MakeFlatWithExtraCapacity( + size_t extra) { + static_assert(cord_internal::kMinFlatLength >= sizeof(data_), ""); + size_t len = data_.inline_size(); + auto* result = CordRepFlat::New(len + extra); + result->length = len; + memcpy(result->Data(), data_.as_chars(), sizeof(data_)); + return result; +} + +inline void Cord::InlineRep::EmplaceTree(CordRep* rep, + MethodIdentifier method) { + data_.make_tree(rep); + CordzInfo::MaybeTrackCord(data_, method); +} + +inline void Cord::InlineRep::SetTree(CordRep* rep, + const CordzUpdateScope& scope) { + assert(rep); + assert(data_.is_tree()); + data_.set_tree(rep); + scope.SetCordRep(rep); +} + +inline void Cord::InlineRep::CommitTree(const CordRep* old_rep, CordRep* rep, + const CordzUpdateScope& scope, + MethodIdentifier method) { + if (old_rep) { + SetTree(rep, scope); + } else { + EmplaceTree(rep, method); + } +} + inline void Cord::InlineRep::set_tree(absl::cord_internal::CordRep* rep) { if (rep == nullptr) { + if (data_.is_tree()) { + CordzInfo::MaybeUntrackCord(data_.cordz_info()); + } ResetToEmpty(); } else { if (data_.is_tree()) { @@ -1013,7 +1103,9 @@ } else { // `data_` contains inlined data: initialize data_ to tree value `rep`. data_.make_tree(rep); + CordzInfo::MaybeTrackCord(data_, CordzUpdateTracker::kUnknown); } + UpdateCordzStatistics(); } } @@ -1024,9 +1116,13 @@ return; } data_.set_tree(rep); + UpdateCordzStatistics(); } inline absl::cord_internal::CordRep* Cord::InlineRep::clear() { + if (is_tree()) { + CordzInfo::MaybeUntrackCord(cordz_info()); + } absl::cord_internal::CordRep* result = tree(); ResetToEmpty(); return result; @@ -1039,6 +1135,11 @@ cord_internal::SmallMemmove(dst, data_.as_chars(), n); } +inline void Cord::InlineRep::UpdateCordzStatistics() { + if (ABSL_PREDICT_TRUE(!is_profiled())) return; + UpdateCordzStatisticsSlow(); +} + constexpr inline Cord::Cord() noexcept {} template <typename T> @@ -1113,7 +1214,7 @@ } inline void Cord::Append(absl::string_view src) { - contents_.AppendArray(src.data(), src.size()); + contents_.AppendArray(src, CordzUpdateTracker::kAppendString); } extern template void Cord::Append(std::string&& src);
diff --git a/third_party/abseil-cpp/absl/strings/cord_test.cc b/third_party/abseil-cpp/absl/strings/cord_test.cc index 710a1b4..74a9086 100644 --- a/third_party/abseil-cpp/absl/strings/cord_test.cc +++ b/third_party/abseil-cpp/absl/strings/cord_test.cc
@@ -35,6 +35,7 @@ #include "absl/base/macros.h" #include "absl/container/fixed_array.h" #include "absl/strings/cord_test_helpers.h" +#include "absl/strings/cordz_test_helpers.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/string_view.h" @@ -239,7 +240,6 @@ // caused crashes in production. We grow exponentially so that the code will // execute in a reasonable amount of time. absl::Cord c; - ABSL_RAW_LOG(INFO, "Made a Cord with %zu bytes!", c.size()); c.Append(from); while (c.size() < max_size) { c.Append(c);
diff --git a/third_party/abseil-cpp/absl/strings/cord_test_helpers.h b/third_party/abseil-cpp/absl/strings/cord_test_helpers.h index f1036e3b..6ccccc51 100644 --- a/third_party/abseil-cpp/absl/strings/cord_test_helpers.h +++ b/third_party/abseil-cpp/absl/strings/cord_test_helpers.h
@@ -17,11 +17,50 @@ #ifndef ABSL_STRINGS_CORD_TEST_HELPERS_H_ #define ABSL_STRINGS_CORD_TEST_HELPERS_H_ +#include <cstdint> +#include <iostream> + #include "absl/strings/cord.h" +#include "absl/strings/internal/cord_internal.h" +#include "absl/strings/string_view.h" namespace absl { ABSL_NAMESPACE_BEGIN +// Cord sizes relevant for testing +enum class TestCordSize { + kEmpty = 0, + kInlined = cord_internal::kMaxInline / 2 + 1, + kSmall = cord_internal::kMaxBytesToCopy / 2 + 1, + kMedium = cord_internal::kMaxFlatLength / 2 + 1, + kLarge = cord_internal::kMaxFlatLength * 4 +}; + +// To string helper +inline absl::string_view ToString(TestCordSize size) { + switch (size) { + case TestCordSize::kEmpty: + return "Empty"; + case TestCordSize::kInlined: + return "Inlined"; + case TestCordSize::kSmall: + return "Small"; + case TestCordSize::kMedium: + return "Medium"; + case TestCordSize::kLarge: + return "Large"; + } + return "???"; +} + +// Returns the length matching the specified size +inline size_t Length(TestCordSize size) { return static_cast<size_t>(size); } + +// Stream output helper +inline std::ostream& operator<<(std::ostream& stream, TestCordSize size) { + return stream << ToString(size); +} + // Creates a multi-segment Cord from an iterable container of strings. The // resulting Cord is guaranteed to have one segment for every string in the // container. This allows code to be unit tested with multi-segment Cord
diff --git a/third_party/abseil-cpp/absl/strings/cordz_test.cc b/third_party/abseil-cpp/absl/strings/cordz_test.cc new file mode 100644 index 0000000..b16e968 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/cordz_test.cc
@@ -0,0 +1,174 @@ +// Copyright 2021 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include <cstdint> +#include <string> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/macros.h" +#include "absl/strings/cord.h" +#include "absl/strings/cord_test_helpers.h" +#include "absl/strings/cordz_test_helpers.h" +#include "absl/strings/internal/cordz_functions.h" +#include "absl/strings/internal/cordz_info.h" +#include "absl/strings/internal/cordz_sample_token.h" +#include "absl/strings/internal/cordz_statistics.h" +#include "absl/strings/internal/cordz_update_tracker.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" + +#ifdef ABSL_INTERNAL_CORDZ_ENABLED + +using testing::Eq; + +namespace absl { +ABSL_NAMESPACE_BEGIN + +using cord_internal::CordzInfo; +using cord_internal::CordzSampleToken; +using cord_internal::CordzStatistics; +using cord_internal::CordzUpdateTracker; +using Method = CordzUpdateTracker::MethodIdentifier; + +// Do not print cord contents, we only care about 'size' perhaps. +// Note that this method must be inside the named namespace. +inline void PrintTo(const Cord& cord, std::ostream* s) { + if (s) *s << "Cord[" << cord.size() << "]"; +} + +namespace { + +// Returns a string_view value of the specified length +// We do this to avoid 'consuming' large strings in Cord by default. +absl::string_view MakeString(size_t size) { + thread_local std::string str; + str = std::string(size, '.'); + return str; +} + +absl::string_view MakeString(TestCordSize size) { + return MakeString(Length(size)); +} + +std::string TestParamToString(::testing::TestParamInfo<TestCordSize> size) { + return absl::StrCat("On", ToString(size.param), "Cord"); +} + +class CordzUpdateTest : public testing::TestWithParam<TestCordSize> { + public: + Cord& cord() { return cord_; } + + Method InitialOr(Method method) const { + return (GetParam() > TestCordSize::kInlined) ? Method::kConstructorString + : method; + } + + private: + CordzSamplingIntervalHelper sample_every_{1}; + Cord cord_{MakeString(GetParam())}; +}; + +INSTANTIATE_TEST_SUITE_P(WithParam, CordzUpdateTest, + testing::Values(TestCordSize::kEmpty, + TestCordSize::kInlined, + TestCordSize::kLarge), + TestParamToString); + +TEST(CordzTest, ConstructSmallString) { + CordzSamplingIntervalHelper sample_every{1}; + Cord cord(MakeString(TestCordSize::kSmall)); + EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString)); +} + +TEST(CordzTest, ConstructLargeString) { + CordzSamplingIntervalHelper sample_every{1}; + Cord cord(MakeString(TestCordSize::kLarge)); + EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString)); +} + +TEST(CordzTest, CopyConstruct) { + CordzSamplingIntervalHelper sample_every{1}; + Cord src = UnsampledCord(MakeString(TestCordSize::kLarge)); + Cord cord(src); + EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorCord)); +} + +TEST(CordzTest, MoveConstruct) { + CordzSamplingIntervalHelper sample_every{1}; + Cord src(MakeString(TestCordSize::kLarge)); + Cord cord(std::move(src)); + EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString)); +} + +TEST_P(CordzUpdateTest, AssignCord) { + Cord src = UnsampledCord(MakeString(TestCordSize::kLarge)); + cord() = src; + EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAssignCord))); +} + +TEST(CordzTest, AssignInlinedCord) { + CordzSampleToken token; + CordzSamplingIntervalHelper sample_every{1}; + Cord cord(MakeString(TestCordSize::kLarge)); + const CordzInfo* info = GetCordzInfoForTesting(cord); + Cord src = UnsampledCord(MakeString(TestCordSize::kInlined)); + cord = src; + EXPECT_THAT(GetCordzInfoForTesting(cord), Eq(nullptr)); + EXPECT_FALSE(CordzInfoIsListed(info)); +} + +TEST(CordzTest, MoveAssignCord) { + CordzSamplingIntervalHelper sample_every{1}; + Cord cord; + Cord src(MakeString(TestCordSize::kLarge)); + cord = std::move(src); + EXPECT_THAT(cord, HasValidCordzInfoOf(Method::kConstructorString)); +} + +TEST_P(CordzUpdateTest, AppendCord) { + Cord src = UnsampledCord(MakeString(TestCordSize::kLarge)); + cord().Append(src); + EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendCord))); +} + +TEST_P(CordzUpdateTest, MoveAppendCord) { + cord().Append(UnsampledCord(MakeString(TestCordSize::kLarge))); + EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendCord))); +} + +TEST_P(CordzUpdateTest, PrependCord) { + Cord src = UnsampledCord(MakeString(TestCordSize::kLarge)); + cord().Prepend(src); + EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kPrependCord))); +} + +TEST_P(CordzUpdateTest, AppendSmallArray) { + cord().Append(MakeString(TestCordSize::kSmall)); + EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendString))); +} + +TEST_P(CordzUpdateTest, AppendLargeArray) { + cord().Append(MakeString(TestCordSize::kLarge)); + EXPECT_THAT(cord(), HasValidCordzInfoOf(InitialOr(Method::kAppendString))); +} + +} // namespace + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_INTERNAL_CORDZ_ENABLED
diff --git a/third_party/abseil-cpp/absl/strings/cordz_test_helpers.h b/third_party/abseil-cpp/absl/strings/cordz_test_helpers.h new file mode 100644 index 0000000..d9573c9 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/cordz_test_helpers.h
@@ -0,0 +1,134 @@ +// Copyright 2021 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_STRINGS_CORDZ_TEST_HELPERS_H_ +#define ABSL_STRINGS_CORDZ_TEST_HELPERS_H_ + +#include <utility> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/base/macros.h" +#include "absl/strings/cord.h" +#include "absl/strings/internal/cord_internal.h" +#include "absl/strings/internal/cordz_info.h" +#include "absl/strings/internal/cordz_sample_token.h" +#include "absl/strings/internal/cordz_statistics.h" +#include "absl/strings/internal/cordz_update_tracker.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +// Returns the CordzInfo for the cord, or nullptr if the cord is not sampled. +inline const cord_internal::CordzInfo* GetCordzInfoForTesting( + const Cord& cord) { + if (cord.size() <= cord_internal::kMaxInline) return nullptr; + return cord.contents_.cordz_info(); +} + +// Returns true if the provided cordz_info is in the list of sampled cords. +inline bool CordzInfoIsListed(const cord_internal::CordzInfo* cordz_info, + cord_internal::CordzSampleToken token = {}) { + for (const cord_internal::CordzInfo& info : token) { + if (cordz_info == &info) return true; + } + return false; +} + +// Matcher on Cord* that verifies all of: +// - the cord is sampled +// - the CordzInfo of the cord is listed / discoverable. +// - the reported CordzStatistics match the cord's actual properties +// - the cord has an (initial) UpdateTracker count of 1 for `method` +// This matcher accepts a const Cord* to avoid having the matcher dump +// copious amounts of cord data on failures. +MATCHER_P(HasValidCordzInfoOf, method, "CordzInfo matches cord") { + const cord_internal::CordzInfo* cord_info = GetCordzInfoForTesting(arg); + if (cord_info == nullptr) { + *result_listener << "cord is not sampled"; + return false; + } + if (!CordzInfoIsListed(cord_info)) { + *result_listener << "cord is sampled, but not listed"; + return false; + } + cord_internal::CordzStatistics stat = cord_info->GetCordzStatistics(); + if (stat.size != arg.size()) { + *result_listener << "cordz size " << stat.size + << " does not match cord size " << arg.size(); + return false; + } + if (stat.update_tracker.Value(method) != 1) { + *result_listener << "Expected method count 1 for " << method << ", found " + << stat.update_tracker.Value(method); + return false; + } + return true; +} + +// Cordz will only update with a new rate once the previously scheduled event +// has fired. When we disable Cordz, a long delay takes place where we won't +// consider profiling new Cords. CordzSampleIntervalHelper will burn through +// that interval and allow for testing that assumes that the average sampling +// interval is a particular value. +class CordzSamplingIntervalHelper { + public: + explicit CordzSamplingIntervalHelper(int32_t interval) + : orig_mean_interval_(absl::cord_internal::get_cordz_mean_interval()) { + absl::cord_internal::set_cordz_mean_interval(interval); + absl::cord_internal::cordz_set_next_sample_for_testing(interval); + } + + ~CordzSamplingIntervalHelper() { + absl::cord_internal::set_cordz_mean_interval(orig_mean_interval_); + absl::cord_internal::cordz_set_next_sample_for_testing(orig_mean_interval_); + } + + private: + int32_t orig_mean_interval_; +}; + +// Wrapper struct managing a small CordRep `rep` +struct TestCordRep { + cord_internal::CordRepFlat* rep; + + TestCordRep() { + rep = cord_internal::CordRepFlat::New(100); + rep->length = 100; + memset(rep->Data(), 1, 100); + } + ~TestCordRep() { cord_internal::CordRep::Unref(rep); } +}; + +// Wrapper struct managing a small CordRep `rep`, and +// an InlineData `data` initialized with that CordRep. +struct TestCordData { + TestCordRep rep; + cord_internal::InlineData data{rep.rep}; +}; + +// Creates a Cord that is not sampled +template <typename... Args> +Cord UnsampledCord(Args... args) { + CordzSamplingIntervalHelper never(9999); + Cord cord(std::forward<Args>(args)...); + ABSL_ASSERT(GetCordzInfoForTesting(cord) == nullptr); + return cord; +} + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_CORDZ_TEST_HELPERS_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h index 01ce70a..c7ae010 100644 --- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
@@ -329,6 +329,9 @@ class InlineData { public: + // DefaultInitType forces the use of the default initialization constructor. + enum DefaultInitType { kDefaultInit }; + // kNullCordzInfo holds the big endian representation of intptr_t(1) // This is the 'null' / initial value of 'cordz_info'. The null value // is specifically big endian 1 as with 64-bit pointers, the last @@ -336,6 +339,7 @@ static constexpr cordz_info_t kNullCordzInfo = BigEndianByte(1); constexpr InlineData() : as_chars_{0} {} + explicit InlineData(DefaultInitType) {} explicit constexpr InlineData(CordRep* rep) : as_tree_(rep) {} explicit constexpr InlineData(absl::string_view chars) : as_chars_{
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc new file mode 100644 index 0000000..6ad864f --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc
@@ -0,0 +1,104 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_functions.h" + +#include <atomic> +#include <cmath> +#include <limits> +#include <random> + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/exponential_biased.h" +#include "absl/base/internal/raw_logging.h" + +// TODO(b/162942788): weak 'cordz_disabled' value. +// A strong version is in the 'cordz_disabled_hack_for_odr' library which can +// be linked in to disable cordz at compile time. +extern "C" { +bool absl_internal_cordz_disabled ABSL_ATTRIBUTE_WEAK = false; +} + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { +namespace { + +// The average interval until the next sample. A value of 0 disables profiling +// while a value of 1 will profile all Cords. +std::atomic<int> g_cordz_mean_interval(50000); + +} // namespace + +#ifdef ABSL_INTERNAL_CORDZ_ENABLED + +ABSL_CONST_INIT thread_local int64_t cordz_next_sample = 0; + +// kIntervalIfDisabled is the number of profile-eligible events need to occur +// before the code will confirm that cordz is still disabled. +constexpr int64_t kIntervalIfDisabled = 1 << 16; + +ABSL_ATTRIBUTE_NOINLINE bool cordz_should_profile_slow() { + // TODO(b/162942788): check if profiling is disabled at compile time. + if (absl_internal_cordz_disabled) { + ABSL_RAW_LOG(WARNING, "Cordz info disabled at compile time"); + // We are permanently disabled: set counter to highest possible value. + cordz_next_sample = std::numeric_limits<int64_t>::max(); + return false; + } + + thread_local absl::base_internal::ExponentialBiased + exponential_biased_generator; + int32_t mean_interval = get_cordz_mean_interval(); + + // Check if we disabled profiling. If so, set the next sample to a "large" + // number to minimize the overhead of the should_profile codepath. + if (mean_interval <= 0) { + cordz_next_sample = kIntervalIfDisabled; + return false; + } + + // Check if we're always sampling. + if (mean_interval == 1) { + cordz_next_sample = 1; + return true; + } + + if (cordz_next_sample <= 0) { + cordz_next_sample = exponential_biased_generator.GetStride(mean_interval); + return true; + } + + --cordz_next_sample; + return false; +} + +void cordz_set_next_sample_for_testing(int64_t next_sample) { + cordz_next_sample = next_sample; +} + +#endif // ABSL_INTERNAL_CORDZ_ENABLED + +int32_t get_cordz_mean_interval() { + return g_cordz_mean_interval.load(std::memory_order_acquire); +} + +void set_cordz_mean_interval(int32_t mean_interval) { + g_cordz_mean_interval.store(mean_interval, std::memory_order_release); +} + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h b/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h new file mode 100644 index 0000000..c9ba145 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h
@@ -0,0 +1,85 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_STRINGS_CORDZ_FUNCTIONS_H_ +#define ABSL_STRINGS_CORDZ_FUNCTIONS_H_ + +#include <stdint.h> + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/optimization.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +// Returns the current sample rate. This represents the average interval +// between samples. +int32_t get_cordz_mean_interval(); + +// Sets the sample rate with the average interval between samples. +void set_cordz_mean_interval(int32_t mean_interval); + +// Enable cordz unless any of the following applies: +// - no thread local support +// - MSVC build +// - Android build +// - Apple build +// - DLL build +// Hashtablez is turned off completely in opensource builds. +// MSVC's static atomics are dynamically initialized in debug mode, which breaks +// sampling. +#if defined(ABSL_HAVE_THREAD_LOCAL) && !defined(_MSC_VER) && \ + !defined(ABSL_BUILD_DLL) && !defined(ABSL_CONSUME_DLL) && \ + !defined(__ANDROID__) && !defined(__APPLE__) +#define ABSL_INTERNAL_CORDZ_ENABLED 1 +#endif + +#ifdef ABSL_INTERNAL_CORDZ_ENABLED + +// cordz_next_sample is the number of events until the next sample event. If +// the value is 1 or less, the code will check on the next event if cordz is +// enabled, and if so, will sample the Cord. cordz is only enabled when we can +// use thread locals. +ABSL_CONST_INIT extern thread_local int64_t cordz_next_sample; + +// Determines if the next sample should be profiled. If it is, the value pointed +// at by next_sample will be set with the interval until the next sample. +bool cordz_should_profile_slow(); + +// Returns true if the next cord should be sampled. +inline bool cordz_should_profile() { + if (ABSL_PREDICT_TRUE(cordz_next_sample > 1)) { + cordz_next_sample--; + return false; + } + return cordz_should_profile_slow(); +} + +// Sets the interval until the next sample (for testing only) +void cordz_set_next_sample_for_testing(int64_t next_sample); + +#else // ABSL_INTERNAL_CORDZ_ENABLED + +inline bool cordz_should_profile() { return false; } +inline void cordz_set_next_sample_for_testing(int64_t) {} + +#endif // ABSL_INTERNAL_CORDZ_ENABLED + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_CORDZ_FUNCTIONS_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_functions_test.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_functions_test.cc new file mode 100644 index 0000000..f2cefae3 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_functions_test.cc
@@ -0,0 +1,131 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_functions.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { +namespace { + +using ::testing::Eq; +using ::testing::Ge; +using ::testing::Le; + +TEST(CordzFunctionsTest, SampleRate) { + int32_t orig_sample_rate = get_cordz_mean_interval(); + int32_t expected_sample_rate = 123; + set_cordz_mean_interval(expected_sample_rate); + EXPECT_THAT(get_cordz_mean_interval(), Eq(expected_sample_rate)); + set_cordz_mean_interval(orig_sample_rate); +} + +// Cordz is disabled when we don't have thread_local. All calls to +// should_profile will return false when cordz is diabled, so we might want to +// avoid those tests. +#ifdef ABSL_INTERNAL_CORDZ_ENABLED + +TEST(CordzFunctionsTest, ShouldProfileDisable) { + int32_t orig_sample_rate = get_cordz_mean_interval(); + + set_cordz_mean_interval(0); + cordz_set_next_sample_for_testing(0); + EXPECT_FALSE(cordz_should_profile()); + // 1 << 16 is from kIntervalIfDisabled in cordz_functions.cc. + EXPECT_THAT(cordz_next_sample, Eq(1 << 16)); + + set_cordz_mean_interval(orig_sample_rate); +} + +TEST(CordzFunctionsTest, ShouldProfileAlways) { + int32_t orig_sample_rate = get_cordz_mean_interval(); + + set_cordz_mean_interval(1); + cordz_set_next_sample_for_testing(1); + EXPECT_TRUE(cordz_should_profile()); + EXPECT_THAT(cordz_next_sample, Le(1)); + + set_cordz_mean_interval(orig_sample_rate); +} + +TEST(CordzFunctionsTest, ShouldProfileRate) { + static constexpr int kDesiredMeanInterval = 1000; + static constexpr int kSamples = 10000; + int32_t orig_sample_rate = get_cordz_mean_interval(); + + set_cordz_mean_interval(kDesiredMeanInterval); + + int64_t sum_of_intervals = 0; + for (int i = 0; i < kSamples; i++) { + // Setting next_sample to 0 will force cordz_should_profile to generate a + // new value for next_sample each iteration. + cordz_set_next_sample_for_testing(0); + cordz_should_profile(); + sum_of_intervals += cordz_next_sample; + } + + // The sum of independent exponential variables is an Erlang distribution, + // which is a gamma distribution where the shape parameter is equal to the + // number of summands. The distribution used for cordz_should_profile is + // actually floor(Exponential(1/mean)) which introduces bias. However, we can + // apply the squint-really-hard correction factor. That is, when mean is + // large, then if we squint really hard the shape of the distribution between + // N and N+1 looks like a uniform distribution. On average, each value for + // next_sample will be about 0.5 lower than we would expect from an + // exponential distribution. This squint-really-hard correction approach won't + // work when mean is smaller than about 10 but works fine when mean is 1000. + // + // We can use R to calculate a confidence interval. This + // shows how to generate a confidence interval with a false positive rate of + // one in a billion. + // + // $ R -q + // > mean = 1000 + // > kSamples = 10000 + // > errorRate = 1e-9 + // > correction = -kSamples / 2 + // > low = qgamma(errorRate/2, kSamples, 1/mean) + correction + // > high = qgamma(1 - errorRate/2, kSamples, 1/mean) + correction + // > low + // [1] 9396115 + // > high + // [1] 10618100 + EXPECT_THAT(sum_of_intervals, Ge(9396115)); + EXPECT_THAT(sum_of_intervals, Le(10618100)); + + set_cordz_mean_interval(orig_sample_rate); +} + +#else // ABSL_INTERNAL_CORDZ_ENABLED + +TEST(CordzFunctionsTest, ShouldProfileDisabled) { + int32_t orig_sample_rate = get_cordz_mean_interval(); + + set_cordz_mean_interval(1); + cordz_set_next_sample_for_testing(0); + EXPECT_FALSE(cordz_should_profile()); + + set_cordz_mean_interval(orig_sample_rate); +} + +#endif // ABSL_INTERNAL_CORDZ_ENABLED + +} // namespace +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc new file mode 100644 index 0000000..5297ec8 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc
@@ -0,0 +1,134 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "absl/strings/internal/cordz_handle.h" + +#include <atomic> + +#include "absl/base/internal/raw_logging.h" // For ABSL_RAW_CHECK +#include "absl/base/internal/spinlock.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +using ::absl::base_internal::SpinLockHolder; + +ABSL_CONST_INIT CordzHandle::Queue CordzHandle::global_queue_(absl::kConstInit); + +CordzHandle::CordzHandle(bool is_snapshot) : is_snapshot_(is_snapshot) { + if (is_snapshot) { + SpinLockHolder lock(&queue_->mutex); + CordzHandle* dq_tail = queue_->dq_tail.load(std::memory_order_acquire); + if (dq_tail != nullptr) { + dq_prev_ = dq_tail; + dq_tail->dq_next_ = this; + } + queue_->dq_tail.store(this, std::memory_order_release); + } +} + +CordzHandle::~CordzHandle() { + ODRCheck(); + if (is_snapshot_) { + std::vector<CordzHandle*> to_delete; + { + SpinLockHolder lock(&queue_->mutex); + CordzHandle* next = dq_next_; + if (dq_prev_ == nullptr) { + // We were head of the queue, delete every CordzHandle until we reach + // either the end of the list, or a snapshot handle. + while (next && !next->is_snapshot_) { + to_delete.push_back(next); + next = next->dq_next_; + } + } else { + // Another CordzHandle existed before this one, don't delete anything. + dq_prev_->dq_next_ = next; + } + if (next) { + next->dq_prev_ = dq_prev_; + } else { + queue_->dq_tail.store(dq_prev_, std::memory_order_release); + } + } + for (CordzHandle* handle : to_delete) { + delete handle; + } + } +} + +void CordzHandle::Delete(CordzHandle* handle) { + if (handle) { + handle->ODRCheck(); + Queue* const queue = handle->queue_; + if (!handle->is_snapshot_ && !queue->IsEmpty()) { + SpinLockHolder lock(&queue->mutex); + CordzHandle* dq_tail = queue->dq_tail.load(std::memory_order_acquire); + if (dq_tail != nullptr) { + handle->dq_prev_ = dq_tail; + dq_tail->dq_next_ = handle; + queue->dq_tail.store(handle, std::memory_order_release); + return; + } + } + delete handle; + } +} + +std::vector<const CordzHandle*> CordzHandle::DiagnosticsGetDeleteQueue() { + std::vector<const CordzHandle*> handles; + SpinLockHolder lock(&global_queue_.mutex); + CordzHandle* dq_tail = global_queue_.dq_tail.load(std::memory_order_acquire); + for (const CordzHandle* p = dq_tail; p; p = p->dq_prev_) { + handles.push_back(p); + } + return handles; +} + +bool CordzHandle::DiagnosticsHandleIsSafeToInspect( + const CordzHandle* handle) const { + ODRCheck(); + if (!is_snapshot_) return false; + if (handle == nullptr) return true; + if (handle->is_snapshot_) return false; + bool snapshot_found = false; + SpinLockHolder lock(&queue_->mutex); + for (const CordzHandle* p = queue_->dq_tail; p; p = p->dq_prev_) { + if (p == handle) return !snapshot_found; + if (p == this) snapshot_found = true; + } + ABSL_ASSERT(snapshot_found); // Assert that 'this' is in delete queue. + return true; +} + +std::vector<const CordzHandle*> +CordzHandle::DiagnosticsGetSafeToInspectDeletedHandles() { + ODRCheck(); + std::vector<const CordzHandle*> handles; + if (!is_snapshot()) { + return handles; + } + + SpinLockHolder lock(&queue_->mutex); + for (const CordzHandle* p = dq_next_; p != nullptr; p = p->dq_next_) { + if (!p->is_snapshot()) { + handles.push_back(p); + } + } + return handles; +} + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h b/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h new file mode 100644 index 0000000..93076cf --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h
@@ -0,0 +1,120 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_STRINGS_CORDZ_HANDLE_H_ +#define ABSL_STRINGS_CORDZ_HANDLE_H_ + +#include <atomic> +#include <vector> + +#include "absl/base/config.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/internal/spinlock.h" +#include "absl/synchronization/mutex.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +// This base class allows multiple types of object (CordzInfo and +// CordzSampleToken) to exist simultaneously on the delete queue (pointed to by +// global_dq_tail and traversed using dq_prev_ and dq_next_). The +// delete queue guarantees that once a profiler creates a CordzSampleToken and +// has gained visibility into a CordzInfo object, that CordzInfo object will not +// be deleted prematurely. This allows the profiler to inspect all CordzInfo +// objects that are alive without needing to hold a global lock. +class CordzHandle { + public: + CordzHandle() : CordzHandle(false) {} + + bool is_snapshot() const { return is_snapshot_; } + + // Deletes the provided instance, or puts it on the delete queue to be deleted + // once there are no more sample tokens (snapshot) instances potentially + // referencing the instance. `handle` may be null. + static void Delete(CordzHandle* handle); + + // Returns the current entries in the delete queue in LIFO order. + static std::vector<const CordzHandle*> DiagnosticsGetDeleteQueue(); + + // Returns true if the provided handle is nullptr or guarded by this handle. + // Since the CordzSnapshot token is itself a CordzHandle, this method will + // allow tests to check if that token is keeping an arbitrary CordzHandle + // alive. + bool DiagnosticsHandleIsSafeToInspect(const CordzHandle* handle) const; + + // Returns the current entries in the delete queue, in LIFO order, that are + // protected by this. CordzHandle objects are only placed on the delete queue + // after CordzHandle::Delete is called with them as an argument. Only + // CordzHandle objects that are not also CordzSnapshot objects will be + // included in the return vector. For each of the handles in the return + // vector, the earliest that their memory can be freed is when this + // CordzSnapshot object is deleted. + std::vector<const CordzHandle*> DiagnosticsGetSafeToInspectDeletedHandles(); + + protected: + explicit CordzHandle(bool is_snapshot); + virtual ~CordzHandle(); + + private: + // Global queue data. CordzHandle stores a pointer to the global queue + // instance to harden against ODR violations. + struct Queue { + constexpr explicit Queue(absl::ConstInitType) + : mutex(absl::kConstInit, + absl::base_internal::SCHEDULE_COOPERATIVE_AND_KERNEL) {} + + absl::base_internal::SpinLock mutex; + std::atomic<CordzHandle*> dq_tail ABSL_GUARDED_BY(mutex){nullptr}; + + // Returns true if this delete queue is empty. This method does not acquire + // the lock, but does a 'load acquire' observation on the delete queue tail. + // It is used inside Delete() to check for the presence of a delete queue + // without holding the lock. The assumption is that the caller is in the + // state of 'being deleted', and can not be newly discovered by a concurrent + // 'being constructed' snapshot instance. Practically, this means that any + // such discovery (`find`, 'first' or 'next', etc) must have proper 'happens + // before / after' semantics and atomic fences. + bool IsEmpty() const ABSL_NO_THREAD_SAFETY_ANALYSIS { + return dq_tail.load(std::memory_order_acquire) == nullptr; + } + }; + + void ODRCheck() const { +#ifndef NDEBUG + ABSL_RAW_CHECK(queue_ == &global_queue_, "ODR violation in Cord"); +#endif + } + + ABSL_CONST_INIT static Queue global_queue_; + Queue* const queue_ = &global_queue_; + const bool is_snapshot_; + + // dq_prev_ and dq_next_ require the global queue mutex to be held. + // Unfortunately we can't use thread annotations such that the thread safety + // analysis understands that queue_ and global_queue_ are one and the same. + CordzHandle* dq_prev_ = nullptr; + CordzHandle* dq_next_ = nullptr; +}; + +class CordzSnapshot : public CordzHandle { + public: + CordzSnapshot() : CordzHandle(true) {} +}; + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_CORDZ_HANDLE_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_handle_test.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_handle_test.cc new file mode 100644 index 0000000..c04240e --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_handle_test.cc
@@ -0,0 +1,253 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "absl/strings/internal/cordz_handle.h" + +#include <random> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/memory/memory.h" +#include "absl/synchronization/internal/thread_pool.h" +#include "absl/synchronization/notification.h" +#include "absl/time/clock.h" +#include "absl/time/time.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { +namespace { + +using ::testing::ElementsAre; +using ::testing::Gt; +using ::testing::IsEmpty; +using ::testing::SizeIs; + +// Local less verbose helper +std::vector<const CordzHandle*> DeleteQueue() { + return CordzHandle::DiagnosticsGetDeleteQueue(); +} + +struct CordzHandleDeleteTracker : public CordzHandle { + bool* deleted; + explicit CordzHandleDeleteTracker(bool* deleted) : deleted(deleted) {} + ~CordzHandleDeleteTracker() override { *deleted = true; } +}; + +TEST(CordzHandleTest, DeleteQueueIsEmpty) { + EXPECT_THAT(DeleteQueue(), SizeIs(0)); +} + +TEST(CordzHandleTest, CordzHandleCreateDelete) { + bool deleted = false; + auto* handle = new CordzHandleDeleteTracker(&deleted); + EXPECT_FALSE(handle->is_snapshot()); + EXPECT_THAT(DeleteQueue(), SizeIs(0)); + + CordzHandle::Delete(handle); + EXPECT_THAT(DeleteQueue(), SizeIs(0)); + EXPECT_TRUE(deleted); +} + +TEST(CordzHandleTest, CordzSnapshotCreateDelete) { + auto* snapshot = new CordzSnapshot(); + EXPECT_TRUE(snapshot->is_snapshot()); + EXPECT_THAT(DeleteQueue(), ElementsAre(snapshot)); + delete snapshot; + EXPECT_THAT(DeleteQueue(), SizeIs(0)); +} + +TEST(CordzHandleTest, CordzHandleCreateDeleteWithSnapshot) { + bool deleted = false; + auto* snapshot = new CordzSnapshot(); + auto* handle = new CordzHandleDeleteTracker(&deleted); + + CordzHandle::Delete(handle); + EXPECT_THAT(DeleteQueue(), ElementsAre(handle, snapshot)); + EXPECT_FALSE(deleted); + + delete snapshot; + EXPECT_THAT(DeleteQueue(), SizeIs(0)); + EXPECT_TRUE(deleted); +} + +TEST(CordzHandleTest, MultiSnapshot) { + bool deleted[3] = {false, false, false}; + + CordzSnapshot* snapshot[3]; + CordzHandleDeleteTracker* handle[3]; + for (int i = 0; i < 3; ++i) { + snapshot[i] = new CordzSnapshot(); + handle[i] = new CordzHandleDeleteTracker(&deleted[i]); + CordzHandle::Delete(handle[i]); + } + + EXPECT_THAT(DeleteQueue(), ElementsAre(handle[2], snapshot[2], handle[1], + snapshot[1], handle[0], snapshot[0])); + EXPECT_THAT(deleted, ElementsAre(false, false, false)); + + delete snapshot[1]; + EXPECT_THAT(DeleteQueue(), ElementsAre(handle[2], snapshot[2], handle[1], + handle[0], snapshot[0])); + EXPECT_THAT(deleted, ElementsAre(false, false, false)); + + delete snapshot[0]; + EXPECT_THAT(DeleteQueue(), ElementsAre(handle[2], snapshot[2])); + EXPECT_THAT(deleted, ElementsAre(true, true, false)); + + delete snapshot[2]; + EXPECT_THAT(DeleteQueue(), SizeIs(0)); + EXPECT_THAT(deleted, ElementsAre(true, true, deleted)); +} + +TEST(CordzHandleTest, DiagnosticsHandleIsSafeToInspect) { + CordzSnapshot snapshot1; + EXPECT_TRUE(snapshot1.DiagnosticsHandleIsSafeToInspect(nullptr)); + + auto* handle1 = new CordzHandle(); + EXPECT_TRUE(snapshot1.DiagnosticsHandleIsSafeToInspect(handle1)); + + CordzHandle::Delete(handle1); + EXPECT_TRUE(snapshot1.DiagnosticsHandleIsSafeToInspect(handle1)); + + CordzSnapshot snapshot2; + auto* handle2 = new CordzHandle(); + EXPECT_TRUE(snapshot1.DiagnosticsHandleIsSafeToInspect(handle1)); + EXPECT_TRUE(snapshot1.DiagnosticsHandleIsSafeToInspect(handle2)); + EXPECT_FALSE(snapshot2.DiagnosticsHandleIsSafeToInspect(handle1)); + EXPECT_TRUE(snapshot2.DiagnosticsHandleIsSafeToInspect(handle2)); + + CordzHandle::Delete(handle2); + EXPECT_TRUE(snapshot1.DiagnosticsHandleIsSafeToInspect(handle1)); +} + +TEST(CordzHandleTest, DiagnosticsGetSafeToInspectDeletedHandles) { + EXPECT_THAT(DeleteQueue(), IsEmpty()); + + auto* handle = new CordzHandle(); + auto* snapshot1 = new CordzSnapshot(); + + // snapshot1 should be able to see handle. + EXPECT_THAT(DeleteQueue(), ElementsAre(snapshot1)); + EXPECT_TRUE(snapshot1->DiagnosticsHandleIsSafeToInspect(handle)); + EXPECT_THAT(snapshot1->DiagnosticsGetSafeToInspectDeletedHandles(), + IsEmpty()); + + // This handle will be safe to inspect as long as snapshot1 is alive. However, + // since only snapshot1 can prove that it's alive, it will be hidden from + // snapshot2. + CordzHandle::Delete(handle); + + // This snapshot shouldn't be able to see handle because handle was already + // sent to Delete. + auto* snapshot2 = new CordzSnapshot(); + + // DeleteQueue elements are LIFO order. + EXPECT_THAT(DeleteQueue(), ElementsAre(snapshot2, handle, snapshot1)); + + EXPECT_TRUE(snapshot1->DiagnosticsHandleIsSafeToInspect(handle)); + EXPECT_FALSE(snapshot2->DiagnosticsHandleIsSafeToInspect(handle)); + + EXPECT_THAT(snapshot1->DiagnosticsGetSafeToInspectDeletedHandles(), + ElementsAre(handle)); + EXPECT_THAT(snapshot2->DiagnosticsGetSafeToInspectDeletedHandles(), + IsEmpty()); + + CordzHandle::Delete(snapshot1); + EXPECT_THAT(DeleteQueue(), ElementsAre(snapshot2)); + + CordzHandle::Delete(snapshot2); + EXPECT_THAT(DeleteQueue(), IsEmpty()); +} + +// Create and delete CordzHandle and CordzSnapshot objects in multiple threads +// so that tsan has some time to chew on it and look for memory problems. +TEST(CordzHandleTest, MultiThreaded) { + Notification stop; + static constexpr int kNumThreads = 4; + // Keep the number of handles relatively small so that the test will naturally + // transition to an empty delete queue during the test. If there are, say, 100 + // handles, that will virtually never happen. With 10 handles and around 50k + // iterations in each of 4 threads, the delete queue appears to become empty + // around 200 times. + static constexpr int kNumHandles = 10; + + // Each thread is going to pick a random index and atomically swap its + // CordzHandle with one in handles. This way, each thread can avoid + // manipulating a CordzHandle that might be operated upon in another thread. + std::vector<std::atomic<CordzHandle*>> handles(kNumHandles); + + absl::synchronization_internal::ThreadPool pool(kNumThreads); + + for (int i = 0; i < kNumThreads; ++i) { + pool.Schedule([&stop, &handles]() { + std::minstd_rand gen; + std::uniform_int_distribution<int> dist_type(0, 2); + std::uniform_int_distribution<int> dist_handle(0, kNumHandles - 1); + size_t max_safe_to_inspect = 0; + while (!stop.HasBeenNotified()) { + CordzHandle* handle; + switch (dist_type(gen)) { + case 0: + handle = new CordzHandle(); + break; + case 1: + handle = new CordzSnapshot(); + break; + default: + handle = nullptr; + break; + } + CordzHandle* old_handle = handles[dist_handle(gen)].exchange(handle); + if (old_handle != nullptr) { + std::vector<const CordzHandle*> safe_to_inspect = + old_handle->DiagnosticsGetSafeToInspectDeletedHandles(); + for (const CordzHandle* handle : safe_to_inspect) { + // We're in a tight loop, so don't generate too many error messages. + ASSERT_FALSE(handle->is_snapshot()); + } + if (safe_to_inspect.size() > max_safe_to_inspect) { + max_safe_to_inspect = safe_to_inspect.size(); + } + } + CordzHandle::Delete(old_handle); + } + + // Confirm that the test did *something*. This check will be satisfied as + // long as this thread has delete a CordzSnapshot object and a + // non-snapshot CordzHandle was deleted after the CordzSnapshot was + // created. This max_safe_to_inspect count will often reach around 30 + // (assuming 4 threads and 10 slots for live handles). Don't use a strict + // bound to avoid making this test flaky. + EXPECT_THAT(max_safe_to_inspect, Gt(0)); + + // Have each thread attempt to clean up everything. Some thread will be + // the last to reach this cleanup code, and it will be guaranteed to clean + // up everything because nothing remains to create new handles. + for (size_t i = 0; i < handles.size(); i++) { + CordzHandle* handle = handles[i].exchange(nullptr); + CordzHandle::Delete(handle); + } + }); + } + + // The threads will hammer away. Give it a little bit of time for tsan to + // spot errors. + absl::SleepFor(absl::Seconds(3)); + stop.Notify(); +} + +} // namespace +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc new file mode 100644 index 0000000..0461ec4 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc
@@ -0,0 +1,197 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_info.h" + +#include "absl/base/config.h" +#include "absl/base/internal/spinlock.h" +#include "absl/debugging/stacktrace.h" +#include "absl/strings/internal/cord_internal.h" +#include "absl/strings/internal/cordz_handle.h" +#include "absl/strings/internal/cordz_statistics.h" +#include "absl/strings/internal/cordz_update_tracker.h" +#include "absl/synchronization/mutex.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +using ::absl::base_internal::SpinLockHolder; + +constexpr int CordzInfo::kMaxStackDepth; + +ABSL_CONST_INIT CordzInfo::List CordzInfo::global_list_{absl::kConstInit}; + +CordzInfo* CordzInfo::Head(const CordzSnapshot& snapshot) { + ABSL_ASSERT(snapshot.is_snapshot()); + + // We can do an 'unsafe' load of 'head', as we are guaranteed that the + // instance it points to is kept alive by the provided CordzSnapshot, so we + // can simply return the current value using an acquire load. + // We do enforce in DEBUG builds that the 'head' value is present in the + // delete queue: ODR violations may lead to 'snapshot' and 'global_list_' + // being in different libraries / modules. + CordzInfo* head = global_list_.head.load(std::memory_order_acquire); + ABSL_ASSERT(snapshot.DiagnosticsHandleIsSafeToInspect(head)); + return head; +} + +CordzInfo* CordzInfo::Next(const CordzSnapshot& snapshot) const { + ABSL_ASSERT(snapshot.is_snapshot()); + + // Similar to the 'Head()' function, we do not need a mutex here. + CordzInfo* next = ci_next_.load(std::memory_order_acquire); + ABSL_ASSERT(snapshot.DiagnosticsHandleIsSafeToInspect(this)); + ABSL_ASSERT(snapshot.DiagnosticsHandleIsSafeToInspect(next)); + return next; +} + +void CordzInfo::TrackCord(InlineData& cord, MethodIdentifier method) { + assert(cord.is_tree()); + assert(!cord.is_profiled()); + CordzInfo* cordz_info = new CordzInfo(cord.as_tree(), nullptr, method); + cord.set_cordz_info(cordz_info); + cordz_info->Track(); +} + +void CordzInfo::TrackCord(InlineData& cord, const InlineData& src, + MethodIdentifier method) { + assert(cord.is_tree()); + assert(!cord.is_profiled()); + auto* info = src.is_tree() && src.is_profiled() ? src.cordz_info() : nullptr; + CordzInfo* cordz_info = new CordzInfo(cord.as_tree(), info, method); + cord.set_cordz_info(cordz_info); + cordz_info->Track(); +} + +CordzInfo::MethodIdentifier CordzInfo::GetParentMethod(const CordzInfo* src) { + if (src == nullptr) return MethodIdentifier::kUnknown; + return src->parent_method_ != MethodIdentifier::kUnknown ? src->parent_method_ + : src->method_; +} + +int CordzInfo::FillParentStack(const CordzInfo* src, void** stack) { + assert(stack); + if (src == nullptr) return 0; + if (src->parent_stack_depth_) { + memcpy(stack, src->parent_stack_, src->parent_stack_depth_ * sizeof(void*)); + return src->parent_stack_depth_; + } + memcpy(stack, src->stack_, src->stack_depth_ * sizeof(void*)); + return src->stack_depth_; +} + +CordzInfo::CordzInfo(CordRep* rep, const CordzInfo* src, + MethodIdentifier method) + : rep_(rep), + stack_depth_(absl::GetStackTrace(stack_, /*max_depth=*/kMaxStackDepth, + /*skip_count=*/1)), + parent_stack_depth_(FillParentStack(src, parent_stack_)), + method_(method), + parent_method_(GetParentMethod(src)), + create_time_(absl::Now()), + size_(rep->length) { + update_tracker_.LossyAdd(method); +} + +CordzInfo::~CordzInfo() { + // `rep_` is potentially kept alive if CordzInfo is included + // in a collection snapshot (which should be rare). + if (ABSL_PREDICT_FALSE(rep_)) { + CordRep::Unref(rep_); + } +} + +void CordzInfo::Track() { + SpinLockHolder l(&list_->mutex); + + CordzInfo* const head = list_->head.load(std::memory_order_acquire); + if (head != nullptr) { + head->ci_prev_.store(this, std::memory_order_release); + } + ci_next_.store(head, std::memory_order_release); + list_->head.store(this, std::memory_order_release); +} + +void CordzInfo::Untrack() { + { + // TODO(b/117940323): change this to assuming ownership instead once all + // Cord logic is properly keeping `rep_` in sync with the Cord root rep. + absl::MutexLock lock(&mutex_); + rep_ = nullptr; + } + + ODRCheck(); + { + SpinLockHolder l(&list_->mutex); + + CordzInfo* const head = list_->head.load(std::memory_order_acquire); + CordzInfo* const next = ci_next_.load(std::memory_order_acquire); + CordzInfo* const prev = ci_prev_.load(std::memory_order_acquire); + + if (next) { + ABSL_ASSERT(next->ci_prev_.load(std::memory_order_acquire) == this); + next->ci_prev_.store(prev, std::memory_order_release); + } + if (prev) { + ABSL_ASSERT(head != this); + ABSL_ASSERT(prev->ci_next_.load(std::memory_order_acquire) == this); + prev->ci_next_.store(next, std::memory_order_release); + } else { + ABSL_ASSERT(head == this); + list_->head.store(next, std::memory_order_release); + } + } + CordzHandle::Delete(this); +} + +void CordzInfo::Lock(MethodIdentifier method) + ABSL_EXCLUSIVE_LOCK_FUNCTION(mutex_) { + mutex_.Lock(); + update_tracker_.LossyAdd(method); + assert(rep_); +} + +void CordzInfo::Unlock() ABSL_UNLOCK_FUNCTION(mutex_) { + bool tracked = rep_ != nullptr; + if (rep_) { + size_.store(rep_->length); + } + mutex_.Unlock(); + if (!tracked) { + Untrack(); + } +} + +absl::Span<void* const> CordzInfo::GetStack() const { + return absl::MakeConstSpan(stack_, stack_depth_); +} + +absl::Span<void* const> CordzInfo::GetParentStack() const { + return absl::MakeConstSpan(parent_stack_, parent_stack_depth_); +} + +CordzStatistics CordzInfo::GetCordzStatistics() const { + CordzStatistics stats; + stats.method = method_; + stats.parent_method = parent_method_; + stats.update_tracker = update_tracker_; + stats.size = size_.load(std::memory_order_relaxed); + return stats; +} + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_info.h b/third_party/abseil-cpp/absl/strings/internal/cordz_info.h new file mode 100644 index 0000000..f7682cb --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_info.h
@@ -0,0 +1,251 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_STRINGS_CORDZ_INFO_H_ +#define ABSL_STRINGS_CORDZ_INFO_H_ + +#include <atomic> +#include <cstdint> +#include <functional> + +#include "absl/base/config.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/internal/spinlock.h" +#include "absl/base/thread_annotations.h" +#include "absl/strings/internal/cord_internal.h" +#include "absl/strings/internal/cordz_functions.h" +#include "absl/strings/internal/cordz_handle.h" +#include "absl/strings/internal/cordz_statistics.h" +#include "absl/strings/internal/cordz_update_tracker.h" +#include "absl/synchronization/mutex.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +// CordzInfo tracks a profiled Cord. Each of these objects can be in two places. +// If a Cord is alive, the CordzInfo will be in the global_cordz_infos map, and +// can also be retrieved via the linked list starting with +// global_cordz_infos_head and continued via the cordz_info_next() method. When +// a Cord has reached the end of its lifespan, the CordzInfo object will be +// migrated out of the global_cordz_infos list and the global_cordz_infos_map, +// and will either be deleted or appended to the global_delete_queue. If it is +// placed on the global_delete_queue, the CordzInfo object will be cleaned in +// the destructor of a CordzSampleToken object. +class ABSL_LOCKABLE CordzInfo : public CordzHandle { + public: + using MethodIdentifier = CordzUpdateTracker::MethodIdentifier; + + // TrackCord creates a CordzInfo instance which tracks important metrics of + // a sampled cord, and stores the created CordzInfo instance into `cord'. All + // CordzInfo instances are placed in a global list which is used to discover + // and snapshot all actively tracked cords. Callers are responsible for + // calling UntrackCord() before the tracked Cord instance is deleted, or to + // stop tracking the sampled Cord. Callers are also responsible for guarding + // changes to the 'tree' value of a Cord (InlineData.tree) through the Lock() + // and Unlock() calls. Any change resulting in a new tree value for the cord + // requires a call to SetCordRep() before the old tree has been unreffed + // and/or deleted. `method` identifies the Cord public API method initiating + // the cord to be sampled. + // Requires `cord` to hold a tree, and `cord.cordz_info()` to be null. + static void TrackCord(InlineData& cord, MethodIdentifier method); + + // Identical to TrackCord(), except that this function fills the + // `parent_stack` and `parent_method` properties of the returned CordzInfo + // instance from the provided `src` instance if `src` is sampled. + // This function should be used for sampling 'copy constructed' cords. + static void TrackCord(InlineData& cord, const InlineData& src, + MethodIdentifier method); + + // Maybe sample the cord identified by 'cord' for method 'method'. + // Uses `cordz_should_profile` to randomly pick cords to be sampled, and if + // so, invokes `TrackCord` to start sampling `cord`. + static void MaybeTrackCord(InlineData& cord, MethodIdentifier method); + static void MaybeTrackCord(InlineData& cord, const InlineData& src, + MethodIdentifier method); + + // Stops tracking changes for a sampled cord, and deletes the provided info. + // This function must be called before the sampled cord instance is deleted, + // and before the root cordrep of the sampled cord is unreffed. + // This function may extend the lifetime of the cordrep in cases where the + // CordInfo instance is being held by a concurrent collection thread. + void Untrack(); + + // Invokes UntrackCord() on `info` if `info` is not null. + static void MaybeUntrackCord(CordzInfo* info); + + CordzInfo() = delete; + CordzInfo(const CordzInfo&) = delete; + CordzInfo& operator=(const CordzInfo&) = delete; + + // Retrieves the oldest existing CordzInfo. + static CordzInfo* Head(const CordzSnapshot& snapshot) + ABSL_NO_THREAD_SAFETY_ANALYSIS; + + // Retrieves the next oldest existing CordzInfo older than 'this' instance. + CordzInfo* Next(const CordzSnapshot& snapshot) const + ABSL_NO_THREAD_SAFETY_ANALYSIS; + + // Locks this instance for the update identified by `method`. + // Increases the count for `method` in `update_tracker`. + void Lock(MethodIdentifier method) ABSL_EXCLUSIVE_LOCK_FUNCTION(mutex_); + + // Unlocks this instance. If the contained `rep` has been set to null + // indicating the Cord has been cleared or is otherwise no longer sampled, + // then this method will delete this CordzInfo instance. + void Unlock() ABSL_UNLOCK_FUNCTION(mutex_); + + // Asserts that this CordzInfo instance is locked. + void AssertHeld() ABSL_ASSERT_EXCLUSIVE_LOCK(mutex_); + + // Updates the `rep' property of this instance. This methods is invoked by + // Cord logic each time the root node of a sampled Cord changes, and before + // the old root reference count is deleted. This guarantees that collection + // code can always safely take a reference on the tracked cord. + // Requires a lock to be held through the `Lock()` method. + // TODO(b/117940323): annotate with ABSL_EXCLUSIVE_LOCKS_REQUIRED once all + // Cord code is in a state where this can be proven true by the compiler. + void SetCordRep(CordRep* rep); + + // Returns the current value of `rep_` for testing purposes only. + CordRep* GetCordRepForTesting() const ABSL_NO_THREAD_SAFETY_ANALYSIS { + return rep_; + } + + // Returns the stack trace for where the cord was first sampled. Cords are + // potentially sampled when they promote from an inlined cord to a tree or + // ring representation, which is not necessarily the location where the cord + // was first created. Some cords are created as inlined cords, and only as + // data is added do they become a non-inlined cord. However, typically the + // location represents reasonably well where the cord is 'created'. + absl::Span<void* const> GetStack() const; + + // Returns the stack trace for a sampled cord's 'parent stack trace'. This + // value may be set if the cord is sampled (promoted) after being created + // from, or being assigned the value of an existing (sampled) cord. + absl::Span<void* const> GetParentStack() const; + + // Retrieves the CordzStatistics associated with this Cord. The statistics + // are only updated when a Cord goes through a mutation, such as an Append + // or RemovePrefix. + CordzStatistics GetCordzStatistics() const; + + // Records size metric for this CordzInfo instance. + void RecordMetrics(int64_t size) { + size_.store(size, std::memory_order_relaxed); + } + + private: + // Global cordz info list. CordzInfo stores a pointer to the global list + // instance to harden against ODR violations. + struct List { + constexpr explicit List(absl::ConstInitType) + : mutex(absl::kConstInit, + absl::base_internal::SCHEDULE_COOPERATIVE_AND_KERNEL) {} + + absl::base_internal::SpinLock mutex; + std::atomic<CordzInfo*> head ABSL_GUARDED_BY(mutex){nullptr}; + }; + + static constexpr int kMaxStackDepth = 64; + + explicit CordzInfo(CordRep* rep, const CordzInfo* src, + MethodIdentifier method); + ~CordzInfo() override; + + void Track(); + + // Returns the parent method from `src`, which is either `parent_method_` or + // `method_` depending on `parent_method_` being kUnknown. + // Returns kUnknown if `src` is null. + static MethodIdentifier GetParentMethod(const CordzInfo* src); + + // Fills the provided stack from `src`, copying either `parent_stack_` or + // `stack_` depending on `parent_stack_` being empty, returning the size of + // the parent stack. + // Returns 0 if `src` is null. + static int FillParentStack(const CordzInfo* src, void** stack); + + void ODRCheck() const { +#ifndef NDEBUG + ABSL_RAW_CHECK(list_ == &global_list_, "ODR violation in Cord"); +#endif + } + + ABSL_CONST_INIT static List global_list_; + List* const list_ = &global_list_; + + // ci_prev_ and ci_next_ require the global list mutex to be held. + // Unfortunately we can't use thread annotations such that the thread safety + // analysis understands that list_ and global_list_ are one and the same. + std::atomic<CordzInfo*> ci_prev_{nullptr}; + std::atomic<CordzInfo*> ci_next_{nullptr}; + + mutable absl::Mutex mutex_; + CordRep* rep_ ABSL_GUARDED_BY(mutex_); + + void* stack_[kMaxStackDepth]; + void* parent_stack_[kMaxStackDepth]; + const int stack_depth_; + const int parent_stack_depth_; + const MethodIdentifier method_; + const MethodIdentifier parent_method_; + CordzUpdateTracker update_tracker_; + const absl::Time create_time_; + + // Last recorded size for the cord. + std::atomic<int64_t> size_{0}; +}; + +inline ABSL_ATTRIBUTE_ALWAYS_INLINE void CordzInfo::MaybeTrackCord( + InlineData& cord, MethodIdentifier method) { + if (ABSL_PREDICT_FALSE(cordz_should_profile())) { + TrackCord(cord, method); + } +} + +inline ABSL_ATTRIBUTE_ALWAYS_INLINE void CordzInfo::MaybeTrackCord( + InlineData& cord, const InlineData& src, MethodIdentifier method) { + if (ABSL_PREDICT_FALSE(cordz_should_profile())) { + TrackCord(cord, src, method); + } +} + +inline ABSL_ATTRIBUTE_ALWAYS_INLINE void CordzInfo::MaybeUntrackCord( + CordzInfo* info) { + if (ABSL_PREDICT_FALSE(info)) { + info->Untrack(); + } +} + +inline void CordzInfo::AssertHeld() ABSL_ASSERT_EXCLUSIVE_LOCK(mutex_) { +#ifndef NDEBUG + mutex_.AssertHeld(); +#endif +} + +inline void CordzInfo::SetCordRep(CordRep* rep) { + AssertHeld(); + rep_ = rep; + if (rep) { + size_.store(rep->length); + } +} + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_CORDZ_INFO_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_info_test.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_info_test.cc new file mode 100644 index 0000000..5eaf4b9 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_info_test.cc
@@ -0,0 +1,302 @@ +// Copyright 2019 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_info.h" + +#include <vector> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/debugging/stacktrace.h" +#include "absl/debugging/symbolize.h" +#include "absl/strings/cordz_test_helpers.h" +#include "absl/strings/internal/cord_rep_flat.h" +#include "absl/strings/internal/cordz_handle.h" +#include "absl/strings/internal/cordz_statistics.h" +#include "absl/strings/internal/cordz_update_tracker.h" +#include "absl/strings/str_cat.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { +namespace { + +using ::testing::ElementsAre; +using ::testing::Eq; +using ::testing::HasSubstr; +using ::testing::Ne; + +// Used test values +auto constexpr kUnknownMethod = CordzUpdateTracker::kUnknown; +auto constexpr kTrackCordMethod = CordzUpdateTracker::kConstructorString; +auto constexpr kChildMethod = CordzUpdateTracker::kConstructorCord; +auto constexpr kUpdateMethod = CordzUpdateTracker::kAppendString; + +// Local less verbose helper +std::vector<const CordzHandle*> DeleteQueue() { + return CordzHandle::DiagnosticsGetDeleteQueue(); +} + +std::string FormatStack(absl::Span<void* const> raw_stack) { + static constexpr size_t buf_size = 1 << 14; + std::unique_ptr<char[]> buf(new char[buf_size]); + std::string output; + for (void* stackp : raw_stack) { + if (absl::Symbolize(stackp, buf.get(), buf_size)) { + absl::StrAppend(&output, " ", buf.get(), "\n"); + } + } + return output; +} + +TEST(CordzInfoTest, TrackCord) { + TestCordData data; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info = data.data.cordz_info(); + ASSERT_THAT(info, Ne(nullptr)); + EXPECT_FALSE(info->is_snapshot()); + EXPECT_THAT(CordzInfo::Head(CordzSnapshot()), Eq(info)); + EXPECT_THAT(info->GetCordRepForTesting(), Eq(data.rep.rep)); + info->Untrack(); +} + +TEST(CordzInfoTest, UntrackCord) { + TestCordData data; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info = data.data.cordz_info(); + + CordzSnapshot snapshot; + info->Untrack(); + EXPECT_THAT(CordzInfo::Head(CordzSnapshot()), Eq(nullptr)); + EXPECT_THAT(info->GetCordRepForTesting(), Eq(nullptr)); + EXPECT_THAT(DeleteQueue(), ElementsAre(info, &snapshot)); +} + +TEST(CordzInfoTest, SetCordRep) { + TestCordData data; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info = data.data.cordz_info(); + + TestCordRep rep; + info->Lock(CordzUpdateTracker::kAppendCord); + info->SetCordRep(rep.rep); + info->Unlock(); + EXPECT_THAT(info->GetCordRepForTesting(), Eq(rep.rep)); + + info->Untrack(); +} + +TEST(CordzInfoTest, SetCordRepNullUntracksCordOnUnlock) { + TestCordData data; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info = data.data.cordz_info(); + + info->Lock(CordzUpdateTracker::kAppendString); + info->SetCordRep(nullptr); + EXPECT_THAT(info->GetCordRepForTesting(), Eq(nullptr)); + EXPECT_THAT(CordzInfo::Head(CordzSnapshot()), Eq(info)); + + info->Unlock(); + EXPECT_THAT(CordzInfo::Head(CordzSnapshot()), Eq(nullptr)); +} + +#if GTEST_HAS_DEATH_TEST + +TEST(CordzInfoTest, SetCordRepRequiresMutex) { + TestCordData data; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info = data.data.cordz_info(); + TestCordRep rep; + EXPECT_DEBUG_DEATH(info->SetCordRep(rep.rep), ".*"); + info->Untrack(); +} + +#endif // GTEST_HAS_DEATH_TEST + +TEST(CordzInfoTest, TrackUntrackHeadFirstV2) { + CordzSnapshot snapshot; + EXPECT_THAT(CordzInfo::Head(snapshot), Eq(nullptr)); + + TestCordData data; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info1 = data.data.cordz_info(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(info1)); + EXPECT_THAT(info1->Next(snapshot), Eq(nullptr)); + + TestCordData data2; + CordzInfo::TrackCord(data2.data, kTrackCordMethod); + CordzInfo* info2 = data2.data.cordz_info(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(info2)); + EXPECT_THAT(info2->Next(snapshot), Eq(info1)); + EXPECT_THAT(info1->Next(snapshot), Eq(nullptr)); + + info2->Untrack(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(info1)); + EXPECT_THAT(info1->Next(snapshot), Eq(nullptr)); + + info1->Untrack(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(nullptr)); +} + +TEST(CordzInfoTest, TrackUntrackTailFirstV2) { + CordzSnapshot snapshot; + EXPECT_THAT(CordzInfo::Head(snapshot), Eq(nullptr)); + + TestCordData data; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info1 = data.data.cordz_info(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(info1)); + EXPECT_THAT(info1->Next(snapshot), Eq(nullptr)); + + TestCordData data2; + CordzInfo::TrackCord(data2.data, kTrackCordMethod); + CordzInfo* info2 = data2.data.cordz_info(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(info2)); + EXPECT_THAT(info2->Next(snapshot), Eq(info1)); + EXPECT_THAT(info1->Next(snapshot), Eq(nullptr)); + + info1->Untrack(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(info2)); + EXPECT_THAT(info2->Next(snapshot), Eq(nullptr)); + + info2->Untrack(); + ASSERT_THAT(CordzInfo::Head(snapshot), Eq(nullptr)); +} + +TEST(CordzInfoTest, StackV2) { + TestCordData data; + // kMaxStackDepth is intentionally less than 64 (which is the max depth that + // Cordz will record) because if the actual stack depth is over 64 + // (which it is on Apple platforms) then the expected_stack will end up + // catching a few frames at the end that the actual_stack didn't get and + // it will no longer be subset. At the time of this writing 58 is the max + // that will allow this test to pass (with a minimum os version of iOS 9), so + // rounded down to 50 to hopefully not run into this in the future if Apple + // makes small modifications to its testing stack. 50 is sufficient to prove + // that we got a decent stack. + static constexpr int kMaxStackDepth = 50; + CordzInfo::TrackCord(data.data, kTrackCordMethod); + CordzInfo* info = data.data.cordz_info(); + std::vector<void*> local_stack; + local_stack.resize(kMaxStackDepth); + // In some environments we don't get stack traces. For example in Android + // absl::GetStackTrace will return 0 indicating it didn't find any stack. The + // resultant formatted stack will be "", but that still equals the stack + // recorded in CordzInfo, which is also empty. The skip_count is 1 so that the + // line number of the current stack isn't included in the HasSubstr check. + local_stack.resize(absl::GetStackTrace(local_stack.data(), kMaxStackDepth, + /*skip_count=*/1)); + + std::string got_stack = FormatStack(info->GetStack()); + std::string expected_stack = FormatStack(local_stack); + // If TrackCord is inlined, got_stack should match expected_stack. If it isn't + // inlined, got_stack should include an additional frame not present in + // expected_stack. Either way, expected_stack should be a substring of + // got_stack. + EXPECT_THAT(got_stack, HasSubstr(expected_stack)); + + info->Untrack(); +} + +// Local helper functions to get different stacks for child and parent. +CordzInfo* TrackChildCord(InlineData& data, const InlineData& parent) { + CordzInfo::TrackCord(data, parent, kChildMethod); + return data.cordz_info(); +} +CordzInfo* TrackParentCord(InlineData& data) { + CordzInfo::TrackCord(data, kTrackCordMethod); + return data.cordz_info(); +} + +TEST(CordzInfoTest, GetStatistics) { + TestCordData data; + CordzInfo* info = TrackParentCord(data.data); + + CordzStatistics statistics = info->GetCordzStatistics(); + EXPECT_THAT(statistics.size, Eq(data.rep.rep->length)); + EXPECT_THAT(statistics.method, Eq(kTrackCordMethod)); + EXPECT_THAT(statistics.parent_method, Eq(kUnknownMethod)); + EXPECT_THAT(statistics.update_tracker.Value(kTrackCordMethod), Eq(1)); + + info->Untrack(); +} + +TEST(CordzInfoTest, LockCountsMethod) { + TestCordData data; + CordzInfo* info = TrackParentCord(data.data); + + info->Lock(kUpdateMethod); + info->Unlock(); + info->Lock(kUpdateMethod); + info->Unlock(); + + CordzStatistics statistics = info->GetCordzStatistics(); + EXPECT_THAT(statistics.update_tracker.Value(kUpdateMethod), Eq(2)); + + info->Untrack(); +} + +TEST(CordzInfoTest, FromParent) { + TestCordData parent; + TestCordData child; + CordzInfo* info_parent = TrackParentCord(parent.data); + CordzInfo* info_child = TrackChildCord(child.data, parent.data); + + std::string stack = FormatStack(info_parent->GetStack()); + std::string parent_stack = FormatStack(info_child->GetParentStack()); + EXPECT_THAT(stack, Eq(parent_stack)); + + CordzStatistics statistics = info_child->GetCordzStatistics(); + EXPECT_THAT(statistics.size, Eq(child.rep.rep->length)); + EXPECT_THAT(statistics.method, Eq(kChildMethod)); + EXPECT_THAT(statistics.parent_method, Eq(kTrackCordMethod)); + EXPECT_THAT(statistics.update_tracker.Value(kChildMethod), Eq(1)); + + info_parent->Untrack(); + info_child->Untrack(); +} + +TEST(CordzInfoTest, FromParentInlined) { + InlineData parent; + TestCordData child; + CordzInfo* info = TrackChildCord(child.data, parent); + EXPECT_TRUE(info->GetParentStack().empty()); + CordzStatistics statistics = info->GetCordzStatistics(); + EXPECT_THAT(statistics.size, Eq(child.rep.rep->length)); + EXPECT_THAT(statistics.method, Eq(kChildMethod)); + EXPECT_THAT(statistics.parent_method, Eq(kUnknownMethod)); + EXPECT_THAT(statistics.update_tracker.Value(kChildMethod), Eq(1)); + info->Untrack(); +} + +TEST(CordzInfoTest, RecordMetrics) { + TestCordData data; + CordzInfo* info = TrackParentCord(data.data); + + CordzStatistics expected; + expected.size = 100; + info->RecordMetrics(expected.size); + + CordzStatistics actual = info->GetCordzStatistics(); + EXPECT_EQ(actual.size, expected.size); + + info->Untrack(); +} + +} // namespace +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token.cc new file mode 100644 index 0000000..ba1270d8 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token.cc
@@ -0,0 +1,64 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_sample_token.h" + +#include "absl/base/config.h" +#include "absl/strings/internal/cordz_handle.h" +#include "absl/strings/internal/cordz_info.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +CordzSampleToken::Iterator& CordzSampleToken::Iterator::operator++() { + if (current_) { + current_ = current_->Next(*token_); + } + return *this; +} + +CordzSampleToken::Iterator CordzSampleToken::Iterator::operator++(int) { + Iterator it(*this); + operator++(); + return it; +} + +bool operator==(const CordzSampleToken::Iterator& lhs, + const CordzSampleToken::Iterator& rhs) { + return lhs.current_ == rhs.current_ && + (lhs.current_ == nullptr || lhs.token_ == rhs.token_); +} + +bool operator!=(const CordzSampleToken::Iterator& lhs, + const CordzSampleToken::Iterator& rhs) { + return !(lhs == rhs); +} + +CordzSampleToken::Iterator::reference CordzSampleToken::Iterator::operator*() + const { + return *current_; +} + +CordzSampleToken::Iterator::pointer CordzSampleToken::Iterator::operator->() + const { + return current_; +} + +CordzSampleToken::Iterator::Iterator(const CordzSampleToken* token) + : token_(token), current_(CordzInfo::Head(*token)) {} + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token.h b/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token.h new file mode 100644 index 0000000..28a1d70c --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token.h
@@ -0,0 +1,97 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/base/config.h" +#include "absl/strings/internal/cordz_handle.h" +#include "absl/strings/internal/cordz_info.h" + +#ifndef ABSL_STRINGS_CORDZ_SAMPLE_TOKEN_H_ +#define ABSL_STRINGS_CORDZ_SAMPLE_TOKEN_H_ + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +// The existence of a CordzSampleToken guarantees that a reader can traverse the +// global_cordz_infos_head linked-list without needing to hold a mutex. When a +// CordzSampleToken exists, all CordzInfo objects that would be destroyed are +// instead appended to a deletion queue. When the CordzSampleToken is destroyed, +// it will also clean up any of these CordzInfo objects. +// +// E.g., ST are CordzSampleToken objects and CH are CordzHandle objects. +// ST1 <- CH1 <- CH2 <- ST2 <- CH3 <- global_delete_queue_tail +// +// This list tracks that CH1 and CH2 were created after ST1, so the thread +// holding ST1 might have a referece to CH1, CH2, ST2, and CH3. However, ST2 was +// created later, so the thread holding the ST2 token cannot have a reference to +// ST1, CH1, or CH2. If ST1 is cleaned up first, that thread will delete ST1, +// CH1, and CH2. If instead ST2 is cleaned up first, that thread will only +// delete ST2. +// +// If ST1 is cleaned up first, the new list will be: +// ST2 <- CH3 <- global_delete_queue_tail +// +// If ST2 is cleaned up first, the new list will be: +// ST1 <- CH1 <- CH2 <- CH3 <- global_delete_queue_tail +// +// All new CordzHandle objects are appended to the list, so if a new thread +// comes along before either ST1 or ST2 are cleaned up, the new list will be: +// ST1 <- CH1 <- CH2 <- ST2 <- CH3 <- ST3 <- global_delete_queue_tail +// +// A thread must hold the global_delete_queue_mu mutex whenever it's altering +// this list. +// +// It is safe for thread that holds a CordzSampleToken to read +// global_cordz_infos at any time since the objects it is able to retrieve will +// not be deleted while the CordzSampleToken exists. +class CordzSampleToken : public CordzSnapshot { + public: + class Iterator { + public: + using iterator_category = std::input_iterator_tag; + using value_type = const CordzInfo&; + using difference_type = ptrdiff_t; + using pointer = const CordzInfo*; + using reference = value_type; + + Iterator() = default; + + Iterator& operator++(); + Iterator operator++(int); + friend bool operator==(const Iterator& lhs, const Iterator& rhs); + friend bool operator!=(const Iterator& lhs, const Iterator& rhs); + reference operator*() const; + pointer operator->() const; + + private: + friend class CordzSampleToken; + explicit Iterator(const CordzSampleToken* token); + + const CordzSampleToken* token_ = nullptr; + pointer current_ = nullptr; + }; + + CordzSampleToken() = default; + CordzSampleToken(const CordzSampleToken&) = delete; + CordzSampleToken& operator=(const CordzSampleToken&) = delete; + + Iterator begin() { return Iterator(this); } + Iterator end() { return Iterator(); } +}; + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_CORDZ_SAMPLE_TOKEN_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc new file mode 100644 index 0000000..9f54301 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc
@@ -0,0 +1,208 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_sample_token.h" + +#include <memory> +#include <type_traits> +#include <vector> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/memory/memory.h" +#include "absl/random/random.h" +#include "absl/strings/cordz_test_helpers.h" +#include "absl/strings/internal/cord_rep_flat.h" +#include "absl/strings/internal/cordz_handle.h" +#include "absl/strings/internal/cordz_info.h" +#include "absl/synchronization/internal/thread_pool.h" +#include "absl/synchronization/notification.h" +#include "absl/time/clock.h" +#include "absl/time/time.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { +namespace { + +using ::testing::ElementsAre; +using ::testing::Eq; +using ::testing::Ne; + +// Used test values +auto constexpr kTrackCordMethod = CordzUpdateTracker::kConstructorString; + +TEST(CordzSampleTokenTest, IteratorTraits) { + static_assert(std::is_copy_constructible<CordzSampleToken::Iterator>::value, + ""); + static_assert(std::is_copy_assignable<CordzSampleToken::Iterator>::value, ""); + static_assert(std::is_move_constructible<CordzSampleToken::Iterator>::value, + ""); + static_assert(std::is_move_assignable<CordzSampleToken::Iterator>::value, ""); + static_assert( + std::is_same< + std::iterator_traits<CordzSampleToken::Iterator>::iterator_category, + std::input_iterator_tag>::value, + ""); + static_assert( + std::is_same<std::iterator_traits<CordzSampleToken::Iterator>::value_type, + const CordzInfo&>::value, + ""); + static_assert( + std::is_same< + std::iterator_traits<CordzSampleToken::Iterator>::difference_type, + ptrdiff_t>::value, + ""); + static_assert( + std::is_same<std::iterator_traits<CordzSampleToken::Iterator>::pointer, + const CordzInfo*>::value, + ""); + static_assert( + std::is_same<std::iterator_traits<CordzSampleToken::Iterator>::reference, + const CordzInfo&>::value, + ""); +} + +TEST(CordzSampleTokenTest, IteratorEmpty) { + CordzSampleToken token; + EXPECT_THAT(token.begin(), Eq(token.end())); +} + +TEST(CordzSampleTokenTest, Iterator) { + TestCordData cord1, cord2, cord3; + CordzInfo::TrackCord(cord1.data, kTrackCordMethod); + CordzInfo* info1 = cord1.data.cordz_info(); + CordzInfo::TrackCord(cord2.data, kTrackCordMethod); + CordzInfo* info2 = cord2.data.cordz_info(); + CordzInfo::TrackCord(cord3.data, kTrackCordMethod); + CordzInfo* info3 = cord3.data.cordz_info(); + + CordzSampleToken token; + std::vector<const CordzInfo*> found; + for (const CordzInfo& cord_info : token) { + found.push_back(&cord_info); + } + + EXPECT_THAT(found, ElementsAre(info3, info2, info1)); + + info1->Untrack(); + info2->Untrack(); + info3->Untrack(); +} + +TEST(CordzSampleTokenTest, IteratorEquality) { + TestCordData cord1; + TestCordData cord2; + TestCordData cord3; + CordzInfo::TrackCord(cord1.data, kTrackCordMethod); + CordzInfo* info1 = cord1.data.cordz_info(); + + CordzSampleToken token1; + // lhs starts with the CordzInfo corresponding to cord1 at the head. + CordzSampleToken::Iterator lhs = token1.begin(); + + CordzInfo::TrackCord(cord2.data, kTrackCordMethod); + CordzInfo* info2 = cord2.data.cordz_info(); + + CordzSampleToken token2; + // rhs starts with the CordzInfo corresponding to cord2 at the head. + CordzSampleToken::Iterator rhs = token2.begin(); + + CordzInfo::TrackCord(cord3.data, kTrackCordMethod); + CordzInfo* info3 = cord3.data.cordz_info(); + + // lhs is on cord1 while rhs is on cord2. + EXPECT_THAT(lhs, Ne(rhs)); + + rhs++; + // lhs and rhs are both on cord1, but they didn't come from the same + // CordzSampleToken. + EXPECT_THAT(lhs, Ne(rhs)); + + lhs++; + rhs++; + // Both lhs and rhs are done, so they are on nullptr. + EXPECT_THAT(lhs, Eq(rhs)); + + info1->Untrack(); + info2->Untrack(); + info3->Untrack(); +} + +TEST(CordzSampleTokenTest, MultiThreaded) { + Notification stop; + static constexpr int kNumThreads = 4; + static constexpr int kNumCords = 3; + static constexpr int kNumTokens = 3; + absl::synchronization_internal::ThreadPool pool(kNumThreads); + + for (int i = 0; i < kNumThreads; ++i) { + pool.Schedule([&stop]() { + absl::BitGen gen; + TestCordData cords[kNumCords]; + std::unique_ptr<CordzSampleToken> tokens[kNumTokens]; + + while (!stop.HasBeenNotified()) { + // Randomly perform one of five actions: + // 1) Untrack + // 2) Track + // 3) Iterate over Cords visible to a token. + // 4) Unsample + // 5) Sample + int index = absl::Uniform(gen, 0, kNumCords); + if (absl::Bernoulli(gen, 0.5)) { + TestCordData& cord = cords[index]; + // Track/untrack. + if (cord.data.is_profiled()) { + // 1) Untrack + cord.data.cordz_info()->Untrack(); + cord.data.clear_cordz_info();; + } else { + // 2) Track + CordzInfo::TrackCord(cord.data, kTrackCordMethod); + } + } else { + std::unique_ptr<CordzSampleToken>& token = tokens[index]; + if (token) { + if (absl::Bernoulli(gen, 0.5)) { + // 3) Iterate over Cords visible to a token. + for (const CordzInfo& info : *token) { + // This is trivial work to allow us to compile the loop. + EXPECT_THAT(info.Next(*token), Ne(&info)); + } + } else { + // 4) Unsample + token = nullptr; + } + } else { + // 5) Sample + token = absl::make_unique<CordzSampleToken>(); + } + } + } + for (TestCordData& cord : cords) { + CordzInfo::MaybeUntrackCord(cord.data.cordz_info()); + } + }); + } + // The threads will hammer away. Give it a little bit of time for tsan to + // spot errors. + absl::SleepFor(absl::Seconds(3)); + stop.Notify(); +} + +} // namespace +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h b/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h new file mode 100644 index 0000000..6e335c0 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h
@@ -0,0 +1,67 @@ +// Copyright 2019 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_STRINGS_INTERNAL_CORDZ_STATISTICS_H_ +#define ABSL_STRINGS_INTERNAL_CORDZ_STATISTICS_H_ + +#include <cstdint> + +#include "absl/base/config.h" +#include "absl/strings/internal/cordz_update_tracker.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +// CordzStatistics captures some meta information about a Cord's shape. +struct CordzStatistics { + using MethodIdentifier = CordzUpdateTracker::MethodIdentifier; + + // The size of the cord in bytes. This matches the result of Cord::size(). + int64_t size = 0; + + // The estimated memory used by the sampled cord. This value matches the + // value as reported by Cord::EstimatedMemoryUsage(). + // A value of 0 implies the property has not been recorded. + int64_t estimated_memory_usage = 0; + + // The effective memory used by the sampled cord, inversely weighted by the + // effective indegree of each allocated node. This is a representation of the + // fair share of memory usage that should be attributed to the sampled cord. + // This value is more useful for cases where one or more nodes are referenced + // by multiple Cord instances, and for cases where a Cord includes the same + // node multiple times (either directly or indirectly). + // A value of 0 implies the property has not been recorded. + int64_t estimated_fair_share_memory_usage = 0; + + // The total number of nodes referenced by this cord. + // For ring buffer Cords, this includes the 'ring buffer' node. + // A value of 0 implies the property has not been recorded. + int64_t node_count = 0; + + // The cord method responsible for sampling the cord. + MethodIdentifier method = MethodIdentifier::kUnknown; + + // The cord method responsible for sampling the parent cord if applicable. + MethodIdentifier parent_method = MethodIdentifier::kUnknown; + + // Update tracker tracking invocation count per cord method. + CordzUpdateTracker update_tracker; +}; + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_INTERNAL_CORDZ_STATISTICS_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h b/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h new file mode 100644 index 0000000..57ba75d --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h
@@ -0,0 +1,71 @@ +// Copyright 2021 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_STRINGS_INTERNAL_CORDZ_UPDATE_SCOPE_H_ +#define ABSL_STRINGS_INTERNAL_CORDZ_UPDATE_SCOPE_H_ + +#include "absl/base/config.h" +#include "absl/base/optimization.h" +#include "absl/base/thread_annotations.h" +#include "absl/strings/internal/cord_internal.h" +#include "absl/strings/internal/cordz_info.h" +#include "absl/strings/internal/cordz_update_tracker.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +// CordzUpdateScope scopes an update to the provided CordzInfo. +// The class invokes `info->Lock(method)` and `info->Unlock()` to guard +// cordrep updates. This class does nothing if `info` is null. +// See also the 'Lock`, `Unlock` and `SetCordRep` methods in `CordzInfo`. +class ABSL_SCOPED_LOCKABLE CordzUpdateScope { + public: + CordzUpdateScope(CordzInfo* info, CordzUpdateTracker::MethodIdentifier method) + ABSL_EXCLUSIVE_LOCK_FUNCTION(info) + : info_(info) { + if (ABSL_PREDICT_FALSE(info_)) { + info->Lock(method); + } + } + + // CordzUpdateScope can not be copied or assigned to. + CordzUpdateScope(CordzUpdateScope&& rhs) = delete; + CordzUpdateScope(const CordzUpdateScope&) = delete; + CordzUpdateScope& operator=(CordzUpdateScope&& rhs) = delete; + CordzUpdateScope& operator=(const CordzUpdateScope&) = delete; + + ~CordzUpdateScope() ABSL_UNLOCK_FUNCTION() { + if (ABSL_PREDICT_FALSE(info_)) { + info_->Unlock(); + } + } + + void SetCordRep(CordRep* rep) const { + if (ABSL_PREDICT_FALSE(info_)) { + info_->SetCordRep(rep); + } + } + + CordzInfo* info() const { return info_; } + + private: + CordzInfo* info_; +}; + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_INTERNAL_CORDZ_UPDATE_SCOPE_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope_test.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope_test.cc new file mode 100644 index 0000000..3d08c62 --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope_test.cc
@@ -0,0 +1,49 @@ +// Copyright 2021 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_update_scope.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/strings/cordz_test_helpers.h" +#include "absl/strings/internal/cord_rep_flat.h" +#include "absl/strings/internal/cordz_info.h" +#include "absl/strings/internal/cordz_update_tracker.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +namespace { + +// Used test values +auto constexpr kTrackCordMethod = CordzUpdateTracker::kConstructorString; + +TEST(CordzUpdateScopeTest, ScopeNullptr) { + CordzUpdateScope scope(nullptr, kTrackCordMethod); +} + +TEST(CordzUpdateScopeTest, ScopeSampledCord) { + TestCordData cord; + CordzInfo::TrackCord(cord.data, kTrackCordMethod); + CordzUpdateScope scope(cord.data.cordz_info(), kTrackCordMethod); + cord.data.cordz_info()->SetCordRep(nullptr); +} + +} // namespace +ABSL_NAMESPACE_END +} // namespace cord_internal + +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h b/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h new file mode 100644 index 0000000..741950b --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h
@@ -0,0 +1,107 @@ +// Copyright 2021 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_STRINGS_INTERNAL_CORDZ_UPDATE_TRACKER_H_ +#define ABSL_STRINGS_INTERNAL_CORDZ_UPDATE_TRACKER_H_ + +#include <atomic> +#include <cstdint> + +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { + +// CordzUpdateTracker tracks counters for Cord update methods. +// +// The purpose of CordzUpdateTracker is to track the number of calls to methods +// updating Cord data for sampled cords. The class internally uses 'lossy' +// atomic operations: Cord is thread-compatible, so there is no need to +// synchronize updates. However, Cordz collection threads may call 'Value()' at +// any point, so the class needs to provide thread safe access. +// +// This class is thread-safe. But as per above comments, all non-const methods +// should be used single-threaded only: updates are thread-safe but lossy. +class CordzUpdateTracker { + public: + // Tracked update methods. + enum MethodIdentifier { + kUnknown, + kAppendCord, + kAppendExternalMemory, + kAppendString, + kAssignCord, + kAssignString, + kClear, + kConstructorCord, + kConstructorString, + kFlatten, + kGetAppendRegion, + kMoveAppendCord, + kMoveAssignCord, + kMovePrependCord, + kPrependCord, + kPrependString, + kRemovePrefix, + kRemoveSuffix, + kSubCord, + + // kNumMethods defines the number of entries: must be the last entry. + kNumMethods, + }; + + // Constructs a new instance. All counters are zero-initialized. + constexpr CordzUpdateTracker() noexcept : values_{} {} + + // Copy constructs a new instance. + CordzUpdateTracker(const CordzUpdateTracker& rhs) noexcept { *this = rhs; } + + // Assigns the provided value to this instance. + CordzUpdateTracker& operator=(const CordzUpdateTracker& rhs) noexcept { + for (int i = 0; i < kNumMethods; ++i) { + values_[i].store(rhs.values_[i].load(std::memory_order_relaxed), + std::memory_order_relaxed); + } + return *this; + } + + // Returns the value for the specified method. + int64_t Value(MethodIdentifier method) const { + return values_[method].load(std::memory_order_relaxed); + } + + // Increases the value for the specified method by `n` + void LossyAdd(MethodIdentifier method, int64_t n = 1) { + auto& value = values_[method]; + value.store(value.load(std::memory_order_relaxed) + n, + std::memory_order_relaxed); + } + + private: + // Until C++20 std::atomic is not constexpr default-constructible, so we need + // a wrapper for this class to be constexpr constructible. + class Counter : public std::atomic<int64_t> { + public: + constexpr Counter() noexcept : std::atomic<int64_t>(0) {} + }; + + Counter values_[kNumMethods]; +}; + +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_STRINGS_INTERNAL_CORDZ_UPDATE_TRACKER_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker_test.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker_test.cc new file mode 100644 index 0000000..eda662f --- /dev/null +++ b/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker_test.cc
@@ -0,0 +1,141 @@ +// Copyright 2021 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/strings/internal/cordz_update_tracker.h" + +#include <array> +#include <thread> // NOLINT + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/synchronization/notification.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace cord_internal { +namespace { + +using ::testing::AnyOf; +using ::testing::Eq; + +using Method = CordzUpdateTracker::MethodIdentifier; +using Methods = std::array<Method, Method::kNumMethods>; + +// Returns an array of all methods defined in `MethodIdentifier` +Methods AllMethods() { + return Methods{Method::kUnknown, + Method::kAppendCord, + Method::kAppendExternalMemory, + Method::kAppendString, + Method::kAssignCord, + Method::kAssignString, + Method::kClear, + Method::kConstructorCord, + Method::kConstructorString, + Method::kFlatten, + Method::kGetAppendRegion, + Method::kMoveAppendCord, + Method::kMoveAssignCord, + Method::kMovePrependCord, + Method::kPrependCord, + Method::kPrependString, + Method::kRemovePrefix, + Method::kRemoveSuffix, + Method::kSubCord}; +} + +TEST(CordzUpdateTracker, IsConstExprAndInitializesToZero) { + constexpr CordzUpdateTracker tracker; + for (Method method : AllMethods()) { + ASSERT_THAT(tracker.Value(method), Eq(0)); + } +} + +TEST(CordzUpdateTracker, LossyAdd) { + int64_t n = 1; + CordzUpdateTracker tracker; + for (Method method : AllMethods()) { + tracker.LossyAdd(method, n); + EXPECT_THAT(tracker.Value(method), Eq(n)); + n += 2; + } +} + +TEST(CordzUpdateTracker, CopyConstructor) { + int64_t n = 1; + CordzUpdateTracker src; + for (Method method : AllMethods()) { + src.LossyAdd(method, n); + n += 2; + } + + n = 1; + CordzUpdateTracker tracker(src); + for (Method method : AllMethods()) { + EXPECT_THAT(tracker.Value(method), Eq(n)); + n += 2; + } +} + +TEST(CordzUpdateTracker, OperatorAssign) { + int64_t n = 1; + CordzUpdateTracker src; + CordzUpdateTracker tracker; + for (Method method : AllMethods()) { + src.LossyAdd(method, n); + n += 2; + } + + n = 1; + tracker = src; + for (Method method : AllMethods()) { + EXPECT_THAT(tracker.Value(method), Eq(n)); + n += 2; + } +} + +TEST(CordzUpdateTracker, ThreadSanitizedValueCheck) { + absl::Notification done; + CordzUpdateTracker tracker; + + std::thread reader([&done, &tracker] { + while (!done.HasBeenNotified()) { + int n = 1; + for (Method method : AllMethods()) { + EXPECT_THAT(tracker.Value(method), AnyOf(Eq(n), Eq(0))); + n += 2; + } + } + int n = 1; + for (Method method : AllMethods()) { + EXPECT_THAT(tracker.Value(method), Eq(n)); + n += 2; + } + }); + + int64_t n = 1; + for (Method method : AllMethods()) { + tracker.LossyAdd(method, n); + n += 2; + } + done.Notify(); + reader.join(); +} + +} // namespace +} // namespace cord_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc b/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc index 2123be6..28ef311e 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +++ b/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc
@@ -79,6 +79,7 @@ // Note that, since the thread ticker is just reset, we don't need to check // whether the thread is idle on the very first pass of the loop. bool first_pass = true; + while (true) { int32_t x = futex_.load(std::memory_order_relaxed); while (x != 0) { @@ -90,7 +91,6 @@ return true; // Consumed a wakeup, we are done. } - if (!first_pass) MaybeBecomeIdle(); const int err = Futex::WaitUntil(&futex_, 0, t); if (err != 0) {
diff --git a/third_party/abseil-cpp/absl/time/duration_test.cc b/third_party/abseil-cpp/absl/time/duration_test.cc index fb28fa9..a3617e7 100644 --- a/third_party/abseil-cpp/absl/time/duration_test.cc +++ b/third_party/abseil-cpp/absl/time/duration_test.cc
@@ -1320,7 +1320,7 @@ EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(0)); // TODO(bww): Is the next one OK? - EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(0.124999999e-9)); + EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(std::nextafter(0.125e-9, 0))); EXPECT_EQ(absl::Nanoseconds(1) / 4, absl::Seconds(0.125e-9)); EXPECT_EQ(absl::Nanoseconds(1) / 4, absl::Seconds(0.250e-9)); EXPECT_EQ(absl::Nanoseconds(1) / 2, absl::Seconds(0.375e-9)); @@ -1330,7 +1330,7 @@ EXPECT_EQ(absl::Nanoseconds(1), absl::Seconds(0.875e-9)); EXPECT_EQ(absl::Nanoseconds(1), absl::Seconds(1.000e-9)); - EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(-0.124999999e-9)); + EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(std::nextafter(-0.125e-9, 0))); EXPECT_EQ(-absl::Nanoseconds(1) / 4, absl::Seconds(-0.125e-9)); EXPECT_EQ(-absl::Nanoseconds(1) / 4, absl::Seconds(-0.250e-9)); EXPECT_EQ(-absl::Nanoseconds(1) / 2, absl::Seconds(-0.375e-9));
diff --git a/third_party/abseil-cpp/absl/time/time.h b/third_party/abseil-cpp/absl/time/time.h index 2df68581..48982df 100644 --- a/third_party/abseil-cpp/absl/time/time.h +++ b/third_party/abseil-cpp/absl/time/time.h
@@ -1352,7 +1352,7 @@ inline Duration MakePosDoubleDuration(double n) { const int64_t int_secs = static_cast<int64_t>(n); const uint32_t ticks = static_cast<uint32_t>( - (n - static_cast<double>(int_secs)) * kTicksPerSecond + 0.5); + std::round((n - static_cast<double>(int_secs)) * kTicksPerSecond)); return ticks < kTicksPerSecond ? MakeDuration(int_secs, ticks) : MakeDuration(int_secs + 1, ticks - kTicksPerSecond);
diff --git a/third_party/abseil-cpp/absl/types/span.h b/third_party/abseil-cpp/absl/types/span.h index 95fe792..41db342 100644 --- a/third_party/abseil-cpp/absl/types/span.h +++ b/third_party/abseil-cpp/absl/types/span.h
@@ -243,8 +243,8 @@ // template <typename LazyT = T, typename = EnableIfConstView<LazyT>> - Span( - std::initializer_list<value_type> v) noexcept // NOLINT(runtime/explicit) + Span(std::initializer_list<value_type> v + ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept // NOLINT(runtime/explicit) : Span(v.begin(), v.size()) {} // Accessors
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index 4945564..a05d35a0 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -9,12 +9,16 @@ ??$?0$$T@?$Storage@PEAUSubRange@absl@@$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEA$$T@Z ??$?0$$TAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$?0$$TAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??$?0$$TAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z + ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z + ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAUTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAUTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z @@ -22,6 +26,8 @@ ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAVFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TX@?$__compressed_pair_elem@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAPEAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z + ??$?0$$TX@?$__compressed_pair_elem@PEAPEAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z + ??$?0$$TX@?$__compressed_pair_elem@PEAPEBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAUTransition@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAUTransitionType@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z @@ -67,9 +73,11 @@ ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$?0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z ??$?0AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$T$00@?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z + ??$?0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??$?0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$T$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEA$$T@Z @@ -185,8 +193,10 @@ ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVBufferRawSink@12@@Z ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVFILERawSink@12@@Z ??$?4V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAAEAV01@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ??$?8PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV012@@__1@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z ??$?8PEAUTransitionType@cctz@time_internal@absl@@PEAU0123@@__1@std@@YA_NAEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$?8PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEBU0123@@__1@std@@YA_NAEBV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z + ??$?9PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z ??$?9PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@YA_NAEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$?9PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YA_NAEBV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z ??$?9VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@YA_NAEBV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@01@$$T@Z @@ -355,6 +365,7 @@ ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVFILERawSink@01@Vstring_view@1@@Z ??$InvokeReleaser@UStringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@X@cord_internal@absl@@YAXURank0@01@$$QEAUStringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@1@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@Vstring_view@1@@Z ??$LowLevelCallOnce@A6AXXZ$$V@base_internal@absl@@YAXPEAVonce_flag@1@A6AXXZ@Z + ??$MakeConstSpan@$SQEAX@absl@@YA?AV?$Span@QEAX@0@PEBQEAX_K@Z ??$MakeSpan@$SI$0BAA@@absl@@YA?AV?$Span@I@0@AEAY0BAA@I@Z ??$MakeSpan@$SI$0BIA@@absl@@YA?AV?$Span@I@0@AEAY0BIA@I@Z ??$MakeSpan@$SI$0CAA@@absl@@YA?AV?$Span@I@0@AEAY0CAA@I@Z @@ -444,6 +455,8 @@ ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__1@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAUCordRep@cord_internal@absl@@X@__1@std@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@PEAPEAUCordRep@cord_internal@absl@@1AEAPEAPEAU345@@Z + ??$__construct_backward_with_exception_guarantees@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@PEAVCordzHandle@cord_internal@absl@@X@__1@std@@YAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@PEAPEAVCordzHandle@cord_internal@absl@@1AEAPEAPEAV345@@Z + ??$__construct_backward_with_exception_guarantees@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@PEBVCordzHandle@cord_internal@absl@@X@__1@std@@YAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@PEAPEBVCordzHandle@cord_internal@absl@@1AEAPEAPEBV345@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@__1@std@@YAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@1AEAPEAU3456@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@UTransition@cctz@time_internal@absl@@X@__1@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@1AEAPEAU3456@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@UTransitionType@cctz@time_internal@absl@@X@__1@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@1AEAPEAU3456@@Z @@ -455,6 +468,8 @@ ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ??$__construct_one_at_end@AEAVstring_view@absl@@AEBV12@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAVstring_view@absl@@AEBV34@AEA_K@Z ??$__construct_one_at_end@AEBQEAUCordRep@cord_internal@absl@@@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAUCordRep@cord_internal@absl@@@Z + ??$__construct_one_at_end@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ??$__construct_one_at_end@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ??$__construct_one_at_end@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z ??$__construct_one_at_end@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$__construct_range_forward@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAUCordRep@cord_internal@absl@@PEAU456@PEAU456@PEAU456@X@__1@std@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@PEBQEAUCordRep@cord_internal@absl@@1AEAPEAPEAU345@@Z @@ -464,8 +479,12 @@ ??$__cxx_atomic_exchange@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@YAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZPEAU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@01@P6AX0@ZW4memory_order@01@@Z ??$__cxx_atomic_load@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@YAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZPEBU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@01@W4memory_order@01@@Z ??$__cxx_atomic_load@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@YAPEAUHashtablezInfo@container_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzHandle@cord_internal@absl@@@__1@std@@YAPEAVCordzHandle@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzInfo@cord_internal@absl@@@__1@std@@YAPEAVCordzInfo@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@W4memory_order@01@@Z ??$__cxx_atomic_load@W4OnDeadlockCycle@absl@@@__1@std@@YA?AW4OnDeadlockCycle@absl@@PEBU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4memory_order@01@@Z ??$__cxx_atomic_load@W4State@PerThreadSynch@base_internal@absl@@@__1@std@@YA?AW4State@PerThreadSynch@base_internal@absl@@PEBU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzHandle@cord_internal@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@PEAVCordzHandle@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzInfo@cord_internal@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@PEAVCordzInfo@cord_internal@absl@@W4memory_order@01@@Z ??$__cxx_atomic_store@W4OnDeadlockCycle@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4OnDeadlockCycle@absl@@W4memory_order@01@@Z ??$__cxx_atomic_store@W4State@PerThreadSynch@base_internal@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4State@PerThreadSynch@base_internal@absl@@W4memory_order@01@@Z ??$__distance@PEBUPayload@status_internal@absl@@@__1@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z @@ -484,6 +503,8 @@ ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@__1@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@__1@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z ??$__push_back_slow_path@AEBQEAUCordRep@cord_internal@absl@@@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAUCordRep@cord_internal@absl@@@Z + ??$__push_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ??$__push_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z ??$__push_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z @@ -493,6 +514,8 @@ ??$__to_address@$$CBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z ??$__to_address@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z ??$__to_address@PEAUCordRep@cord_internal@absl@@@__1@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@@Z + ??$__to_address@PEAVCordzHandle@cord_internal@absl@@@__1@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z + ??$__to_address@PEBVCordzHandle@cord_internal@absl@@@__1@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z ??$__to_address@UTransition@cctz@time_internal@absl@@@__1@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z ??$__to_address@UTransitionType@cctz@time_internal@absl@@@__1@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z @@ -535,10 +558,14 @@ ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@Z ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU345@@Z ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@$$QEAPEAU561@@Z + ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z + ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@AEBQEBU345@@Z ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@AEBQEBU561@@Z ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@$$QEAPEBU345@@Z ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@$$QEAPEBU561@@Z + ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z + ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV34567@@Z ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@X@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV45678@@Z ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z @@ -579,7 +606,9 @@ ??$destroy@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ??$destroy@PEAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@@Z ??$destroy@PEAUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@@Z + ??$destroy@PEAVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@@Z ??$destroy@PEBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@@Z + ??$destroy@PEBVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@@Z ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@XX@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$destroy@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@@Z @@ -632,7 +661,9 @@ ??$forward@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@YAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z + ??$forward@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@YAAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z + ??$forward@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@YAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAV123@@Z ??$forward@AEAV?$allocator@USubRange@absl@@@__1@std@@@absl@@YAAEAV?$allocator@USubRange@absl@@@__1@std@@AEAV123@@Z @@ -643,7 +674,9 @@ ??$forward@AEA_K@absl@@YAAEA_KAEA_K@Z ??$forward@AEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV23456@@Z ??$forward@AEBQEAUCordRep@cord_internal@absl@@@__1@std@@YAAEBQEAUCordRep@cord_internal@absl@@AEBQEAU234@@Z + ??$forward@AEBQEAVCordzHandle@cord_internal@absl@@@__1@std@@YAAEBQEAVCordzHandle@cord_internal@absl@@AEBQEAV234@@Z ??$forward@AEBQEBUCordRep@cord_internal@absl@@@__1@std@@YAAEBQEBUCordRep@cord_internal@absl@@AEBQEBU234@@Z + ??$forward@AEBQEBVCordzHandle@cord_internal@absl@@@__1@std@@YAAEBQEBVCordzHandle@cord_internal@absl@@AEBQEBV234@@Z ??$forward@AEBQEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAAEBQEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV23456@@Z ??$forward@AEBUHashtablezInfo@container_internal@absl@@@__1@std@@YAAEBUHashtablezInfo@container_internal@absl@@AEBU234@@Z ??$forward@AEBUPayload@status_internal@absl@@@__1@std@@YAAEBUPayload@status_internal@absl@@AEBU234@@Z @@ -726,7 +759,9 @@ ??$max_size@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$max_size@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@12@@Z ??$max_size@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z ??$max_size@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEBUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??$max_size@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$max_size@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@X@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z ??$max_size@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z @@ -740,6 +775,8 @@ ??$min@VDuration@absl@@U?$__less@VDuration@absl@@V12@@__1@std@@@__1@std@@YAAEBVDuration@absl@@AEBV23@0U?$__less@VDuration@absl@@V12@@01@@Z ??$move@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEAPEBV23456@@Z ??$move@AEAPEAPEAUCordRep@cord_internal@absl@@@__1@std@@YA$$QEAPEAPEAUCordRep@cord_internal@absl@@AEAPEAPEAU234@@Z + ??$move@AEAPEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@YA$$QEAPEAPEAVCordzHandle@cord_internal@absl@@AEAPEAPEAV234@@Z + ??$move@AEAPEAPEBVCordzHandle@cord_internal@absl@@@__1@std@@YA$$QEAPEAPEBVCordzHandle@cord_internal@absl@@AEAPEAPEBV234@@Z ??$move@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV23456@@Z ??$move@AEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YA$$QEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAPEAU2345@@Z ??$move@AEAPEAUCordRep@cord_internal@absl@@@__1@std@@YA$$QEAPEAUCordRep@cord_internal@absl@@AEAPEAU234@@Z @@ -769,6 +806,8 @@ ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z ??$swap@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAXAEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z ??$swap@PEAPEAUCordRep@cord_internal@absl@@@__1@std@@YAXAEAPEAPEAUCordRep@cord_internal@absl@@0@Z + ??$swap@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@YAXAEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z + ??$swap@PEAPEBVCordzHandle@cord_internal@absl@@@__1@std@@YAXAEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z ??$swap@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YAXAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z ??$swap@PEAUTransition@cctz@time_internal@absl@@@__1@std@@YAXAEAPEAUTransition@cctz@time_internal@absl@@0@Z ??$swap@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@YAXAEAPEAUTransitionType@cctz@time_internal@absl@@0@Z @@ -814,6 +853,7 @@ ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@XZ ??0?$Span@D@absl@@QEAA@PEAD_K@Z ??0?$Span@I@absl@@QEAA@PEAI_K@Z + ??0?$Span@QEAX@absl@@QEAA@PEBQEAX_K@Z ??0?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEAVFormatArgImpl@str_format_internal@1@_K@Z ??0?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ ??0?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ @@ -826,6 +866,7 @@ ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEAA@XZ ??0?$__compressed_pair_elem@U?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$0A@$0A@@__1@std@@QEAA@U__value_init_tag@12@@Z ??0?$__compressed_pair_elem@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z @@ -839,6 +880,8 @@ ??0?$__compressed_pair_elem@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z + ??0?$__compressed_pair_elem@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z + ??0?$__compressed_pair_elem@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$00$00@__1@std@@QEAA@U__value_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z @@ -848,8 +891,10 @@ ??0?$__compressed_pair_elem@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$__cxx_atomic_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@ZU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__cxx_atomic_impl@PEAUHashtablezInfo@container_internal@absl@@U?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PEAVCordzInfo@cord_internal@absl@@U?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$__deque_base@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__1@std@@AEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV34567@@Z ??0?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z @@ -866,6 +911,8 @@ ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z @@ -873,18 +920,23 @@ ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@QEAA@XZ ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@QEAA@XZ ??0?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??0?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??0?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??0?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@AEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z ??0?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@AEAA@PEAUTransition@cctz@time_internal@absl@@@Z ??0?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@AEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z ??0?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@AEAA@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??0?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAA@XZ ??0?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAA@XZ + ??0?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAA@XZ + ??0?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAA@XZ ??0?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAA@XZ @@ -896,6 +948,7 @@ ??0?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEAA@XZ ??0?$atomic@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$atomic@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$atomic@PEAVCordzInfo@cord_internal@absl@@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z @@ -943,6 +996,8 @@ ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAA@$$QEAV012@@Z ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA@XZ ??0?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@V?$initializer_list@PEAUCordRep@cord_internal@absl@@@2@@Z + ??0?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??0?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -985,6 +1040,13 @@ ??0CordRepRing@cord_internal@absl@@AEAA@I@Z ??0CordRepRingReader@cord_internal@absl@@QEAA@XZ ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzHandle@cord_internal@absl@@QEAA@XZ + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzStatistics@cord_internal@absl@@QEAA@XZ + ??0CordzUpdateScope@cord_internal@absl@@QEAA@PEAVCordzInfo@12@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzUpdateTracker@cord_internal@absl@@QEAA@XZ + ??0Counter@CordzUpdateTracker@cord_internal@absl@@QEAA@XZ ??0Duration@absl@@AEAA@_JI@Z ??0Duration@absl@@QEAA@XZ ??0ErrnoSaver@base_internal@absl@@QEAA@XZ @@ -997,9 +1059,11 @@ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ ??0HashtablezSampler@container_internal@absl@@QEAA@XZ ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ??0InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@012@@Z ??0InlineData@cord_internal@absl@@QEAA@XZ ??0InlineRep@Cord@absl@@QEAA@$$QEAV012@@Z ??0InlineRep@Cord@absl@@QEAA@AEBV012@@Z + ??0InlineRep@Cord@absl@@QEAA@W4DefaultInitType@InlineData@cord_internal@2@@Z ??0InlineRep@Cord@absl@@QEAA@XZ ??0InputValue@UnboundConversion@str_format_internal@absl@@QEAA@XZ ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z @@ -1048,6 +1112,8 @@ ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAPEAUTransition@cctz@time_internal@absl@@_K@Z ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAPEAUTransitionType@cctz@time_internal@absl@@_K@Z ??0_ConstructTransaction@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z @@ -1102,6 +1168,8 @@ ??1?$__policy_func@$$A6AXVstring_view@absl@@AEBVCord@2@@Z@__function@__1@std@@QEAA@XZ ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -1109,6 +1177,8 @@ ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??1?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??1?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??1?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??1?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??1?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ @@ -1129,6 +1199,8 @@ ??1?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -1138,6 +1210,9 @@ ??1CondVar@absl@@QEAA@XZ ??1Cord@absl@@QEAA@XZ ??1CordForest@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ + ??1CordzUpdateScope@cord_internal@absl@@QEAA@XZ ??1ErrnoSaver@base_internal@absl@@QEAA@XZ ??1FormatSinkImpl@str_format_internal@absl@@QEAA@XZ ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ @@ -1169,6 +1244,8 @@ ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -1180,10 +1257,9 @@ ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAAAEAV012@$$QEAV012@@Z ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAAAEAV012@$$QEAV012@@Z ??4Cord@absl@@QEAAAEAV01@$$QEAV01@@Z - ??4Cord@absl@@QEAAAEAV01@AEBV01@@Z ??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z + ??4CordzUpdateTracker@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z ??4InlineRep@Cord@absl@@QEAAAEAV012@$$QEAV012@@Z - ??4InlineRep@Cord@absl@@QEAAAEAV012@AEBV012@@Z ??4Payload@status_internal@absl@@QEAAAEAU012@$$QEAU012@@Z ??4Status@absl@@QEAAAEAV01@$$QEAV01@@Z ??4int128@absl@@QEAAAEAV01@H@Z @@ -1251,6 +1327,7 @@ ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@_K@Z ??ACord@absl@@QEBAD_K@Z ??Astring_view@absl@@QEBAAEBD_K@Z + ??B?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzHandle@cord_internal@absl@@XZ ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEBA_NXZ ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ @@ -1275,6 +1352,7 @@ ??CChunkIterator@Cord@absl@@QEBAPEBVstring_view@2@XZ ??D?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__1@std@@QEBAAEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ??D?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBAAEAPEAVCordzHandle@cord_internal@absl@@XZ ??D?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@QEBAAEAUTransition@cctz@time_internal@absl@@XZ ??D?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEBAAEAUTransitionType@cctz@time_internal@absl@@XZ ??D?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEBAAEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ @@ -1292,6 +1370,7 @@ ??Dabsl@@YA?AVuint128@0@V10@0@Z ??E?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAAEAV012@XZ ??E?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAAEAV012@XZ ??E?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEAAAEAV012@XZ ??E?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAAEAV012@XZ ??E?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAAEAV012@XZ @@ -1485,18 +1564,21 @@ ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NVstring_view@4@@Z - ?AppendArray@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXVstring_view@3@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?AppendNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_KVstring_view@4@@Z - ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?ApplySubstitutions@strings_internal@absl@@YAHVstring_view@2@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@56@@Z ?AsValueType@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAPEAPEAUCordRep@cord_internal@2@PEAPEAU342@@Z ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ?AssertHeld@CordzInfo@cord_internal@absl@@QEAAXXZ ?AssertHeld@Mutex@absl@@QEBAXXZ ?AssertNotHeld@Mutex@absl@@QEBAXXZ ?AssertReaderHeld@Mutex@absl@@QEBAXXZ @@ -1548,6 +1630,7 @@ ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPEBE0@Z ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPEBE0@Z + ?CommitTree@InlineRep@Cord@absl@@QEAAXPEBUCordRep@cord_internal@3@PEAU453@AEBVCordzUpdateScope@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?Compare@Cord@absl@@QEBAHVstring_view@2@@Z ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z @@ -1605,6 +1688,7 @@ ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z ?Delete@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z ?Demangle@debugging_internal@absl@@YA_NPEBDPEADH@Z ?Description@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ @@ -1615,6 +1699,9 @@ ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z ?DidAllocate@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA_NXZ ?DidAllocate@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA_NXZ ?DidAllocate@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA_NXZ @@ -1653,6 +1740,7 @@ ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPEAXQEBQEAXQEAHHH_NP6AXPEBD0@Z0@Z ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ ?EnableDebugLog@CondVar@absl@@QEAAXPEBD@Z ?EnableDebugLog@Mutex@absl@@QEAAXPEBD@Z @@ -1683,6 +1771,7 @@ ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?FillParentStack@CordzInfo@cord_internal@absl@@CAHPEBV123@PEAPEAX@Z ?Find@ByAnyChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z @@ -1754,6 +1843,7 @@ ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@__1@std@@@chrono@__1@std@@@Z ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__1@std@@@234@@chrono@__1@std@@@Z ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z + ?FromHost64@big_endian@absl@@YA_K_K@Z ?FromHost64@little_endian@absl@@YA_K_K@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@__1@std@@@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@__1@std@@@Z @@ -1789,8 +1879,6 @@ ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ ?GetAllocator@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@USubRange@absl@@@__1@std@@XZ ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K_K@Z ?GetCachedTID@base_internal@absl@@YAIXZ ?GetCapacity@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ @@ -1799,6 +1887,7 @@ ?GetCapacity@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z ?GetCond@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_CONDITION_VARIABLE@@PEAV234@@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ ?GetCurrentTimeNanos@absl@@YA_JXZ ?GetData@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAHXZ ?GetData@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAPEAUCordRep@cord_internal@3@XZ @@ -1831,6 +1920,8 @@ ?GetLeafData@CordRepRing@cord_internal@absl@@SAPEBDPEBUCordRep@23@@Z ?GetLock@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_SRWLOCK@@PEAV234@@Z ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetPayload@Status@absl@@QEBA?AV?$optional@VCord@absl@@@2@Vstring_view@2@@Z ?GetPayloads@Status@absl@@AEAAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@2@XZ ?GetPayloads@Status@absl@@AEBAPEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@2@XZ @@ -1858,6 +1949,7 @@ ?GetSizeAndIsAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ ?GetSizeAndIsAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ ?GetSkipCount@ExponentialBiased@base_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetStackFrames@absl@@YAHPEAPEAXPEAHHH@Z ?GetStackFramesWithContext@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z @@ -1882,6 +1974,7 @@ ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z ?HashSeed@container_internal@absl@@YA_KPEBC@Z + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?HideMask@base_internal@absl@@YA_KXZ ?Hours@absl@@YA?AVDuration@1@_J@Z @@ -1919,6 +2012,7 @@ ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z + ?IsEmpty@Queue@CordzHandle@cord_internal@absl@@QEBA_NXZ ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z @@ -1957,6 +2051,7 @@ ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z ?Lock@Mutex@absl@@QEAAXXZ ?Lock@SpinLock@base_internal@absl@@QEAAXXZ ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z @@ -1966,9 +2061,11 @@ ?LockWhenWithDeadline@Mutex@absl@@QEAA_NAEBVCondition@2@VTime@2@@Z ?LockWhenWithTimeout@Mutex@absl@@QEAA_NAEBVCondition@2@VDuration@2@@Z ?LogSeverityName@absl@@YAPEBDW4LogSeverity@1@@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXW4MethodIdentifier@123@_J@Z ?MakeConcat@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z + ?MakeFlatWithExtraCapacity@InlineRep@Cord@absl@@QEAAPEAUCordRepFlat@cord_internal@3@_K@Z ?MakeInt128@absl@@YA?AVint128@1@_J_K@Z ?MakeNormalizedDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z ?MakeNs@KernelTimeout@synchronization_internal@absl@@CA_JVTime@3@@Z @@ -2014,6 +2111,7 @@ ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z @@ -2034,6 +2132,8 @@ ?Now@UnscaledCycleClockWrapperForGetCurrentTime@time_internal@absl@@SA_JXZ ?Now@absl@@YA?AVTime@1@XZ ?NumCPUs@base_internal@absl@@YAHXZ + ?ODRCheck@CordzHandle@cord_internal@absl@@AEBAXXZ + ?ODRCheck@CordzInfo@cord_internal@absl@@AEBAXXZ ?OccursBefore@ViableSubstitution@strings_internal@absl@@QEBA_NAEBU123@@Z ?OppositeInfinity@time_internal@absl@@YA?AVDuration@2@V32@@Z ?OutOfRangeError@absl@@YA?AVStatus@1@Vstring_view@1@@Z @@ -2072,7 +2172,9 @@ ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?PrependNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?PrevTransition@Impl@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@2345@@Z ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -2101,6 +2203,7 @@ ?ReaderUnlock@Mutex@absl@@QEAAXXZ ?ReclaimThreadIdentity@synchronization_internal@absl@@YAXPEAX@Z ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RecordMetrics@CordzInfo@cord_internal@absl@@QEAAX_J@Z ?Ref@CordRep@cord_internal@absl@@SAPEAU123@PEAU123@@Z ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z ?Register@HashtablezSampler@container_internal@absl@@QEAAPEAUHashtablezInfo@23@XZ @@ -2149,6 +2252,8 @@ ?SetAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAUSubRange@3@_K@Z ?SetCapacityForTesting@CordRepRing@cord_internal@absl@@QEAAX_K@Z ?SetConversionChar@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4FormatConversionChar@3@PEAVFormatConversionSpecImpl@23@@Z + ?SetCordRep@CordzInfo@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QEBAXPEAUCordRep@23@@Z ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z ?SetDisposeCallback@HashtablezSampler@container_internal@absl@@QEAAP6AXAEBUHashtablezInfo@23@@ZP6AX0@Z@Z ?SetFlags@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXUFlags@23@PEAVFormatConversionSpecImpl@23@@Z @@ -2169,6 +2274,7 @@ ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPEAU?$atomic@H@__1@std@@@Z ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QEAAXXZ ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ + ?SetTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVCordzUpdateScope@53@@Z ?SetValue@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBH@Z ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z @@ -2278,6 +2384,7 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z + ?ToHost64@big_endian@absl@@YA_K_K@Z ?ToHost64@little_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__1@std@@@Z @@ -2310,6 +2417,9 @@ ?ToUnixNanos@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@cctz@time_internal@absl@@YA_JAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@@Z ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z ?Trunc@absl@@YA?AVDuration@1@V21@0@Z ?TryLock@Mutex@absl@@QEAA_NXZ @@ -2331,6 +2441,7 @@ ?UnimplementedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UniversalEpoch@absl@@YA?AVTime@1@XZ ?UnknownError@absl@@YA?AVStatus@1@Vstring_view@1@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ ?Unlock@Mutex@absl@@QEAAXXZ ?Unlock@SpinLock@base_internal@absl@@QEAAXXZ ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z @@ -2342,6 +2453,9 @@ ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ ?Unregister@HashtablezSampler@container_internal@absl@@QEAAXPEAUHashtablezInfo@23@@Z ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateCordzStatistics@InlineRep@Cord@absl@@QEAAXXZ + ?UpdateCordzStatisticsSlow@InlineRep@Cord@absl@@QEAAXXZ ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z ?UsingInlinedStorage@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CA_N_K@Z ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z @@ -2401,12 +2515,18 @@ ?__alloc@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__alloc@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ ?__alloc@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?__alloc@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ @@ -2418,18 +2538,24 @@ ?__alloc@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@XZ ?__annotate_contiguous_container@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z + ?__annotate_contiguous_container@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z + ?__annotate_contiguous_container@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_delete@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_new@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_new@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_new@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_new@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z @@ -2463,6 +2589,10 @@ ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z @@ -2472,6 +2602,8 @@ ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAPEAUCordRep@cord_internal@absl@@@Z + ?__destruct_at_end@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAUTransition@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAUViableSubstitution@strings_internal@absl@@@Z @@ -2487,6 +2619,10 @@ ?__end_cap@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__end_cap@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?__end_cap@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?__end_cap@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAUTransition@cctz@time_internal@absl@@XZ @@ -2497,6 +2633,10 @@ ?__end_cap@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAUViableSubstitution@strings_internal@absl@@XZ ?__end_cap@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?__end_cap@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?__end_cap@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAUTransition@cctz@time_internal@absl@@XZ @@ -2510,6 +2650,8 @@ ?__front_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2520,6 +2662,10 @@ ?__get@?$__compressed_pair_elem@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$0A@$0A@@__1@std@@QEBAAEBQEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@PEAPEAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAPEAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@$0A@$0A@@__1@std@@QEAAAEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ @@ -2561,6 +2707,10 @@ ?__get@?$__compressed_pair_elem@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEBAAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEBAAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEBAAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ @@ -2578,6 +2728,8 @@ ?__get_value@?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEBAAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__hash@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEBA_KXZ ?__invalidate_all_iterators@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ + ?__invalidate_all_iterators@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ + ?__invalidate_all_iterators@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ?__invalidate_all_iterators@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ?__invalidate_all_iterators@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ?__invalidate_all_iterators@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ @@ -2588,6 +2740,7 @@ ?__invalidate_iterators_past@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z ?__invalidate_iterators_past@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z ?__invalidate_iterators_past@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXPEAVFormatArgImpl@str_format_internal@absl@@@Z + ?__make_iter@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@@Z ?__make_iter@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?__make_iter@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@@Z ?__make_iter@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@@Z @@ -2596,6 +2749,8 @@ ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ ?__ptr@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAPEAU123@XZ ?__recommend@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__recommend@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__recommend@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__recommend@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z @@ -2603,6 +2758,8 @@ ?__recommend@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__rehash@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAAX_K@Z ?__swap_out_circular_buffer@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@PEAU4567@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@@Z @@ -2625,7 +2782,9 @@ ?allocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?allocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?allocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@_K@Z ?allocate@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAPEAPEBUCordRep@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@_K@Z ?allocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?allocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z ?allocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z @@ -2640,7 +2799,9 @@ ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEAUCordRep@cord_internal@2@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEBUCordRep@cord_internal@2@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@_K@Z @@ -2673,6 +2834,7 @@ ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@XZ + ?base@?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ ?base@?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ ?base@?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ ?base@?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ @@ -2693,6 +2855,7 @@ ?begin@?$initializer_list@Vstring_view@absl@@@std@@QEBAPEBVstring_view@absl@@XZ ?begin@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBAPEBW4FormatConversionCharSet@absl@@XZ ?begin@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ + ?begin@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ ?begin@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2703,17 +2866,23 @@ ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ + ?capacity@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ + ?capacity@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ @@ -2725,11 +2894,15 @@ ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ + ?clear@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ + ?clear@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ ?clear@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ ?clear@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ ?clear@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ @@ -2739,7 +2912,6 @@ ?clear@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@XZ ?clear_cordz_info@InlineData@cord_internal@absl@@QEAAXXZ - ?clear_cordz_info@InlineRep@Cord@absl@@QEAAXXZ ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z ?concat@CordRep@cord_internal@absl@@QEAAPEAUCordRepConcat@23@XZ @@ -2747,6 +2919,9 @@ ?consumed@CordRepRingReader@cord_internal@absl@@QEBA_KXZ ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ ?cord_ring_buffer_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A + ?cordz_info@InlineData@cord_internal@absl@@QEBAPEAVCordzInfo@23@XZ + ?cordz_info@InlineRep@Cord@absl@@QEBAPEAVCordzInfo@cord_internal@3@XZ + ?cordz_should_profile@cord_internal@absl@@YA_NXZ ?count@FILERawSink@str_format_internal@absl@@QEBA_KXZ ?data@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAPEAPEAUCordRep@cord_internal@2@XZ ?data@?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAAPEAHXZ @@ -2761,6 +2936,8 @@ ?data@?$Span@I@absl@@QEBAPEAIXZ ?data@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEAVFormatArgImpl@str_format_internal@2@XZ ?data@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAUCordRep@cord_internal@absl@@XZ + ?data@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEBVCordzHandle@cord_internal@absl@@XZ ?data@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?data@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAPEBUTransition@cctz@time_internal@absl@@XZ ?data@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAPEBUTransitionType@cctz@time_internal@absl@@XZ @@ -2781,7 +2958,9 @@ ?deallocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?deallocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?deallocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?deallocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z ?deallocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z @@ -2796,7 +2975,9 @@ ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@PEAPEAUCordRep@cord_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@2@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@2@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z @@ -2810,7 +2991,9 @@ ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ ?destroy@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ?destroy@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@@Z + ?destroy@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z ?destroy@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@@Z + ?destroy@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z ?destroy@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?destroy@?$allocator@UPayload@status_internal@absl@@@__1@std@@QEAAXPEAUPayload@status_internal@absl@@@Z ?destroy@?$allocator@USubRange@absl@@@__1@std@@QEAAXPEAUSubRange@absl@@@Z @@ -2850,6 +3033,7 @@ ?end@?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@QEBAPEBU?$pair@Vstring_view@absl@@V12@@__1@2@XZ ?end@?$initializer_list@Vstring_view@absl@@@std@@QEBAPEBVstring_view@absl@@XZ ?end@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ + ?end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ ?end@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2896,6 +3080,14 @@ ?first@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?first@?$__compressed_pair@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ @@ -2938,7 +3130,6 @@ ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z ?flat@CordRep@cord_internal@absl@@QEAAPEAUCordRepFlat@23@XZ ?flat@CordRep@cord_internal@absl@@QEBAPEBUCordRepFlat@23@XZ - ?force_tree@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@_K@Z ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@AEBVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z @@ -2970,6 +3161,7 @@ ?get@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ ?get@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@XZ ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAPEAVZoneInfoSource@cctz@time_internal@absl@@XZ + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@XZ ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEBAAEBV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@XZ ?get_deleter@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ @@ -2999,6 +3191,9 @@ ?is_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEBA_NXZ ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z ?is_length@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_profiled@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_profiled@InlineRep@Cord@absl@@QEBA_NXZ + ?is_snapshot@CordzHandle@cord_internal@absl@@QEBA_NXZ ?is_tree@InlineData@cord_internal@absl@@QEBA_NXZ ?is_tree@InlineRep@Cord@absl@@QEBA_NXZ ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ @@ -3007,6 +3202,8 @@ ?length@string_view@absl@@QEBA_KXZ ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z ?load@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEBAPEAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z ?load@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QEBA?AW4OnDeadlockCycle@absl@@W4memory_order@23@@Z ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QEBA?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAVtime_zone@123@@Z @@ -3022,7 +3219,9 @@ ?max_size@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEBA_KXZ + ?max_size@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEBA_KXZ + ?max_size@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEBA_KXZ @@ -3033,6 +3232,8 @@ ?max_size@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?max_size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?max_size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ @@ -3096,6 +3297,8 @@ ?push_back@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ?push_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEBVImpl@time_zone@cctz@time_internal@absl@@@Z ?push_back@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAUCordRep@cord_internal@absl@@@Z + ?push_back@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ?push_back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?push_back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBUTransition@cctz@time_internal@absl@@@Z ?push_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z @@ -3151,6 +3354,12 @@ ?second@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QEAAAEAV?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@XZ ?second@?$__compressed_pair@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ ?second@?$__compressed_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ @@ -3180,6 +3389,8 @@ ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ ?set_arg@BoundConversion@str_format_internal@absl@@QEAAXPEBVFormatArgImpl@23@@Z + ?set_cordz_info@InlineData@cord_internal@absl@@QEAAXPEAVCordzInfo@23@@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K_N@Z ?set_depth@CordRepConcat@cord_internal@absl@@QEAAXE@Z @@ -3214,6 +3425,8 @@ ?size@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QEBA_KXZ ?size@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBA_KXZ ?size@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ @@ -3227,6 +3440,8 @@ ?status@BadStatusOrAccess@absl@@QEBAAEBVStatus@2@XZ ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@_J@Z ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@_J@Z + ?store@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEAAXPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QEAAXPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QEAAXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QEAAXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA?AVstring_view@3@XZ
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def index a59b0b7..73aea3a 100644 --- a/third_party/abseil-cpp/symbols_arm64_rel.def +++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -109,6 +109,8 @@ ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z ??0Condition@absl@@QEAA@PEB_N@Z ??0Cord@absl@@QEAA@Vstring_view@1@@Z + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@@Z ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ ??0HashtablezSampler@container_internal@absl@@QEAA@XZ @@ -129,6 +131,8 @@ ??0uint128@absl@@QEAA@O@Z ??1BadStatusOrAccess@absl@@UEAA@XZ ??1CondVar@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ ??1HashtablezInfo@container_internal@absl@@QEAA@XZ ??1HashtablezSampler@container_internal@absl@@QEAA@XZ @@ -207,12 +211,14 @@ ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NVstring_view@4@@Z - ?AppendArray@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXVstring_view@3@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?ApplySubstitutions@strings_internal@absl@@YAHVstring_view@2@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@56@@Z ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z @@ -290,6 +296,7 @@ ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?Delete@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z ?Demangle@debugging_internal@absl@@YA_NPEBDPEADH@Z ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ @@ -299,6 +306,9 @@ ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@AEBVCord@2@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@AEBVCord@3@@Z @@ -338,6 +348,7 @@ ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?FillParentStack@CordzInfo@cord_internal@absl@@CAHPEBV123@PEAPEAX@Z ?Find@ByAnyChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z @@ -400,17 +411,19 @@ ?FromUDate@absl@@YA?AVTime@1@N@Z ?FromUniversal@absl@@YA?AVTime@1@_J@Z ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K_K@Z ?GetCachedTID@base_internal@absl@@YAIXZ ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ ?GetCurrentTimeNanos@absl@@YA_JXZ ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetPayload@Status@absl@@QEBA?AV?$optional@VCord@absl@@@2@Vstring_view@2@@Z ?GetPrependBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z ?GetProgramCounter@debugging_internal@absl@@YAPEAXPEAX@Z ?GetSkipCount@ExponentialBiased@base_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetStackFrames@absl@@YAHPEAPEAXPEAHHH@Z ?GetStackFramesWithContext@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z @@ -429,6 +442,7 @@ ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__1@std@@@Z ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?IDivDuration@time_internal@absl@@YA_J_NVDuration@2@1PEAV32@@Z ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z @@ -474,6 +488,7 @@ ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV2345@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z ?Lock@Mutex@absl@@QEAAXXZ ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z @@ -508,6 +523,7 @@ ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -549,7 +565,9 @@ ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -709,6 +727,9 @@ ?ToUnixMillis@absl@@YA_JVTime@1@@Z ?ToUnixNanos@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@@Z ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z ?Trunc@absl@@YA?AVDuration@1@V21@0@Z ?TryLock@Mutex@absl@@QEAA_NXZ @@ -719,6 +740,7 @@ ?UnavailableError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnimplementedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnknownError@absl@@YA?AVStatus@1@Vstring_view@1@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ ?Unlock@Mutex@absl@@QEAAXXZ ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VDuration@1@@Z @@ -727,6 +749,8 @@ ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ ?Unregister@HashtablezSampler@container_internal@absl@@QEAAXPEAUHashtablezInfo@23@@Z ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateCordzStatisticsSlow@InlineRep@Cord@absl@@QEAAXXZ ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z @@ -785,6 +809,7 @@ ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@AEBVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAVtime_zone@123@@Z ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ ?lookup@time_zone@cctz@time_internal@absl@@QEBA?AUabsolute_lookup@1234@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@@Z @@ -828,6 +853,8 @@ ?safe_strtou128_base@numbers_internal@absl@@YA_NVstring_view@2@PEAVuint128@2@H@Z ?safe_strtou32_base@numbers_internal@absl@@YA_NVstring_view@2@PEAIH@Z ?safe_strtou64_base@numbers_internal@absl@@YA_NVstring_view@2@PEA_KH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?set_tree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index 87055e7..fd92091 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -9,12 +9,16 @@ ??$?0$$T@?$Storage@PEAUSubRange@absl@@$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEA$$T@Z ??$?0$$TAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$?0$$TAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??$?0$$TAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z ??$?0$$TAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@?$__compressed_pair@PEAUViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$TAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z + ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z + ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAUTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAUTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z @@ -22,6 +26,8 @@ ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PEAVFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@$$QEA$$T$$QEAU__default_init_tag@12@@Z ??$?0$$TX@?$__compressed_pair_elem@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAPEAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z + ??$?0$$TX@?$__compressed_pair_elem@PEAPEAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z + ??$?0$$TX@?$__compressed_pair_elem@PEAPEBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAUTransition@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PEAUTransitionType@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAA@$$QEA$$T@Z @@ -67,9 +73,11 @@ ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z ??$?0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$?0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z ??$?0AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$T$00@?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z + ??$?0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??$?0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAA@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$T$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEA$$T@Z ??$?0AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QEA$$T@Z @@ -185,8 +193,10 @@ ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVBufferRawSink@12@@Z ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVFILERawSink@12@@Z ??$?4V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAAEAV01@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ??$?8PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV012@@__1@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z ??$?8PEAUTransitionType@cctz@time_internal@absl@@PEAU0123@@__1@std@@YA_NAEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$?8PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEBU0123@@__1@std@@YA_NAEBV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z + ??$?9PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@YA_NAEBV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z ??$?9PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@YA_NAEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$?9PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YA_NAEBV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z ??$?9VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@YA_NAEBV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@01@$$T@Z @@ -355,6 +365,7 @@ ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPEAVFILERawSink@01@Vstring_view@1@@Z ??$InvokeReleaser@UStringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@X@cord_internal@absl@@YAXURank0@01@$$QEAUStringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@1@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@Vstring_view@1@@Z ??$LowLevelCallOnce@A6AXXZ$$V@base_internal@absl@@YAXPEAVonce_flag@1@A6AXXZ@Z + ??$MakeConstSpan@$SQEAX@absl@@YA?AV?$Span@QEAX@0@PEBQEAX_K@Z ??$MakeSpan@$SI$0BAA@@absl@@YA?AV?$Span@I@0@AEAY0BAA@I@Z ??$MakeSpan@$SI$0BIA@@absl@@YA?AV?$Span@I@0@AEAY0BIA@I@Z ??$MakeSpan@$SI$0CAA@@absl@@YA?AV?$Span@I@0@AEAY0CAA@I@Z @@ -444,6 +455,8 @@ ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__1@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAUCordRep@cord_internal@absl@@X@__1@std@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@PEAPEAUCordRep@cord_internal@absl@@1AEAPEAPEAU345@@Z + ??$__construct_backward_with_exception_guarantees@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@PEAVCordzHandle@cord_internal@absl@@X@__1@std@@YAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@PEAPEAVCordzHandle@cord_internal@absl@@1AEAPEAPEAV345@@Z + ??$__construct_backward_with_exception_guarantees@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@PEBVCordzHandle@cord_internal@absl@@X@__1@std@@YAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@PEAPEBVCordzHandle@cord_internal@absl@@1AEAPEAPEBV345@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@__1@std@@YAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@1AEAPEAU3456@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@UTransition@cctz@time_internal@absl@@X@__1@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@1AEAPEAU3456@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@UTransitionType@cctz@time_internal@absl@@X@__1@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@1AEAPEAU3456@@Z @@ -455,6 +468,8 @@ ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ??$__construct_one_at_end@AEAVstring_view@absl@@AEBV12@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAVstring_view@absl@@AEBV34@AEA_K@Z ??$__construct_one_at_end@AEBQEAUCordRep@cord_internal@absl@@@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAUCordRep@cord_internal@absl@@@Z + ??$__construct_one_at_end@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ??$__construct_one_at_end@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ??$__construct_one_at_end@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z ??$__construct_one_at_end@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$__construct_range_forward@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAUCordRep@cord_internal@absl@@PEAU456@PEAU456@PEAU456@X@__1@std@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@PEBQEAUCordRep@cord_internal@absl@@1AEAPEAPEAU345@@Z @@ -464,8 +479,12 @@ ??$__cxx_atomic_exchange@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@YAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZPEAU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@01@P6AX0@ZW4memory_order@01@@Z ??$__cxx_atomic_load@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@YAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZPEBU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@01@W4memory_order@01@@Z ??$__cxx_atomic_load@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@YAPEAUHashtablezInfo@container_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzHandle@cord_internal@absl@@@__1@std@@YAPEAVCordzHandle@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PEAVCordzInfo@cord_internal@absl@@@__1@std@@YAPEAVCordzInfo@cord_internal@absl@@PEBU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@W4memory_order@01@@Z ??$__cxx_atomic_load@W4OnDeadlockCycle@absl@@@__1@std@@YA?AW4OnDeadlockCycle@absl@@PEBU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4memory_order@01@@Z ??$__cxx_atomic_load@W4State@PerThreadSynch@base_internal@absl@@@__1@std@@YA?AW4State@PerThreadSynch@base_internal@absl@@PEBU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzHandle@cord_internal@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzHandle@cord_internal@absl@@@01@PEAVCordzHandle@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PEAVCordzInfo@cord_internal@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@01@PEAVCordzInfo@cord_internal@absl@@W4memory_order@01@@Z ??$__cxx_atomic_store@W4OnDeadlockCycle@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4OnDeadlockCycle@absl@@W4memory_order@01@@Z ??$__cxx_atomic_store@W4State@PerThreadSynch@base_internal@absl@@@__1@std@@YAXPEAU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4State@PerThreadSynch@base_internal@absl@@W4memory_order@01@@Z ??$__distance@PEBUPayload@status_internal@absl@@@__1@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z @@ -484,6 +503,8 @@ ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@__1@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@__1@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z ??$__push_back_slow_path@AEBQEAUCordRep@cord_internal@absl@@@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAUCordRep@cord_internal@absl@@@Z + ??$__push_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ??$__push_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z ??$__push_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z @@ -493,6 +514,8 @@ ??$__to_address@$$CBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z ??$__to_address@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z ??$__to_address@PEAUCordRep@cord_internal@absl@@@__1@std@@YAPEAPEAUCordRep@cord_internal@absl@@PEAPEAU234@@Z + ??$__to_address@PEAVCordzHandle@cord_internal@absl@@@__1@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z + ??$__to_address@PEBVCordzHandle@cord_internal@absl@@@__1@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z ??$__to_address@UTransition@cctz@time_internal@absl@@@__1@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z ??$__to_address@UTransitionType@cctz@time_internal@absl@@@__1@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z @@ -537,10 +560,14 @@ ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@Z ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU345@@Z ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@$$QEAPEAU561@@Z + ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z + ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@AEBQEBU345@@Z ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@AEBQEBU561@@Z ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@$$QEAPEBU345@@Z ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@$$QEAPEBU561@@Z + ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z + ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV34567@@Z ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@X@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV45678@@Z ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z @@ -581,7 +608,9 @@ ??$destroy@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ??$destroy@PEAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@@Z ??$destroy@PEAUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@@Z + ??$destroy@PEAVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@@Z ??$destroy@PEBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@@Z + ??$destroy@PEBVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@@Z ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@XX@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$destroy@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@@Z @@ -634,7 +663,9 @@ ??$forward@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@YAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z + ??$forward@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@YAAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAV123@@Z + ??$forward@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@YAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AEAV201@@Z ??$forward@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@YAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAV123@@Z ??$forward@AEAV?$allocator@USubRange@absl@@@__1@std@@@absl@@YAAEAV?$allocator@USubRange@absl@@@__1@std@@AEAV123@@Z @@ -645,7 +676,9 @@ ??$forward@AEA_K@absl@@YAAEA_KAEA_K@Z ??$forward@AEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV23456@@Z ??$forward@AEBQEAUCordRep@cord_internal@absl@@@__1@std@@YAAEBQEAUCordRep@cord_internal@absl@@AEBQEAU234@@Z + ??$forward@AEBQEAVCordzHandle@cord_internal@absl@@@__1@std@@YAAEBQEAVCordzHandle@cord_internal@absl@@AEBQEAV234@@Z ??$forward@AEBQEBUCordRep@cord_internal@absl@@@__1@std@@YAAEBQEBUCordRep@cord_internal@absl@@AEBQEBU234@@Z + ??$forward@AEBQEBVCordzHandle@cord_internal@absl@@@__1@std@@YAAEBQEBVCordzHandle@cord_internal@absl@@AEBQEBV234@@Z ??$forward@AEBQEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAAEBQEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV23456@@Z ??$forward@AEBUHashtablezInfo@container_internal@absl@@@__1@std@@YAAEBUHashtablezInfo@container_internal@absl@@AEBU234@@Z ??$forward@AEBUPayload@status_internal@absl@@@__1@std@@YAAEBUPayload@status_internal@absl@@AEBU234@@Z @@ -728,7 +761,9 @@ ??$max_size@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$max_size@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@12@@Z ??$max_size@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z ??$max_size@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEBUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??$max_size@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$max_size@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@X@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z ??$max_size@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SA_KAEBV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z @@ -742,6 +777,8 @@ ??$min@VDuration@absl@@U?$__less@VDuration@absl@@V12@@__1@std@@@__1@std@@YAAEBVDuration@absl@@AEBV23@0U?$__less@VDuration@absl@@V12@@01@@Z ??$move@AEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEAPEBV23456@@Z ??$move@AEAPEAPEAUCordRep@cord_internal@absl@@@__1@std@@YA$$QEAPEAPEAUCordRep@cord_internal@absl@@AEAPEAPEAU234@@Z + ??$move@AEAPEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@YA$$QEAPEAPEAVCordzHandle@cord_internal@absl@@AEAPEAPEAV234@@Z + ??$move@AEAPEAPEBVCordzHandle@cord_internal@absl@@@__1@std@@YA$$QEAPEAPEBVCordzHandle@cord_internal@absl@@AEAPEAPEBV234@@Z ??$move@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV23456@@Z ??$move@AEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YA$$QEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAPEAU2345@@Z ??$move@AEAPEAUCordRep@cord_internal@absl@@@__1@std@@YA$$QEAPEAUCordRep@cord_internal@absl@@AEAPEAU234@@Z @@ -771,6 +808,8 @@ ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z ??$swap@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAXAEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z ??$swap@PEAPEAUCordRep@cord_internal@absl@@@__1@std@@YAXAEAPEAPEAUCordRep@cord_internal@absl@@0@Z + ??$swap@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@YAXAEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z + ??$swap@PEAPEBVCordzHandle@cord_internal@absl@@@__1@std@@YAXAEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z ??$swap@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YAXAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z ??$swap@PEAUTransition@cctz@time_internal@absl@@@__1@std@@YAXAEAPEAUTransition@cctz@time_internal@absl@@0@Z ??$swap@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@YAXAEAPEAUTransitionType@cctz@time_internal@absl@@0@Z @@ -816,6 +855,7 @@ ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@XZ ??0?$Span@D@absl@@QEAA@PEAD_K@Z ??0?$Span@I@absl@@QEAA@PEAI_K@Z + ??0?$Span@QEAX@absl@@QEAA@PEBQEAX_K@Z ??0?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEAVFormatArgImpl@str_format_internal@1@_K@Z ??0?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ ??0?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ @@ -828,6 +868,7 @@ ??0?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z ??0?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEAA@XZ ??0?$__compressed_pair_elem@U?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$0A@$0A@@__1@std@@QEAA@U__value_init_tag@12@@Z ??0?$__compressed_pair_elem@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z @@ -841,6 +882,8 @@ ??0?$__compressed_pair_elem@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z + ??0?$__compressed_pair_elem@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z + ??0?$__compressed_pair_elem@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$00$00@__1@std@@QEAA@U__value_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z @@ -850,8 +893,10 @@ ??0?$__compressed_pair_elem@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QEAA@U__default_init_tag@12@@Z ??0?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$__cxx_atomic_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@ZU?$__cxx_atomic_base_impl@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__cxx_atomic_impl@PEAUHashtablezInfo@container_internal@absl@@U?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PEAVCordzInfo@cord_internal@absl@@U?$__cxx_atomic_base_impl@PEAVCordzInfo@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$__deque_base@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__1@std@@AEAA@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV34567@@Z ??0?$__hash_const_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAA@AEBV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z @@ -868,6 +913,8 @@ ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??0?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@@Z ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z @@ -875,18 +922,23 @@ ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@QEAA@XZ ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@QEAA@XZ ??0?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??0?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??0?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??0?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??0?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@AEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z ??0?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@AEAA@PEAUTransition@cctz@time_internal@absl@@@Z ??0?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@AEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z ??0?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@AEAA@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??0?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAA@XZ ??0?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAA@XZ + ??0?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAA@XZ + ??0?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAA@XZ ??0?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAA@XZ ??0?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAA@XZ @@ -898,6 +950,7 @@ ??0?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEAA@XZ ??0?$atomic@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@QEAA@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$atomic@PEAUHashtablezInfo@container_internal@absl@@@__1@std@@QEAA@PEAUHashtablezInfo@container_internal@absl@@@Z + ??0?$atomic@PEAVCordzInfo@cord_internal@absl@@@__1@std@@QEAA@PEAVCordzInfo@cord_internal@absl@@@Z ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEAA@_J00000@Z ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AEAA@Ufields@1234@@Z @@ -945,6 +998,8 @@ ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAA@$$QEAV012@@Z ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA@XZ ??0?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@V?$initializer_list@PEAUCordRep@cord_internal@absl@@@2@@Z + ??0?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??0?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -987,6 +1042,13 @@ ??0CordRepRing@cord_internal@absl@@AEAA@I@Z ??0CordRepRingReader@cord_internal@absl@@QEAA@XZ ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzHandle@cord_internal@absl@@QEAA@XZ + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzStatistics@cord_internal@absl@@QEAA@XZ + ??0CordzUpdateScope@cord_internal@absl@@QEAA@PEAVCordzInfo@12@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzUpdateTracker@cord_internal@absl@@QEAA@XZ + ??0Counter@CordzUpdateTracker@cord_internal@absl@@QEAA@XZ ??0Duration@absl@@AEAA@_JI@Z ??0Duration@absl@@QEAA@XZ ??0ErrnoSaver@base_internal@absl@@QEAA@XZ @@ -999,9 +1061,11 @@ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ ??0HashtablezSampler@container_internal@absl@@QEAA@XZ ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ??0InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@012@@Z ??0InlineData@cord_internal@absl@@QEAA@XZ ??0InlineRep@Cord@absl@@QEAA@$$QEAV012@@Z ??0InlineRep@Cord@absl@@QEAA@AEBV012@@Z + ??0InlineRep@Cord@absl@@QEAA@W4DefaultInitType@InlineData@cord_internal@2@@Z ??0InlineRep@Cord@absl@@QEAA@XZ ??0InputValue@UnboundConversion@str_format_internal@absl@@QEAA@XZ ??0KernelTimeout@synchronization_internal@absl@@QEAA@VTime@2@@Z @@ -1050,6 +1114,8 @@ ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAPEAUTransition@cctz@time_internal@absl@@_K@Z ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@PEAPEAUTransitionType@cctz@time_internal@absl@@_K@Z ??0_ConstructTransaction@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z + ??0_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z ??0_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@AEAV123@_K@Z @@ -1104,6 +1170,8 @@ ??1?$__policy_func@$$A6AXVstring_view@absl@@AEBVCord@2@@Z@__function@__1@std@@QEAA@XZ ??1?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -1111,6 +1179,8 @@ ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??1?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ + ??1?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??1?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??1?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ ??1?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAA@XZ @@ -1131,6 +1201,8 @@ ??1?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -1140,6 +1212,9 @@ ??1CondVar@absl@@QEAA@XZ ??1Cord@absl@@QEAA@XZ ??1CordForest@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ + ??1CordzUpdateScope@cord_internal@absl@@QEAA@XZ ??1ErrnoSaver@base_internal@absl@@QEAA@XZ ??1FormatSinkImpl@str_format_internal@absl@@QEAA@XZ ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ @@ -1171,6 +1246,8 @@ ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1_ConstructTransaction@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ @@ -1182,10 +1259,9 @@ ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAAAEAV012@$$QEAV012@@Z ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAAAEAV012@$$QEAV012@@Z ??4Cord@absl@@QEAAAEAV01@$$QEAV01@@Z - ??4Cord@absl@@QEAAAEAV01@AEBV01@@Z ??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z + ??4CordzUpdateTracker@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z ??4InlineRep@Cord@absl@@QEAAAEAV012@$$QEAV012@@Z - ??4InlineRep@Cord@absl@@QEAAAEAV012@AEBV012@@Z ??4Payload@status_internal@absl@@QEAAAEAU012@$$QEAU012@@Z ??4Status@absl@@QEAAAEAV01@$$QEAV01@@Z ??4int128@absl@@QEAAAEAV01@H@Z @@ -1253,6 +1329,7 @@ ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@_K@Z ??ACord@absl@@QEBAD_K@Z ??Astring_view@absl@@QEBAAEBD_K@Z + ??B?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzHandle@cord_internal@absl@@XZ ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEBA_NXZ ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ @@ -1277,6 +1354,7 @@ ??CChunkIterator@Cord@absl@@QEBAPEBVstring_view@2@XZ ??D?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@__1@std@@QEBAAEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ??D?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEBAAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBAAEAPEAVCordzHandle@cord_internal@absl@@XZ ??D?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@QEBAAEAUTransition@cctz@time_internal@absl@@XZ ??D?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEBAAEAUTransitionType@cctz@time_internal@absl@@XZ ??D?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEBAAEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ @@ -1294,6 +1372,7 @@ ??Dabsl@@YA?AVuint128@0@V10@0@Z ??E?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAAEAV012@XZ ??E?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAAAEAV012@XZ + ??E?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAAEAV012@XZ ??E?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEAAAEAV012@XZ ??E?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAAEAV012@XZ ??E?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAAEAV012@XZ @@ -1486,18 +1565,21 @@ ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NVstring_view@4@@Z - ?AppendArray@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXVstring_view@3@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?AppendNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_KVstring_view@4@@Z - ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?ApplySubstitutions@strings_internal@absl@@YAHVstring_view@2@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@56@@Z ?AsValueType@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAPEAPEAUCordRep@cord_internal@2@PEAPEAU342@@Z ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ?AssertHeld@CordzInfo@cord_internal@absl@@QEAAXXZ ?AssertHeld@Mutex@absl@@QEBAXXZ ?AssertNotHeld@Mutex@absl@@QEBAXXZ ?AssertReaderHeld@Mutex@absl@@QEBAXXZ @@ -1549,6 +1631,7 @@ ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPEBE0U?$integral_constant@H$07@__1@std@@@Z ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPEBE0@Z ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPEBE0@Z + ?CommitTree@InlineRep@Cord@absl@@QEAAXPEBUCordRep@cord_internal@3@PEAU453@AEBVCordzUpdateScope@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?Compare@Cord@absl@@QEBAHVstring_view@2@@Z ?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z ?CompareSlowPath@Cord@absl@@AEBAHAEBV12@_K1@Z @@ -1606,6 +1689,7 @@ ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z ?Delete@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z ?Demangle@debugging_internal@absl@@YA_NPEBDPEADH@Z ?Description@Impl@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ @@ -1616,6 +1700,9 @@ ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z ?DidAllocate@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA_NXZ ?DidAllocate@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA_NXZ ?DidAllocate@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA_NXZ @@ -1654,6 +1741,7 @@ ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPEAXQEBQEAXQEAHHH_NP6AXPEBD0@Z0@Z ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ ?EnableDebugLog@CondVar@absl@@QEAAXPEBD@Z ?EnableDebugLog@Mutex@absl@@QEAAXPEBD@Z @@ -1684,6 +1772,7 @@ ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?FillParentStack@CordzInfo@cord_internal@absl@@CAHPEBV123@PEAPEAX@Z ?Find@ByAnyChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z @@ -1755,6 +1844,7 @@ ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@__1@std@@@chrono@__1@std@@@Z ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__1@std@@@234@@chrono@__1@std@@@Z ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z + ?FromHost64@big_endian@absl@@YA_K_K@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@__1@std@@@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@__1@std@@@Z ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z @@ -1789,8 +1879,6 @@ ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ ?GetAllocator@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@USubRange@absl@@@__1@std@@XZ ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K_K@Z ?GetCachedTID@base_internal@absl@@YAIXZ ?GetCapacity@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ @@ -1799,6 +1887,7 @@ ?GetCapacity@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z ?GetCond@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_CONDITION_VARIABLE@@PEAV234@@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ ?GetCurrentTimeNanos@absl@@YA_JXZ ?GetData@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAHXZ ?GetData@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAPEAPEAUCordRep@cord_internal@3@XZ @@ -1831,6 +1920,8 @@ ?GetLeafData@CordRepRing@cord_internal@absl@@SAPEBDPEBUCordRep@23@@Z ?GetLock@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_SRWLOCK@@PEAV234@@Z ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetPayload@Status@absl@@QEBA?AV?$optional@VCord@absl@@@2@Vstring_view@2@@Z ?GetPayloads@Status@absl@@AEAAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@2@XZ ?GetPayloads@Status@absl@@AEBAPEBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@2@XZ @@ -1858,6 +1949,7 @@ ?GetSizeAndIsAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ ?GetSizeAndIsAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBAAEB_KXZ ?GetSkipCount@ExponentialBiased@base_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetStackFrames@absl@@YAHPEAPEAXPEAHHH@Z ?GetStackFramesWithContext@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z @@ -1882,6 +1974,7 @@ ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z ?HashSeed@container_internal@absl@@YA_KPEBC@Z + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?HideMask@base_internal@absl@@YA_KXZ ?Hours@absl@@YA?AVDuration@1@_J@Z @@ -1919,6 +2012,7 @@ ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z + ?IsEmpty@Queue@CordzHandle@cord_internal@absl@@QEBA_NXZ ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z @@ -1956,6 +2050,7 @@ ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z ?Lock@Mutex@absl@@QEAAXXZ ?Lock@SpinLock@base_internal@absl@@QEAAXXZ ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z @@ -1965,9 +2060,11 @@ ?LockWhenWithDeadline@Mutex@absl@@QEAA_NAEBVCondition@2@VTime@2@@Z ?LockWhenWithTimeout@Mutex@absl@@QEAA_NAEBVCondition@2@VDuration@2@@Z ?LogSeverityName@absl@@YAPEBDW4LogSeverity@1@@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXW4MethodIdentifier@123@_J@Z ?MakeConcat@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z + ?MakeFlatWithExtraCapacity@InlineRep@Cord@absl@@QEAAPEAUCordRepFlat@cord_internal@3@_K@Z ?MakeInt128@absl@@YA?AVint128@1@_J_K@Z ?MakeNormalizedDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z ?MakeNs@KernelTimeout@synchronization_internal@absl@@CA_JVTime@3@@Z @@ -2013,6 +2110,7 @@ ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z @@ -2033,6 +2131,8 @@ ?Now@UnscaledCycleClockWrapperForGetCurrentTime@time_internal@absl@@SA_JXZ ?Now@absl@@YA?AVTime@1@XZ ?NumCPUs@base_internal@absl@@YAHXZ + ?ODRCheck@CordzHandle@cord_internal@absl@@AEBAXXZ + ?ODRCheck@CordzInfo@cord_internal@absl@@AEBAXXZ ?OccursBefore@ViableSubstitution@strings_internal@absl@@QEBA_NAEBU123@@Z ?OppositeInfinity@time_internal@absl@@YA?AVDuration@2@V32@@Z ?OutOfRangeError@absl@@YA?AVStatus@1@Vstring_view@1@@Z @@ -2071,7 +2171,9 @@ ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?PrependNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?PrevTransition@Impl@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@2345@@Z ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -2100,6 +2202,7 @@ ?ReaderUnlock@Mutex@absl@@QEAAXXZ ?ReclaimThreadIdentity@synchronization_internal@absl@@YAXPEAX@Z ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z + ?RecordMetrics@CordzInfo@cord_internal@absl@@QEAAX_J@Z ?Ref@CordRep@cord_internal@absl@@SAPEAU123@PEAU123@@Z ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z ?Register@HashtablezSampler@container_internal@absl@@QEAAPEAUHashtablezInfo@23@XZ @@ -2148,6 +2251,8 @@ ?SetAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAUSubRange@3@_K@Z ?SetCapacityForTesting@CordRepRing@cord_internal@absl@@QEAAX_K@Z ?SetConversionChar@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4FormatConversionChar@3@PEAVFormatConversionSpecImpl@23@@Z + ?SetCordRep@CordzInfo@cord_internal@absl@@QEAAXPEAUCordRep@23@@Z + ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QEBAXPEAUCordRep@23@@Z ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z ?SetDisposeCallback@HashtablezSampler@container_internal@absl@@QEAAP6AXAEBUHashtablezInfo@23@@ZP6AX0@Z@Z ?SetFlags@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXUFlags@23@PEAVFormatConversionSpecImpl@23@@Z @@ -2168,6 +2273,7 @@ ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPEAU?$atomic@H@__1@std@@@Z ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QEAAXXZ ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ + ?SetTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVCordzUpdateScope@53@@Z ?SetValue@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@AEBH@Z ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z @@ -2276,6 +2382,7 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z + ?ToHost64@big_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@__1@std@@@Z @@ -2307,6 +2414,9 @@ ?ToUnixNanos@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@cctz@time_internal@absl@@YA_JAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@@Z ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z ?Trunc@absl@@YA?AVDuration@1@V21@0@Z ?TryLock@Mutex@absl@@QEAA_NXZ @@ -2327,6 +2437,7 @@ ?UnimplementedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UniversalEpoch@absl@@YA?AVTime@1@XZ ?UnknownError@absl@@YA?AVStatus@1@Vstring_view@1@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ ?Unlock@Mutex@absl@@QEAAXXZ ?Unlock@SpinLock@base_internal@absl@@QEAAXXZ ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z @@ -2338,6 +2449,9 @@ ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ ?Unregister@HashtablezSampler@container_internal@absl@@QEAAXPEAUHashtablezInfo@23@@Z ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateCordzStatistics@InlineRep@Cord@absl@@QEAAXXZ + ?UpdateCordzStatisticsSlow@InlineRep@Cord@absl@@QEAAXXZ ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z ?UsingInlinedStorage@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CA_N_K@Z ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z @@ -2397,12 +2511,18 @@ ?__alloc@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__alloc@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ ?__alloc@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?__alloc@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ @@ -2414,18 +2534,24 @@ ?__alloc@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEAAAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEBAAEBV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@XZ ?__annotate_contiguous_container@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z + ?__annotate_contiguous_container@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z + ?__annotate_contiguous_container@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_contiguous_container@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXPEBX000@Z ?__annotate_delete@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_new@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z + ?__annotate_new@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_new@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_new@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_new@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z @@ -2459,6 +2585,10 @@ ?__destruct_at_end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z @@ -2468,6 +2598,8 @@ ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAPEAUCordRep@cord_internal@absl@@@Z + ?__destruct_at_end@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAUTransition@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAAXPEAUViableSubstitution@strings_internal@absl@@@Z @@ -2483,6 +2615,10 @@ ?__end_cap@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__end_cap@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?__end_cap@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?__end_cap@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAUTransition@cctz@time_internal@absl@@XZ @@ -2493,6 +2629,10 @@ ?__end_cap@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAUViableSubstitution@strings_internal@absl@@XZ ?__end_cap@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?__end_cap@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?__end_cap@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEBAAEBQEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAAEAPEAUTransition@cctz@time_internal@absl@@XZ @@ -2506,6 +2646,8 @@ ?__front_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QEAAAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2516,6 +2658,10 @@ ?__get@?$__compressed_pair_elem@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$0A@$0A@@__1@std@@QEBAAEBQEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@PEAPEAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAPEAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PEAPEBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QEBAAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@$0A@$0A@@__1@std@@QEAAAEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ @@ -2557,6 +2703,10 @@ ?__get@?$__compressed_pair_elem@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEBAAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEBAAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QEBAAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ @@ -2574,6 +2724,8 @@ ?__get_value@?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEBAAEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__hash@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEBA_KXZ ?__invalidate_all_iterators@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ + ?__invalidate_all_iterators@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ + ?__invalidate_all_iterators@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ?__invalidate_all_iterators@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ?__invalidate_all_iterators@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ?__invalidate_all_iterators@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ @@ -2584,6 +2736,7 @@ ?__invalidate_iterators_past@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@@Z ?__invalidate_iterators_past@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEAAXPEAUViableSubstitution@strings_internal@absl@@@Z ?__invalidate_iterators_past@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXPEAVFormatArgImpl@str_format_internal@absl@@@Z + ?__make_iter@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@@Z ?__make_iter@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?__make_iter@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@@Z ?__make_iter@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@@Z @@ -2592,6 +2745,8 @@ ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ ?__ptr@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAPEAU123@XZ ?__recommend@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z + ?__recommend@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__recommend@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__recommend@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__recommend@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z @@ -2599,6 +2754,8 @@ ?__recommend@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEBA_K_K@Z ?__rehash@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAAX_K@Z ?__swap_out_circular_buffer@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@PEAU4567@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@@Z @@ -2622,7 +2779,9 @@ ?allocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?allocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?allocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAPEAPEAVCordzHandle@cord_internal@absl@@_K@Z ?allocate@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAPEAPEBUCordRep@cord_internal@absl@@_K@Z + ?allocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAPEAPEBVCordzHandle@cord_internal@absl@@_K@Z ?allocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?allocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z ?allocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z @@ -2637,7 +2796,9 @@ ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEAUCordRep@cord_internal@2@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEBUCordRep@cord_internal@2@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@Z + ?allocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?allocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@_K@Z @@ -2670,6 +2831,7 @@ ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@XZ + ?base@?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ ?base@?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ ?base@?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ ?base@?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ @@ -2690,6 +2852,7 @@ ?begin@?$initializer_list@Vstring_view@absl@@@std@@QEBAPEBVstring_view@absl@@XZ ?begin@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBAPEBW4FormatConversionCharSet@absl@@XZ ?begin@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ + ?begin@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ ?begin@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2700,17 +2863,23 @@ ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ + ?capacity@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ + ?capacity@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IEBA_KXZ ?capacity@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?capacity@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ @@ -2722,11 +2891,15 @@ ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ + ?clear@?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ + ?clear@?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@?$__vector_base@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ + ?clear@?$__vector_base@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ + ?clear@?$__vector_base@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ ?clear@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ ?clear@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ ?clear@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IEAAXXZ @@ -2736,7 +2909,6 @@ ?clear@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?clear@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@XZ ?clear_cordz_info@InlineData@cord_internal@absl@@QEAAXXZ - ?clear_cordz_info@InlineRep@Cord@absl@@QEAAXXZ ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z ?concat@CordRep@cord_internal@absl@@QEAAPEAUCordRepConcat@23@XZ @@ -2744,6 +2916,9 @@ ?consumed@CordRepRingReader@cord_internal@absl@@QEBA_KXZ ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ ?cord_ring_buffer_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A + ?cordz_info@InlineData@cord_internal@absl@@QEBAPEAVCordzInfo@23@XZ + ?cordz_info@InlineRep@Cord@absl@@QEBAPEAVCordzInfo@cord_internal@3@XZ + ?cordz_should_profile@cord_internal@absl@@YA_NXZ ?count@FILERawSink@str_format_internal@absl@@QEBA_KXZ ?data@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAPEAPEAUCordRep@cord_internal@2@XZ ?data@?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAAPEAHXZ @@ -2758,6 +2933,8 @@ ?data@?$Span@I@absl@@QEBAPEAIXZ ?data@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEAVFormatArgImpl@str_format_internal@2@XZ ?data@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAUCordRep@cord_internal@absl@@XZ + ?data@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEBVCordzHandle@cord_internal@absl@@XZ ?data@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBAPEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?data@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAPEBUTransition@cctz@time_internal@absl@@XZ ?data@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAPEBUTransitionType@cctz@time_internal@absl@@XZ @@ -2778,7 +2955,9 @@ ?deallocate@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?deallocate@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?deallocate@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@_K@Z + ?deallocate@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?deallocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEAAXPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z ?deallocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z @@ -2793,7 +2972,9 @@ ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@PEAPEAUCordRep@cord_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@2@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@2@_K@Z + ?deallocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z @@ -2807,7 +2988,9 @@ ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ ?destroy@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ?destroy@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@@Z + ?destroy@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z ?destroy@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@@Z + ?destroy@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@@Z ?destroy@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?destroy@?$allocator@UPayload@status_internal@absl@@@__1@std@@QEAAXPEAUPayload@status_internal@absl@@@Z ?destroy@?$allocator@USubRange@absl@@@__1@std@@QEAAXPEAUSubRange@absl@@@Z @@ -2847,6 +3030,7 @@ ?end@?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@QEBAPEBU?$pair@Vstring_view@absl@@V12@@__1@2@XZ ?end@?$initializer_list@Vstring_view@absl@@@std@@QEBAPEBVstring_view@absl@@XZ ?end@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ + ?end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@23@XZ ?end@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA?AV?$__wrap_iter@PEBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2893,6 +3077,14 @@ ?first@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAUCordRep@cord_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAUCordRep@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVCordzHandle@cord_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QEAAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?first@?$__compressed_pair@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QEBAAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ ?first@?$__compressed_pair@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ @@ -2935,7 +3127,6 @@ ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@AEBV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z ?flat@CordRep@cord_internal@absl@@QEAAPEAUCordRepFlat@23@XZ ?flat@CordRep@cord_internal@absl@@QEBAPEBUCordRepFlat@23@XZ - ?force_tree@InlineRep@Cord@absl@@QEAAPEAUCordRep@cord_internal@3@_K@Z ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@AEBVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z @@ -2967,6 +3158,7 @@ ?get@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEBAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ ?get@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEBAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@XZ ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBAPEAVZoneInfoSource@cctz@time_internal@absl@@XZ + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@XZ ?get_deleter@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEBAAEBV?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@XZ ?get_deleter@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ @@ -2996,6 +3188,9 @@ ?is_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEBA_NXZ ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z ?is_length@ConvTag@str_format_internal@absl@@QEBA_NXZ + ?is_profiled@InlineData@cord_internal@absl@@QEBA_NXZ + ?is_profiled@InlineRep@Cord@absl@@QEBA_NXZ + ?is_snapshot@CordzHandle@cord_internal@absl@@QEBA_NXZ ?is_tree@InlineData@cord_internal@absl@@QEBA_NXZ ?is_tree@InlineRep@Cord@absl@@QEBA_NXZ ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ @@ -3004,6 +3199,8 @@ ?length@string_view@absl@@QEBA_KXZ ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z ?load@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEBAPEAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z ?load@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QEBA?AW4OnDeadlockCycle@absl@@W4memory_order@23@@Z ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QEBA?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAVtime_zone@123@@Z @@ -3019,7 +3216,9 @@ ?max_size@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEBA_KXZ + ?max_size@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEBA_KXZ + ?max_size@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEBA_KXZ @@ -3030,6 +3229,8 @@ ?max_size@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEBA_KXZ ?max_size@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?max_size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?max_size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?max_size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ @@ -3093,6 +3294,8 @@ ?push_back@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z ?push_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEBVImpl@time_zone@cctz@time_internal@absl@@@Z ?push_back@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAUCordRep@cord_internal@absl@@@Z + ?push_back@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ?push_back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?push_back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBUTransition@cctz@time_internal@absl@@@Z ?push_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z @@ -3148,6 +3351,12 @@ ?second@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PEAPEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PEAPEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAAEBV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QEAAAEAV?$__allocator_destructor@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@XZ ?second@?$__compressed_pair@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@XZ ?second@?$__compressed_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ @@ -3177,6 +3386,8 @@ ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ ?set_arg@BoundConversion@str_format_internal@absl@@QEAAXPEBVFormatArgImpl@23@@Z + ?set_cordz_info@InlineData@cord_internal@absl@@QEAAXPEAVCordzInfo@23@@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K_N@Z ?set_depth@CordRepConcat@cord_internal@absl@@QEAAXE@Z @@ -3211,6 +3422,8 @@ ?size@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QEBA_KXZ ?size@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QEBA_KXZ ?size@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?size@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ + ?size@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ ?size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ @@ -3224,6 +3437,8 @@ ?status@BadStatusOrAccess@absl@@QEBAAEBVStatus@2@XZ ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@_J@Z ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@_J@Z + ?store@?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEAAXPEAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PEAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QEAAXPEAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QEAAXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QEAAXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA?AVstring_view@3@XZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def index bc536c8..a36e6a12 100644 --- a/third_party/abseil-cpp/symbols_x64_rel.def +++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -111,6 +111,8 @@ ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z ??0Condition@absl@@QEAA@PEB_N@Z ??0Cord@absl@@QEAA@Vstring_view@1@@Z + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@@Z ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ ??0HashtablezSampler@container_internal@absl@@QEAA@XZ @@ -131,6 +133,8 @@ ??0uint128@absl@@QEAA@O@Z ??1BadStatusOrAccess@absl@@UEAA@XZ ??1CondVar@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ ??1HashtablezInfo@container_internal@absl@@QEAA@XZ ??1HashtablezSampler@container_internal@absl@@QEAA@XZ @@ -209,12 +213,14 @@ ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NVstring_view@4@@Z - ?AppendArray@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXVstring_view@3@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?ApplySubstitutions@strings_internal@absl@@YAHVstring_view@2@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@56@@Z ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z @@ -292,6 +298,7 @@ ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?Delete@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z ?Demangle@debugging_internal@absl@@YA_NPEBDPEADH@Z ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ @@ -301,6 +308,9 @@ ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@AEBVCord@2@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@AEBVCord@3@@Z @@ -340,6 +350,7 @@ ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?FillParentStack@CordzInfo@cord_internal@absl@@CAHPEBV123@PEAPEAX@Z ?Find@ByAnyChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z @@ -401,17 +412,19 @@ ?FromUDate@absl@@YA?AVTime@1@N@Z ?FromUniversal@absl@@YA?AVTime@1@_J@Z ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K_K@Z ?GetCachedTID@base_internal@absl@@YAIXZ ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ ?GetCurrentTimeNanos@absl@@YA_JXZ ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetPayload@Status@absl@@QEBA?AV?$optional@VCord@absl@@@2@Vstring_view@2@@Z ?GetPrependBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z ?GetProgramCounter@debugging_internal@absl@@YAPEAXPEAX@Z ?GetSkipCount@ExponentialBiased@base_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetStackFrames@absl@@YAHPEAPEAXPEAHHH@Z ?GetStackFramesWithContext@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z @@ -430,6 +443,7 @@ ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__1@std@@@Z ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?IDivDuration@time_internal@absl@@YA_J_NVDuration@2@1PEAV32@@Z ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z @@ -474,6 +488,7 @@ ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV2345@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z ?Lock@Mutex@absl@@QEAAXXZ ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z @@ -508,6 +523,7 @@ ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -549,7 +565,9 @@ ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -709,6 +727,9 @@ ?ToUnixMillis@absl@@YA_JVTime@1@@Z ?ToUnixNanos@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@@Z ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z ?Trunc@absl@@YA?AVDuration@1@V21@0@Z ?TryLock@Mutex@absl@@QEAA_NXZ @@ -719,6 +740,7 @@ ?UnavailableError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnimplementedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnknownError@absl@@YA?AVStatus@1@Vstring_view@1@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ ?Unlock@Mutex@absl@@QEAAXXZ ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VDuration@1@@Z @@ -727,6 +749,8 @@ ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ ?Unregister@HashtablezSampler@container_internal@absl@@QEAAXPEAUHashtablezInfo@23@@Z ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateCordzStatisticsSlow@InlineRep@Cord@absl@@QEAAXXZ ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z @@ -784,6 +808,7 @@ ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@AEBVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAVtime_zone@123@@Z ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ @@ -828,6 +853,8 @@ ?safe_strtou128_base@numbers_internal@absl@@YA_NVstring_view@2@PEAVuint128@2@H@Z ?safe_strtou32_base@numbers_internal@absl@@YA_NVstring_view@2@PEAIH@Z ?safe_strtou64_base@numbers_internal@absl@@YA_NVstring_view@2@PEA_KH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?set_tree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def index 81522959..e6f752d3 100644 --- a/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -78,6 +78,8 @@ ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__push_back_slow_path@AEBQEAUCordRep@cord_internal@absl@@@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAUCordRep@cord_internal@absl@@@Z + ??$__push_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z + ??$__push_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ??$__upper_bound@AEAUByCivilTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@__1@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByCivilTime@2345@@Z ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z ??$assign@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z @@ -113,6 +115,8 @@ ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z ??0Condition@absl@@QEAA@PEB_N@Z ??0Cord@absl@@QEAA@Vstring_view@1@@Z + ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z + ??0CordzInfo@cord_internal@absl@@AEAA@PEAUCordRep@12@PEBV012@W4MethodIdentifier@CordzUpdateTracker@12@@Z ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ ??0HashtablezInfo@container_internal@absl@@QEAA@XZ ??0HashtablezSampler@container_internal@absl@@QEAA@XZ @@ -132,12 +136,15 @@ ??0uint128@absl@@QEAA@N@Z ??0uint128@absl@@QEAA@O@Z ??1?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ + ??1?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ ??1BadStatusOrAccess@absl@@UEAA@XZ ??1CondVar@absl@@QEAA@XZ + ??1CordzHandle@cord_internal@absl@@MEAA@XZ + ??1CordzInfo@cord_internal@absl@@EEAA@XZ ??1GraphCycles@synchronization_internal@absl@@QEAA@XZ ??1HashtablezInfo@container_internal@absl@@QEAA@XZ ??1HashtablezSampler@container_internal@absl@@QEAA@XZ @@ -219,12 +226,14 @@ ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAX_KD@Z ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NVstring_view@4@@Z - ?AppendArray@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?AppendArray@InlineRep@Cord@absl@@QEAAXVstring_view@3@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?ApplySubstitutions@strings_internal@absl@@YAHVstring_view@2@PEAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@56@@Z ?AsciiStrToLower@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z ?AsciiStrToUpper@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z @@ -301,6 +310,7 @@ ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?Delete@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPEAV123@@Z ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPEAUArena@123@@Z ?Demangle@debugging_internal@absl@@YA_NPEBDPEADH@Z ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ @@ -310,6 +320,9 @@ ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ ?DestroyCordSlow@Cord@absl@@AEAAXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@AEBVCord@2@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@AEBVCord@3@@Z @@ -349,6 +362,7 @@ ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_JPEAD@Z ?FastIntToBuffer@numbers_internal@absl@@YAPEAD_KPEAD@Z ?Fer@Mutex@absl@@AEAAXPEAUPerThreadSynch@base_internal@2@@Z + ?FillParentStack@CordzInfo@cord_internal@absl@@CAHPEBV123@PEAPEAX@Z ?Find@ByAnyChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z @@ -411,17 +425,19 @@ ?FromUDate@absl@@YA?AVTime@1@N@Z ?FromUniversal@absl@@YA?AVTime@1@_J@Z ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QEAAXPEAPEADPEA_K_K@Z ?GetCachedTID@base_internal@absl@@YAIXZ ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ ?GetCurrentTimeNanos@absl@@YA_JXZ ?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z ?GetId@GraphCycles@synchronization_internal@absl@@QEAA?AUGraphId@23@PEAX@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PEBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetPayload@Status@absl@@QEBA?AV?$optional@VCord@absl@@@2@Vstring_view@2@@Z ?GetPrependBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z ?GetProgramCounter@debugging_internal@absl@@YAPEAXPEAX@Z ?GetSkipCount@ExponentialBiased@base_internal@absl@@QEAA_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QEBA?AV?$Span@QEAX@3@XZ ?GetStackFrames@absl@@YAHPEAPEAXPEAHHH@Z ?GetStackFramesWithContext@absl@@YAHPEAPEAXPEAHHHPEBX1@Z ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QEAAHUGraphId@23@PEAPEAPEAX@Z @@ -440,6 +456,7 @@ ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__1@std@@@Z ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z + ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?IDivDuration@time_internal@absl@@YA_J_NVDuration@2@1PEAV32@@Z ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z @@ -485,6 +502,7 @@ ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV2345@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransition@234@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@AEBA?AUabsolute_lookup@time_zone@234@_JAEBUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QEAAXW4MethodIdentifier@CordzUpdateTracker@23@@Z ?Lock@Mutex@absl@@QEAAXXZ ?LockSlow@Mutex@absl@@AEAAXPEBUMuHowS@2@PEBVCondition@2@H@Z ?LockSlowLoop@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@H@Z @@ -519,6 +537,7 @@ ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ + ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -560,7 +579,9 @@ ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z - ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z + ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?PrevTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z @@ -720,6 +741,9 @@ ?ToUnixMillis@absl@@YA_JVTime@1@@Z ?ToUnixNanos@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AEAAXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAEAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@@Z ?Trans@Mutex@absl@@AEAAXPEBUMuHowS@2@@Z ?Trunc@absl@@YA?AVDuration@1@V21@0@Z ?TryLock@Mutex@absl@@QEAA_NXZ @@ -730,6 +754,7 @@ ?UnavailableError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnimplementedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnknownError@absl@@YA?AVStatus@1@Vstring_view@1@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QEAAXXZ ?Unlock@Mutex@absl@@QEAAXXZ ?UnlockSlow@Mutex@absl@@AEAAXPEAUSynchWaitParams@2@@Z ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VDuration@1@@Z @@ -738,6 +763,8 @@ ?UnrefTree@InlineRep@Cord@absl@@AEAAXXZ ?Unregister@HashtablezSampler@container_internal@absl@@QEAAXPEAUHashtablezInfo@23@@Z ?UnsampleSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@@Z + ?Untrack@CordzInfo@cord_internal@absl@@QEAAXXZ + ?UpdateCordzStatisticsSlow@InlineRep@Cord@absl@@QEAAXXZ ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QEAAXUGraphId@23@HP6AHPEAPEAXH@Z@Z ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z @@ -764,12 +791,15 @@ ?WyhashImpl@HashState@hash_internal@absl@@CA_KPEBE_K@Z ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ ?__annotate_delete@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ + ?__annotate_delete@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_delete@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ ?__annotate_increase@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z + ?__annotate_increase@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_increase@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_increase@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z ?__annotate_increase@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEBAX_K@Z @@ -795,6 +825,8 @@ ?__move_range@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXPEAUTransitionType@cctz@time_internal@absl@@00@Z ?__rehash@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAAX_K@Z ?__swap_out_circular_buffer@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@PEAU4567@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@@Z @@ -824,6 +856,7 @@ ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBV567@AEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@AEBV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@AEBVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PEBD0AEANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ ?get_weekday@detail@cctz@time_internal@absl@@YA?AW4weekday@1234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@1234@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAVtime_zone@123@@Z ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ @@ -870,6 +903,8 @@ ?safe_strtou128_base@numbers_internal@absl@@YA_NVstring_view@2@PEAVuint128@2@H@Z ?safe_strtou32_base@numbers_internal@absl@@YA_NVstring_view@2@PEAIH@Z ?safe_strtou64_base@numbers_internal@absl@@YA_NVstring_view@2@PEA_KH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?set_tree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@@Z ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ ?size@?$BigUnsigned@$03@strings_internal@absl@@QEBAHXZ
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index d64d29b..75334b4 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -9,12 +9,16 @@ ??$?0$$T@?$Storage@PAUSubRange@absl@@$00$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QA$$T@Z ??$?0$$TAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$?0$$TAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@@Z + ??$?0$$TAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z + ??$?0$$TAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z ??$?0$$TAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@?$__compressed_pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??$?0$$TAAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PAUTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??$?0$$TAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@?$__compressed_pair@PAUTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z ??$?0$$TAAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@?$__compressed_pair@PAUViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$TAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z + ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z + ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAUTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAUTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z @@ -22,6 +26,8 @@ ??$?0$$TU__default_init_tag@__1@std@@@?$__compressed_pair@PAVFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@$$QA$$T$$QAU__default_init_tag@12@@Z ??$?0$$TX@?$__compressed_pair_elem@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QAE@$$QA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PAPAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QAE@$$QA$$T@Z + ??$?0$$TX@?$__compressed_pair_elem@PAPAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QAE@$$QA$$T@Z + ??$?0$$TX@?$__compressed_pair_elem@PAPBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QAE@$$QA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$0A@$0A@@__1@std@@QAE@$$QA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PAUTransition@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QAE@$$QA$$T@Z ??$?0$$TX@?$__compressed_pair_elem@PAUTransitionType@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QAE@$$QA$$T@Z @@ -70,9 +76,11 @@ ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$$QA$$T@Z ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z ??$?0AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAE@AAV?$allocator@PAUCordRep@cord_internal@absl@@@12@@Z + ??$?0AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAE@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z ??$?0AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$$T$00@?$CompressedTuple@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@absl@@@container_internal@absl@@QAE@AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$$QA$$T@Z ??$?0AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@absl@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$$QA$$T@Z ??$?0AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@?$Storage@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@Z + ??$?0AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAE@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z ??$?0AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@X@?$__compressed_pair_elem@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAE@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??$?0AAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$T$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@absl@@@container_internal@absl@@QAE@AAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QA$$T@Z ??$?0AAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$T@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@absl@@@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@AAV?$allocator@UPayload@status_internal@absl@@@__1@std@@$$QA$$T@Z @@ -185,8 +193,10 @@ ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAVBufferRawSink@12@@Z ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAVFILERawSink@12@@Z ??$?4V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAEAAV01@$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ??$?8PAPAVCordzHandle@cord_internal@absl@@PAPAV012@@__1@std@@YA_NABV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@01@0@Z ??$?8PAUTransitionType@cctz@time_internal@absl@@PAU0123@@__1@std@@YA_NABV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$?8PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@PBU0123@@__1@std@@YA_NABV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z + ??$?9PAPAVCordzHandle@cord_internal@absl@@@__1@std@@YA_NABV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@01@0@Z ??$?9PAUTransitionType@cctz@time_internal@absl@@@__1@std@@YA_NABV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z ??$?9PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YA_NABV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z ??$?9VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@YA_NABV?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@01@$$T@Z @@ -355,6 +365,7 @@ ??$InvokeFlush@VFILERawSink@str_format_internal@absl@@@str_format_internal@absl@@YAXPAVFILERawSink@01@Vstring_view@1@@Z ??$InvokeReleaser@UStringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@X@cord_internal@absl@@YAXURank0@01@$$QAUStringReleaser@?M@???$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@1@QAE@$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@Vstring_view@1@@Z ??$LowLevelCallOnce@A6AXXZ$$V@base_internal@absl@@YAXPAVonce_flag@1@A6AXXZ@Z + ??$MakeConstSpan@$SQAX@absl@@YA?AV?$Span@QAX@0@PBQAXI@Z ??$MakeSpan@$SI$0BAA@@absl@@YA?AV?$Span@I@0@AAY0BAA@I@Z ??$MakeSpan@$SI$0BIA@@absl@@YA?AV?$Span@I@0@AAY0BIA@I@Z ??$MakeSpan@$SI$0CAA@@absl@@YA?AV?$Span@I@0@AAY0CAA@I@Z @@ -442,6 +453,8 @@ ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__1@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__1@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAUCordRep@cord_internal@absl@@X@__1@std@@YAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@01@PAPAUCordRep@cord_internal@absl@@1AAPAPAU345@@Z + ??$__construct_backward_with_exception_guarantees@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@PAVCordzHandle@cord_internal@absl@@X@__1@std@@YAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@PAPAVCordzHandle@cord_internal@absl@@1AAPAPAV345@@Z + ??$__construct_backward_with_exception_guarantees@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@PBVCordzHandle@cord_internal@absl@@X@__1@std@@YAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@PAPBVCordzHandle@cord_internal@absl@@1AAPAPBV345@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@__1@std@@YAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@1AAPAU3456@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@UTransition@cctz@time_internal@absl@@X@__1@std@@YAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PAUTransition@cctz@time_internal@absl@@1AAPAU3456@@Z ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@UTransitionType@cctz@time_internal@absl@@X@__1@std@@YAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PAUTransitionType@cctz@time_internal@absl@@1AAPAU3456@@Z @@ -453,6 +466,8 @@ ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXXZ ??$__construct_one_at_end@AAVstring_view@absl@@ABV12@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AAEXAAVstring_view@absl@@ABV34@AAI@Z ??$__construct_one_at_end@ABQAUCordRep@cord_internal@absl@@@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AAEXABQAUCordRep@cord_internal@absl@@@Z + ??$__construct_one_at_end@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXABQAVCordzHandle@cord_internal@absl@@@Z + ??$__construct_one_at_end@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXABQBVCordzHandle@cord_internal@absl@@@Z ??$__construct_one_at_end@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXABUTransition@cctz@time_internal@absl@@@Z ??$__construct_one_at_end@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AAEX$$QAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$__construct_range_forward@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAUCordRep@cord_internal@absl@@PAU456@PAU456@PAU456@X@__1@std@@YAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@01@PBQAUCordRep@cord_internal@absl@@1AAPAPAU345@@Z @@ -462,8 +477,12 @@ ??$__cxx_atomic_exchange@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__1@std@@YAP6AXABUHashtablezInfo@container_internal@absl@@@ZPAU?$__cxx_atomic_base_impl@P6AXABUHashtablezInfo@container_internal@absl@@@Z@01@P6AX0@ZW4memory_order@01@@Z ??$__cxx_atomic_load@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__1@std@@YAP6AXABUHashtablezInfo@container_internal@absl@@@ZPBU?$__cxx_atomic_base_impl@P6AXABUHashtablezInfo@container_internal@absl@@@Z@01@W4memory_order@01@@Z ??$__cxx_atomic_load@PAUHashtablezInfo@container_internal@absl@@@__1@std@@YAPAUHashtablezInfo@container_internal@absl@@PBU?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAVCordzHandle@cord_internal@absl@@@__1@std@@YAPAVCordzHandle@cord_internal@absl@@PBU?$__cxx_atomic_base_impl@PAVCordzHandle@cord_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_load@PAVCordzInfo@cord_internal@absl@@@__1@std@@YAPAVCordzInfo@cord_internal@absl@@PBU?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@01@W4memory_order@01@@Z ??$__cxx_atomic_load@W4OnDeadlockCycle@absl@@@__1@std@@YA?AW4OnDeadlockCycle@absl@@PBU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4memory_order@01@@Z ??$__cxx_atomic_load@W4State@PerThreadSynch@base_internal@absl@@@__1@std@@YA?AW4State@PerThreadSynch@base_internal@absl@@PBU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4memory_order@01@@Z + ??$__cxx_atomic_store@PAVCordzHandle@cord_internal@absl@@@__1@std@@YAXPAU?$__cxx_atomic_base_impl@PAVCordzHandle@cord_internal@absl@@@01@PAVCordzHandle@cord_internal@absl@@W4memory_order@01@@Z + ??$__cxx_atomic_store@PAVCordzInfo@cord_internal@absl@@@__1@std@@YAXPAU?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@01@PAVCordzInfo@cord_internal@absl@@W4memory_order@01@@Z ??$__cxx_atomic_store@W4OnDeadlockCycle@absl@@@__1@std@@YAXPAU?$__cxx_atomic_base_impl@W4OnDeadlockCycle@absl@@@01@W4OnDeadlockCycle@absl@@W4memory_order@01@@Z ??$__cxx_atomic_store@W4State@PerThreadSynch@base_internal@absl@@@__1@std@@YAXPAU?$__cxx_atomic_base_impl@W4State@PerThreadSynch@base_internal@absl@@@01@W4State@PerThreadSynch@base_internal@absl@@W4memory_order@01@@Z ??$__distance@PBUPayload@status_internal@absl@@@__1@std@@YAHPBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z @@ -482,6 +501,8 @@ ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@__1@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@__1@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z ??$__push_back_slow_path@ABQAUCordRep@cord_internal@absl@@@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AAEXABQAUCordRep@cord_internal@absl@@@Z + ??$__push_back_slow_path@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXABQAVCordzHandle@cord_internal@absl@@@Z + ??$__push_back_slow_path@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXABQBVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXABUTransition@cctz@time_internal@absl@@@Z ??$__push_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AAEX$$QAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$__rewrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0@Z @@ -491,6 +512,8 @@ ??$__to_address@$$CBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@@Z ??$__to_address@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@@Z ??$__to_address@PAUCordRep@cord_internal@absl@@@__1@std@@YAPAPAUCordRep@cord_internal@absl@@PAPAU234@@Z + ??$__to_address@PAVCordzHandle@cord_internal@absl@@@__1@std@@YAPAPAVCordzHandle@cord_internal@absl@@PAPAV234@@Z + ??$__to_address@PBVCordzHandle@cord_internal@absl@@@__1@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@@Z ??$__to_address@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU2345@@Z ??$__to_address@UTransition@cctz@time_internal@absl@@@__1@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z ??$__to_address@UTransitionType@cctz@time_internal@absl@@@__1@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z @@ -533,10 +556,14 @@ ??$construct@PAUCordRep@cord_internal@absl@@ABQAU123@X@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@ABQAU456@@Z ??$construct@PAUCordRep@cord_internal@absl@@PAU123@@?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPAUCordRep@cord_internal@absl@@$$QAPAU345@@Z ??$construct@PAUCordRep@cord_internal@absl@@PAU123@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@$$QAPAU561@@Z + ??$construct@PAVCordzHandle@cord_internal@absl@@ABQAV123@@?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@ABQAV345@@Z + ??$construct@PAVCordzHandle@cord_internal@absl@@ABQAV123@X@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@PAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z ??$construct@PBUCordRep@cord_internal@absl@@ABQBU123@@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPBUCordRep@cord_internal@absl@@ABQBU345@@Z ??$construct@PBUCordRep@cord_internal@absl@@ABQBU123@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@ABQBU561@@Z ??$construct@PBUCordRep@cord_internal@absl@@PBU123@@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPBUCordRep@cord_internal@absl@@$$QAPBU345@@Z ??$construct@PBUCordRep@cord_internal@absl@@PBU123@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@$$QAPBU561@@Z + ??$construct@PBVCordzHandle@cord_internal@absl@@ABQBV123@@?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@ABQBV345@@Z + ??$construct@PBVCordzHandle@cord_internal@absl@@ABQBV123@X@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@PAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z ??$construct@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@@?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEXPAPBVImpl@time_zone@cctz@time_internal@absl@@ABQBV34567@@Z ??$construct@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@X@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPBVImpl@time_zone@cctz@time_internal@absl@@ABQBV45678@@Z ??$construct@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QAEXPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QAV?$tuple@$$V@12@@Z @@ -577,7 +604,9 @@ ??$destroy@PAPBVImpl@time_zone@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z ??$destroy@PAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@@Z ??$destroy@PAUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@@Z + ??$destroy@PAVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@PAPAVCordzHandle@cord_internal@absl@@@Z ??$destroy@PBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@@Z + ??$destroy@PBVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@PAPBVCordzHandle@cord_internal@absl@@@Z ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@XX@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@SAXAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??$destroy@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@@Z @@ -630,7 +659,9 @@ ??$forward@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@01@AAV201@@Z ??$forward@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAAAV?$allocator@PAUCordRep@cord_internal@absl@@@01@AAV201@@Z ??$forward@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@YAAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@AAV123@@Z + ??$forward@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@YAAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@AAV201@@Z ??$forward@AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@YAAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@AAV123@@Z + ??$forward@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@YAAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@AAV201@@Z ??$forward@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@YAAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AAV201@@Z ??$forward@AAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@YAAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AAV123@@Z ??$forward@AAV?$allocator@USubRange@absl@@@__1@std@@@absl@@YAAAV?$allocator@USubRange@absl@@@__1@std@@AAV123@@Z @@ -640,7 +671,9 @@ ??$forward@AAVstring_view@absl@@@__1@std@@YAAAVstring_view@absl@@AAV23@@Z ??$forward@ABQAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAABQAPBVImpl@time_zone@cctz@time_internal@absl@@ABQAPBV23456@@Z ??$forward@ABQAUCordRep@cord_internal@absl@@@__1@std@@YAABQAUCordRep@cord_internal@absl@@ABQAU234@@Z + ??$forward@ABQAVCordzHandle@cord_internal@absl@@@__1@std@@YAABQAVCordzHandle@cord_internal@absl@@ABQAV234@@Z ??$forward@ABQBUCordRep@cord_internal@absl@@@__1@std@@YAABQBUCordRep@cord_internal@absl@@ABQBU234@@Z + ??$forward@ABQBVCordzHandle@cord_internal@absl@@@__1@std@@YAABQBVCordzHandle@cord_internal@absl@@ABQBV234@@Z ??$forward@ABQBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAABQBVImpl@time_zone@cctz@time_internal@absl@@ABQBV23456@@Z ??$forward@ABUHashtablezInfo@container_internal@absl@@@__1@std@@YAABUHashtablezInfo@container_internal@absl@@ABU234@@Z ??$forward@ABUPayload@status_internal@absl@@@__1@std@@YAABUPayload@status_internal@absl@@ABU234@@Z @@ -723,7 +756,9 @@ ??$max_size@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAIABV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$max_size@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@X@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAIABV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@12@@Z ??$max_size@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAIABV?$allocator@PAUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAIABV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z ??$max_size@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAIABV?$allocator@PBUCordRep@cord_internal@absl@@@12@@Z + ??$max_size@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAIABV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z ??$max_size@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAIABV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??$max_size@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@X@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@SAIABV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@@Z ??$max_size@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAIABV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z @@ -737,6 +772,8 @@ ??$min@VDuration@absl@@U?$__less@VDuration@absl@@V12@@__1@std@@@__1@std@@YAABVDuration@absl@@ABV23@0U?$__less@VDuration@absl@@V12@@01@@Z ??$move@AAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPAPBV23456@@Z ??$move@AAPAPAUCordRep@cord_internal@absl@@@__1@std@@YA$$QAPAPAUCordRep@cord_internal@absl@@AAPAPAU234@@Z + ??$move@AAPAPAVCordzHandle@cord_internal@absl@@@__1@std@@YA$$QAPAPAVCordzHandle@cord_internal@absl@@AAPAPAV234@@Z + ??$move@AAPAPBVCordzHandle@cord_internal@absl@@@__1@std@@YA$$QAPAPBVCordzHandle@cord_internal@absl@@AAPAPBV234@@Z ??$move@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YA$$QAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPBV23456@@Z ??$move@AAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YA$$QAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AAPAU2345@@Z ??$move@AAPAUCordRep@cord_internal@absl@@@__1@std@@YA$$QAPAUCordRep@cord_internal@absl@@AAPAU234@@Z @@ -766,6 +803,8 @@ ??$reset@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@@Z ??$swap@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAXAAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z ??$swap@PAPAUCordRep@cord_internal@absl@@@__1@std@@YAXAAPAPAUCordRep@cord_internal@absl@@0@Z + ??$swap@PAPAVCordzHandle@cord_internal@absl@@@__1@std@@YAXAAPAPAVCordzHandle@cord_internal@absl@@0@Z + ??$swap@PAPBVCordzHandle@cord_internal@absl@@@__1@std@@YAXAAPAPBVCordzHandle@cord_internal@absl@@0@Z ??$swap@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@YAXAAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z ??$swap@PAUTransition@cctz@time_internal@absl@@@__1@std@@YAXAAPAUTransition@cctz@time_internal@absl@@0@Z ??$swap@PAUTransitionType@cctz@time_internal@absl@@@__1@std@@YAXAAPAUTransitionType@cctz@time_internal@absl@@0@Z @@ -811,6 +850,7 @@ ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@XZ ??0?$Span@D@absl@@QAE@PADI@Z ??0?$Span@I@absl@@QAE@PAII@Z + ??0?$Span@QAX@absl@@QAE@PBQAXI@Z ??0?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QAE@PAVFormatArgImpl@str_format_internal@1@I@Z ??0?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAE@XZ ??0?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@XZ @@ -823,6 +863,7 @@ ??0?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@AAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z ??0?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__atomic_base@PAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z ??0?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QAE@XZ ??0?$__compressed_pair_elem@U?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@$0A@$0A@@__1@std@@QAE@U__value_init_tag@12@@Z ??0?$__compressed_pair_elem@U?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z @@ -836,6 +877,8 @@ ??0?$__compressed_pair_elem@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z + ??0?$__compressed_pair_elem@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z + ??0?$__compressed_pair_elem@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@$00$00@__1@std@@QAE@U__value_init_tag@12@@Z ??0?$__compressed_pair_elem@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z @@ -845,8 +888,10 @@ ??0?$__compressed_pair_elem@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QAE@U__default_init_tag@12@@Z ??0?$__cxx_atomic_base_impl@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__1@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@__1@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@__1@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z ??0?$__cxx_atomic_impl@P6AXABUHashtablezInfo@container_internal@absl@@@ZU?$__cxx_atomic_base_impl@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__1@std@@@__1@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$__cxx_atomic_impl@PAUHashtablezInfo@container_internal@absl@@U?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@__1@std@@@__1@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$__cxx_atomic_impl@PAVCordzInfo@cord_internal@absl@@U?$__cxx_atomic_base_impl@PAVCordzInfo@cord_internal@absl@@@__1@std@@@__1@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z ??0?$__deque_base@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??0?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@__1@std@@AAE@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV34567@@Z ??0?$__hash_const_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QAE@ABV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@@Z @@ -863,6 +908,8 @@ ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z ??0?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??0?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@@Z + ??0?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@@Z ??0?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@@Z ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z @@ -870,18 +917,23 @@ ??0?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@QAE@XZ ??0?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@__1@std@@QAE@XZ ??0?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IAE@XZ + ??0?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAE@XZ + ??0?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??0?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??0?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??0?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??0?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??0?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IAE@XZ + ??0?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__1@std@@AAE@PAPAVCordzHandle@cord_internal@absl@@@Z ??0?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@__1@std@@AAE@PAUTransition@cctz@time_internal@absl@@@Z ??0?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__1@std@@AAE@PAUTransitionType@cctz@time_internal@absl@@@Z ??0?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@AAE@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ??0?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAE@XZ ??0?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@QAE@XZ ??0?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAE@XZ + ??0?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@QAE@XZ ??0?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAE@XZ + ??0?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@QAE@XZ ??0?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAE@XZ ??0?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QAE@XZ ??0?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QAE@XZ @@ -893,6 +945,7 @@ ??0?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QAE@XZ ??0?$atomic@P6AXABUHashtablezInfo@container_internal@absl@@@Z@__1@std@@QAE@P6AXABUHashtablezInfo@container_internal@absl@@@Z@Z ??0?$atomic@PAUHashtablezInfo@container_internal@absl@@@__1@std@@QAE@PAUHashtablezInfo@container_internal@absl@@@Z + ??0?$atomic@PAVCordzInfo@cord_internal@absl@@@__1@std@@QAE@PAVCordzInfo@cord_internal@absl@@@Z ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z ??0?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QAE@_J00000@Z ??0?$civil_time@Uday_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@AAE@Ufields@1234@@Z @@ -940,6 +993,8 @@ ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QAE@$$QAV012@@Z ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE@XZ ??0?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@V?$initializer_list@PAUCordRep@cord_internal@absl@@@2@@Z + ??0?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ + ??0?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??0?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??0?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ @@ -982,6 +1037,13 @@ ??0CordRepRing@cord_internal@absl@@AAE@I@Z ??0CordRepRingReader@cord_internal@absl@@QAE@XZ ??0CordRepSubstring@cord_internal@absl@@QAE@XZ + ??0CordzHandle@cord_internal@absl@@IAE@_N@Z + ??0CordzHandle@cord_internal@absl@@QAE@XZ + ??0CordzInfo@cord_internal@absl@@AAE@PAUCordRep@12@PBV012@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzStatistics@cord_internal@absl@@QAE@XZ + ??0CordzUpdateScope@cord_internal@absl@@QAE@PAVCordzInfo@12@W4MethodIdentifier@CordzUpdateTracker@12@@Z + ??0CordzUpdateTracker@cord_internal@absl@@QAE@XZ + ??0Counter@CordzUpdateTracker@cord_internal@absl@@QAE@XZ ??0Duration@absl@@AAE@_JI@Z ??0Duration@absl@@QAE@XZ ??0ErrnoSaver@base_internal@absl@@QAE@XZ @@ -994,9 +1056,11 @@ ??0HashtablezInfo@container_internal@absl@@QAE@XZ ??0HashtablezSampler@container_internal@absl@@QAE@XZ ??0Impl@time_zone@cctz@time_internal@absl@@AAE@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ??0InlineData@cord_internal@absl@@QAE@W4DefaultInitType@012@@Z ??0InlineData@cord_internal@absl@@QAE@XZ ??0InlineRep@Cord@absl@@QAE@$$QAV012@@Z ??0InlineRep@Cord@absl@@QAE@ABV012@@Z + ??0InlineRep@Cord@absl@@QAE@W4DefaultInitType@InlineData@cord_internal@2@@Z ??0InlineRep@Cord@absl@@QAE@XZ ??0InputValue@UnboundConversion@str_format_internal@absl@@QAE@XZ ??0KernelTimeout@synchronization_internal@absl@@QAE@VTime@2@@Z @@ -1045,6 +1109,8 @@ ??0_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@PAPAUTransition@cctz@time_internal@absl@@I@Z ??0_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@PAPAUTransitionType@cctz@time_internal@absl@@I@Z ??0_ConstructTransaction@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@AAV123@I@Z + ??0_ConstructTransaction@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@AAV123@I@Z ??0_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@AAV123@I@Z ??0_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@AAV123@I@Z ??0_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@AAV123@I@Z @@ -1099,6 +1165,8 @@ ??1?$__policy_func@$$A6AXVstring_view@absl@@ABVCord@2@@Z@__function@__1@std@@QAE@XZ ??1?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ + ??1?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ + ??1?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ @@ -1106,6 +1174,8 @@ ??1?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$__temp_value@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IAE@XZ + ??1?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAE@XZ + ??1?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??1?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??1?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAE@XZ ??1?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IAE@XZ @@ -1126,6 +1196,8 @@ ??1?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ + ??1?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ + ??1?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAE@XZ @@ -1135,6 +1207,9 @@ ??1CondVar@absl@@QAE@XZ ??1Cord@absl@@QAE@XZ ??1CordForest@absl@@QAE@XZ + ??1CordzHandle@cord_internal@absl@@MAE@XZ + ??1CordzInfo@cord_internal@absl@@EAE@XZ + ??1CordzUpdateScope@cord_internal@absl@@QAE@XZ ??1ErrnoSaver@base_internal@absl@@QAE@XZ ??1FormatSinkImpl@str_format_internal@absl@@QAE@XZ ??1GraphCycles@synchronization_internal@absl@@QAE@XZ @@ -1166,6 +1241,8 @@ ??1_ConstructTransaction@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1_ConstructTransaction@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1_ConstructTransaction@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ + ??1_ConstructTransaction@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1_ConstructTransaction@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1_ConstructTransaction@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ ??1_ConstructTransaction@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ @@ -1177,10 +1254,9 @@ ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IAEAAV012@$$QAV012@@Z ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QAEAAV012@$$QAV012@@Z ??4Cord@absl@@QAEAAV01@$$QAV01@@Z - ??4Cord@absl@@QAEAAV01@ABV01@@Z ??4Cord@absl@@QAEAAV01@Vstring_view@1@@Z + ??4CordzUpdateTracker@cord_internal@absl@@QAEAAV012@ABV012@@Z ??4InlineRep@Cord@absl@@QAEAAV012@$$QAV012@@Z - ??4InlineRep@Cord@absl@@QAEAAV012@ABV012@@Z ??4Payload@status_internal@absl@@QAEAAU012@$$QAU012@@Z ??4Status@absl@@QAEAAV01@$$QAV01@@Z ??4int128@absl@@QAEAAV01@H@Z @@ -1248,6 +1324,7 @@ ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEAAUViableSubstitution@strings_internal@absl@@I@Z ??ACord@absl@@QBEDI@Z ??Astring_view@absl@@QBEABDI@Z + ??B?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QBEPAVCordzHandle@cord_internal@absl@@XZ ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QBE_NXZ ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBE_NXZ ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBE_NXZ @@ -1272,6 +1349,7 @@ ??CChunkIterator@Cord@absl@@QBEPBVstring_view@2@XZ ??D?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@__1@std@@QBEAAPBVImpl@time_zone@cctz@time_internal@absl@@XZ ??D?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@QBEAAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@XZ + ??D?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__1@std@@QBEAAPAVCordzHandle@cord_internal@absl@@XZ ??D?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@__1@std@@QBEAAUTransition@cctz@time_internal@absl@@XZ ??D?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__1@std@@QBEAAUTransitionType@cctz@time_internal@absl@@XZ ??D?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QBEABUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ @@ -1289,6 +1367,7 @@ ??Dabsl@@YA?AVuint128@0@V10@0@Z ??E?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QAEAAV012@XZ ??E?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@QAEAAV012@XZ + ??E?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__1@std@@QAEAAV012@XZ ??E?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__1@std@@QAEAAV012@XZ ??E?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QAEAAV012@XZ ??E?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEAAV012@XZ @@ -1480,18 +1559,21 @@ ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXVstring_view@3@@Z ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAE_NVstring_view@4@@Z - ?AppendArray@InlineRep@Cord@absl@@QAEXPBDI@Z + ?AppendArray@InlineRep@Cord@absl@@QAEXVstring_view@3@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@II@Z ?AppendNode@CordForest@absl@@AAEPAUCordRep@cord_internal@2@PAU342@0@Z ?AppendPack@str_format_internal@absl@@YAAAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z ?AppendPieces@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z ?AppendSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAEIVstring_view@4@@Z - ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@@Z + ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?ApplySubstitutions@strings_internal@absl@@YAHVstring_view@2@PAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@56@@Z ?AsValueType@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAPAPAUCordRep@cord_internal@2@PAPAU342@@Z ?AsciiStrToLower@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z ?AsciiStrToUpper@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z + ?AssertHeld@CordzInfo@cord_internal@absl@@QAEXXZ ?AssertHeld@Mutex@absl@@QBEXXZ ?AssertNotHeld@Mutex@absl@@QBEXXZ ?AssertReaderHeld@Mutex@absl@@QBEXXZ @@ -1543,6 +1625,7 @@ ?CombineContiguousImpl@HashState@hash_internal@absl@@CA_K_KPBEIU?$integral_constant@H$07@__1@std@@@Z ?CombineLargeContiguousImpl32@HashState@hash_internal@absl@@CA_K_KPBEI@Z ?CombineLargeContiguousImpl64@HashState@hash_internal@absl@@CA_K_KPBEI@Z + ?CommitTree@InlineRep@Cord@absl@@QAEXPBUCordRep@cord_internal@3@PAU453@ABVCordzUpdateScope@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?Compare@Cord@absl@@QBEHVstring_view@2@@Z ?CompareImpl@Cord@absl@@ABEHABV12@@Z ?CompareSlowPath@Cord@absl@@ABEHABV12@II@Z @@ -1600,6 +1683,7 @@ ?Delete@CordRepExternal@cord_internal@absl@@SAXPAUCordRep@23@@Z ?Delete@CordRepFlat@cord_internal@absl@@SAXPAUCordRep@23@@Z ?Delete@CordRepRing@cord_internal@absl@@CAXPAV123@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPAV123@@Z ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPAUArena@123@@Z ?Demangle@debugging_internal@absl@@YA_NPBDPADH@Z ?Description@Impl@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ @@ -1610,6 +1694,9 @@ ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEXXZ ?DestroyCordSlow@Cord@absl@@AAEXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QAE?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QBE_NPBV123@@Z ?DidAllocate@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAE_NXZ ?DidAllocate@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE_NXZ ?DidAllocate@?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE_NXZ @@ -1648,6 +1735,7 @@ ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPAXQBQAXQAHHH_NP6AXPBD0@Z0@Z ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z + ?EmplaceTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?EmptyString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ ?EnableDebugLog@CondVar@absl@@QAEXPBD@Z ?EnableDebugLog@Mutex@absl@@QAEXPBD@Z @@ -1678,6 +1766,7 @@ ?FastIntToBuffer@numbers_internal@absl@@YAPAD_JPAD@Z ?FastIntToBuffer@numbers_internal@absl@@YAPAD_KPAD@Z ?Fer@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?FillParentStack@CordzInfo@cord_internal@absl@@CAHPBV123@PAPAX@Z ?Find@ByAnyChar@absl@@QBE?AVstring_view@2@V32@I@Z ?Find@ByChar@absl@@QBE?AVstring_view@2@V32@I@Z ?Find@ByLength@absl@@QBE?AVstring_view@2@V32@I@Z @@ -1749,6 +1838,7 @@ ?FromChrono@absl@@YA?AVDuration@1@ABV?$duration@_JV?$ratio@$00$0PECEA@@__1@std@@@chrono@__1@std@@@Z ?FromChrono@absl@@YA?AVTime@1@ABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$0PECEA@@__1@std@@@234@@chrono@__1@std@@@Z ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z + ?FromHost64@big_endian@absl@@YA_K_K@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@__1@std@@@Z ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@__1@std@@@Z ?FromTM@absl@@YA?AVTime@1@ABUtm@@VTimeZone@1@@Z @@ -1783,8 +1873,6 @@ ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ ?GetAllocator@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@USubRange@absl@@@__1@std@@XZ ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QAEXPAPADPAI@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QAEXPAPADPAII@Z ?GetCachedTID@base_internal@absl@@YAIXZ ?GetCapacity@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ ?GetCapacity@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ @@ -1793,6 +1881,7 @@ ?GetCapacity@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ ?GetCharacter@CordRepRing@cord_internal@absl@@QBEDI@Z ?GetCond@WinHelper@Waiter@synchronization_internal@absl@@SAPAU_RTL_CONDITION_VARIABLE@@PAV234@@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QBE?AUCordzStatistics@23@XZ ?GetCurrentTimeNanos@absl@@YA_JXZ ?GetData@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEAAPAHXZ ?GetData@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAPAPAUCordRep@cord_internal@3@XZ @@ -1825,6 +1914,8 @@ ?GetLeafData@CordRepRing@cord_internal@absl@@SAPBDPBUCordRep@23@@Z ?GetLock@WinHelper@Waiter@synchronization_internal@absl@@SAPAU_RTL_SRWLOCK@@PAV234@@Z ?GetOrCreateCurrentThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ ?GetPayload@Status@absl@@QBE?AV?$optional@VCord@absl@@@2@Vstring_view@2@@Z ?GetPayloads@Status@absl@@AAEPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@2@XZ ?GetPayloads@Status@absl@@ABEPBV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@2@XZ @@ -1852,6 +1943,7 @@ ?GetSizeAndIsAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ ?GetSizeAndIsAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QBEABIXZ ?GetSkipCount@ExponentialBiased@base_internal@absl@@QAE_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ ?GetStackFrames@absl@@YAHPAPAXPAHHH@Z ?GetStackFramesWithContext@absl@@YAHPAPAXPAHHHPBX1@Z ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QAEHUGraphId@23@PAPAPAX@Z @@ -1876,6 +1968,7 @@ ?HasEdge@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z ?HasNode@GraphCycles@synchronization_internal@absl@@QAE_NUGraphId@23@@Z ?HashSeed@container_internal@absl@@YAIPBC@Z + ?Head@CordzInfo@cord_internal@absl@@SAPAV123@ABVCordzSnapshot@23@@Z ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?HideMask@base_internal@absl@@YAIXZ ?Hours@absl@@YA?AVDuration@1@_J@Z @@ -1913,6 +2006,7 @@ ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z ?IsDataLoss@absl@@YA_NABVStatus@1@@Z ?IsDeadlineExceeded@absl@@YA_NABVStatus@1@@Z + ?IsEmpty@Queue@CordzHandle@cord_internal@absl@@QBE_NXZ ?IsFailedPrecondition@absl@@YA_NABVStatus@1@@Z ?IsFlat@CordRepRing@cord_internal@absl@@QBE_NIIPAVstring_view@3@@Z ?IsFlat@CordRepRing@cord_internal@absl@@QBE_NPAVstring_view@3@@Z @@ -1950,6 +2044,7 @@ ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransition@234@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransitionType@234@@Z ?LocalTimeZone@absl@@YA?AVTimeZone@1@XZ + ?Lock@CordzInfo@cord_internal@absl@@QAEXW4MethodIdentifier@CordzUpdateTracker@23@@Z ?Lock@Mutex@absl@@QAEXXZ ?Lock@SpinLock@base_internal@absl@@QAEXXZ ?LockSlow@Mutex@absl@@AAEXPBUMuHowS@2@PBVCondition@2@H@Z @@ -1959,9 +2054,11 @@ ?LockWhenWithDeadline@Mutex@absl@@QAE_NABVCondition@2@VTime@2@@Z ?LockWhenWithTimeout@Mutex@absl@@QAE_NABVCondition@2@VDuration@2@@Z ?LogSeverityName@absl@@YAPBDW4LogSeverity@1@@Z + ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QAEXW4MethodIdentifier@123@_J@Z ?MakeConcat@CordForest@absl@@AAEPAUCordRep@cord_internal@2@PAU342@0@Z ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z + ?MakeFlatWithExtraCapacity@InlineRep@Cord@absl@@QAEPAUCordRepFlat@cord_internal@3@I@Z ?MakeInt128@absl@@YA?AVint128@1@_J_K@Z ?MakeNormalizedDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z ?MakeNs@KernelTimeout@synchronization_internal@absl@@CA_JVTime@3@@Z @@ -2007,6 +2104,7 @@ ?New@CordRepRing@cord_internal@absl@@CAPAV123@II@Z ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z ?Next@CordRepRingReader@cord_internal@absl@@QAE?AVstring_view@3@XZ + ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SAII@Z ?NextCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SAII@Z ?NextCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SAII@Z @@ -2027,6 +2125,8 @@ ?Now@UnscaledCycleClockWrapperForGetCurrentTime@time_internal@absl@@SA_JXZ ?Now@absl@@YA?AVTime@1@XZ ?NumCPUs@base_internal@absl@@YAHXZ + ?ODRCheck@CordzHandle@cord_internal@absl@@ABEXXZ + ?ODRCheck@CordzInfo@cord_internal@absl@@ABEXXZ ?OccursBefore@ViableSubstitution@strings_internal@absl@@QBE_NABU123@@Z ?OppositeInfinity@time_internal@absl@@YA?AVDuration@2@V32@@Z ?OutOfRangeError@absl@@YA?AVStatus@1@Vstring_view@1@@Z @@ -2065,7 +2165,9 @@ ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@II@Z ?PrependNode@CordForest@absl@@AAEPAUCordRep@cord_internal@2@PAU342@0@Z ?PrependSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z - ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@@Z + ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?PrevTransition@Impl@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@2345@@Z ?PrevTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z @@ -2094,6 +2196,7 @@ ?ReaderUnlock@Mutex@absl@@QAEXXZ ?ReclaimThreadIdentity@synchronization_internal@absl@@YAXPAX@Z ?RecordInsertSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@II@Z + ?RecordMetrics@CordzInfo@cord_internal@absl@@QAEX_J@Z ?Ref@CordRep@cord_internal@absl@@SAPAU123@PAU123@@Z ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z ?Register@HashtablezSampler@container_internal@absl@@QAEPAUHashtablezInfo@23@XZ @@ -2142,6 +2245,8 @@ ?SetAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAUSubRange@3@I@Z ?SetCapacityForTesting@CordRepRing@cord_internal@absl@@QAEXI@Z ?SetConversionChar@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXW4FormatConversionChar@3@PAVFormatConversionSpecImpl@23@@Z + ?SetCordRep@CordzInfo@cord_internal@absl@@QAEXPAUCordRep@23@@Z + ?SetCordRep@CordzUpdateScope@cord_internal@absl@@QBEXPAUCordRep@23@@Z ?SetCurrentThreadIdentity@base_internal@absl@@YAXPAUThreadIdentity@12@P6AXPAX@Z@Z ?SetDisposeCallback@HashtablezSampler@container_internal@absl@@QAEP6AXABUHashtablezInfo@23@@ZP6AX0@Z@Z ?SetFlags@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXUFlags@23@PAVFormatConversionSpecImpl@23@@Z @@ -2162,6 +2267,7 @@ ?SetThreadBlockedCounter@PerThreadSem@synchronization_internal@absl@@SAXPAU?$atomic@H@__1@std@@@Z ?SetToZero@?$BigUnsigned@$03@strings_internal@absl@@QAEXXZ ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXXZ + ?SetTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@ABVCordzUpdateScope@53@@Z ?SetValue@?$Manager@H$01@FormatArgImpl@str_format_internal@absl@@SA?ATData@234@ABH@Z ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPAVFormatConversionSpecImpl@23@@Z ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z @@ -2270,6 +2376,7 @@ ?ToDoubleSeconds@absl@@YANVDuration@1@@Z ?ToHost16@big_endian@absl@@YAGG@Z ?ToHost32@big_endian@absl@@YAII@Z + ?ToHost64@big_endian@absl@@YA_K_K@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@__1@std@@@Z ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@__1@std@@@Z @@ -2301,6 +2408,9 @@ ?ToUnixNanos@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@cctz@time_internal@absl@@YA_JABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@@Z + ?Track@CordzInfo@cord_internal@absl@@AAEXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@@Z ?Trans@Mutex@absl@@AAEXPBUMuHowS@2@@Z ?Trunc@absl@@YA?AVDuration@1@V21@0@Z ?TryLock@Mutex@absl@@QAE_NXZ @@ -2321,6 +2431,7 @@ ?UnimplementedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UniversalEpoch@absl@@YA?AVTime@1@XZ ?UnknownError@absl@@YA?AVStatus@1@Vstring_view@1@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QAEXXZ ?Unlock@Mutex@absl@@QAEXXZ ?Unlock@SpinLock@base_internal@absl@@QAEXXZ ?UnlockSlow@Mutex@absl@@AAEXPAUSynchWaitParams@2@@Z @@ -2332,6 +2443,9 @@ ?UnrefTree@InlineRep@Cord@absl@@AAEXXZ ?Unregister@HashtablezSampler@container_internal@absl@@QAEXPAUHashtablezInfo@23@@Z ?UnsampleSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?Untrack@CordzInfo@cord_internal@absl@@QAEXXZ + ?UpdateCordzStatistics@InlineRep@Cord@absl@@QAEXXZ + ?UpdateCordzStatisticsSlow@InlineRep@Cord@absl@@QAEXXZ ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QAEXUGraphId@23@HP6AHPAPAXH@Z@Z ?UsingInlinedStorage@Storage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CA_NI@Z ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z @@ -2391,12 +2505,18 @@ ?__alloc@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ + ?__alloc@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ ?__alloc@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@XZ ?__alloc@?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ ?__alloc@?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IBEABV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IBEABV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ + ?__alloc@?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IBEABV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IAEAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IBEABV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAEAAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ @@ -2408,18 +2528,24 @@ ?__alloc@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IAEAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@XZ ?__alloc@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IBEABV?$allocator@VFormatArgImpl@str_format_internal@absl@@@23@XZ ?__annotate_contiguous_container@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z + ?__annotate_contiguous_container@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z + ?__annotate_contiguous_container@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z ?__annotate_contiguous_container@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z ?__annotate_contiguous_container@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z ?__annotate_contiguous_container@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z ?__annotate_contiguous_container@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z ?__annotate_contiguous_container@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@ABEXPBX000@Z ?__annotate_delete@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@ABEXXZ + ?__annotate_delete@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEXXZ + ?__annotate_delete@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEXXZ ?__annotate_delete@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@ABEXXZ ?__annotate_delete@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEXXZ ?__annotate_delete@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEXXZ ?__annotate_delete@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@ABEXXZ ?__annotate_delete@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@ABEXXZ ?__annotate_new@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@ABEXI@Z + ?__annotate_new@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEXI@Z + ?__annotate_new@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEXI@Z ?__annotate_new@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@ABEXI@Z ?__annotate_new@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEXI@Z ?__annotate_new@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEXI@Z @@ -2453,6 +2579,10 @@ ?__destruct_at_end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEXPAPAUCordRep@cord_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEXPAPAUCordRep@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z + ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z @@ -2462,6 +2592,8 @@ ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEXPAUViableSubstitution@strings_internal@absl@@@Z ?__destruct_at_end@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEXPAUViableSubstitution@strings_internal@absl@@U?$integral_constant@_N$0A@@23@@Z ?__destruct_at_end@?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IAEXPAPAUCordRep@cord_internal@absl@@@Z + ?__destruct_at_end@?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEXPAPAVCordzHandle@cord_internal@absl@@@Z + ?__destruct_at_end@?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEXPAPBVCordzHandle@cord_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAEXPAUTransition@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAEXPAUTransitionType@cctz@time_internal@absl@@@Z ?__destruct_at_end@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IAEXPAUViableSubstitution@strings_internal@absl@@@Z @@ -2477,6 +2609,10 @@ ?__end_cap@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEABQAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__end_cap@?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPAUCordRep@cord_internal@absl@@XZ ?__end_cap@?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPAUCordRep@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPBVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPBVCordzHandle@cord_internal@absl@@XZ ?__end_cap@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAEAAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBEABQAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAPAUTransition@cctz@time_internal@absl@@XZ @@ -2487,6 +2623,10 @@ ?__end_cap@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QBEABQAUViableSubstitution@strings_internal@absl@@XZ ?__end_cap@?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IAEAAPAPAUCordRep@cord_internal@absl@@XZ ?__end_cap@?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IBEABQAPAUCordRep@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEAAPAPAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IBEABQAPAVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEAAPAPBVCordzHandle@cord_internal@absl@@XZ + ?__end_cap@?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IBEABQAPBVCordzHandle@cord_internal@absl@@XZ ?__end_cap@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IAEAAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IBEABQAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?__end_cap@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAEAAPAUTransition@cctz@time_internal@absl@@XZ @@ -2500,6 +2640,8 @@ ?__front_spare@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?__get@?$__compressed_pair_elem@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAEAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAEAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAEAAV?$allocator@UTransition@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@$00$0A@@__1@std@@QAEAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2510,6 +2652,10 @@ ?__get@?$__compressed_pair_elem@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@$0A@$0A@@__1@std@@QBEABQAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@PAPAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QAEAAPAPAUCordRep@cord_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PAPAUCordRep@cord_internal@absl@@$0A@$0A@@__1@std@@QBEABQAPAUCordRep@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PAPAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QAEAAPAPAVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PAPAVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QBEABQAPAVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PAPBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QAEAAPAPBVCordzHandle@cord_internal@absl@@XZ + ?__get@?$__compressed_pair_elem@PAPBVCordzHandle@cord_internal@absl@@$0A@$0A@@__1@std@@QBEABQAPBVCordzHandle@cord_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PAPBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QAEAAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PAPBVImpl@time_zone@cctz@time_internal@absl@@$0A@$0A@@__1@std@@QBEABQAPBVImpl@time_zone@cctz@time_internal@absl@@XZ ?__get@?$__compressed_pair_elem@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@$0A@$0A@@__1@std@@QAEAAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@XZ @@ -2551,6 +2697,10 @@ ?__get@?$__compressed_pair_elem@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@$00$00@__1@std@@QAEAAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QBEABV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QBEABV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ + ?__get@?$__compressed_pair_elem@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@$00$00@__1@std@@QBEABV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@$00$00@__1@std@@QAEAAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@$00$00@__1@std@@QAEAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@XZ ?__get@?$__compressed_pair_elem@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@$00$00@__1@std@@QAEAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ @@ -2568,6 +2718,8 @@ ?__get_value@?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QBEABU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@XZ ?__hash@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QBEIXZ ?__invalidate_all_iterators@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AAEXXZ + ?__invalidate_all_iterators@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXXZ + ?__invalidate_all_iterators@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXXZ ?__invalidate_all_iterators@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AAEXXZ ?__invalidate_all_iterators@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXXZ ?__invalidate_all_iterators@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXXZ @@ -2578,6 +2730,7 @@ ?__invalidate_iterators_past@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXPAUTransitionType@cctz@time_internal@absl@@@Z ?__invalidate_iterators_past@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AAEXPAUViableSubstitution@strings_internal@absl@@@Z ?__invalidate_iterators_past@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AAEXPAVFormatArgImpl@str_format_internal@absl@@@Z + ?__make_iter@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAE?AV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@23@PAPAVCordzHandle@cord_internal@absl@@@Z ?__make_iter@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@ABE?AV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?__make_iter@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@PAUTransition@cctz@time_internal@absl@@@Z ?__make_iter@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@PAUTransitionType@cctz@time_internal@absl@@@Z @@ -2586,6 +2739,8 @@ ?__node_alloc@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAEAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@XZ ?__ptr@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QAEPAU123@XZ ?__recommend@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@ABEII@Z + ?__recommend@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEII@Z + ?__recommend@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@ABEII@Z ?__recommend@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@ABEII@Z ?__recommend@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEII@Z ?__recommend@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@ABEII@Z @@ -2593,6 +2748,8 @@ ?__recommend@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@ABEII@Z ?__rehash@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AAEXI@Z ?__swap_out_circular_buffer@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AAEXAAU?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXAAU?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z + ?__swap_out_circular_buffer@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AAEXAAU?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@AAEXAAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@23@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEPAUTransition@cctz@time_internal@absl@@AAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@PAU4567@@Z ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXAAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@@Z @@ -2616,7 +2773,9 @@ ?allocate@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z ?allocate@?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@QAEPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@I@Z ?allocate@?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAEPAPAUCordRep@cord_internal@absl@@I@Z + ?allocate@?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@QAEPAPAVCordzHandle@cord_internal@absl@@I@Z ?allocate@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAEPAPBUCordRep@cord_internal@absl@@I@Z + ?allocate@?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@QAEPAPBVCordzHandle@cord_internal@absl@@I@Z ?allocate@?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z ?allocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QAEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@I@Z ?allocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QAEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z @@ -2631,7 +2790,9 @@ ?allocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@AAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@I@Z ?allocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPAPAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@23@I@Z ?allocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPAPAUCordRep@cord_internal@2@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@Z + ?allocate@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPAPAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@I@Z ?allocate@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPAPBUCordRep@cord_internal@2@AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@I@Z + ?allocate@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPAPBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@I@Z ?allocate@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@I@Z ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@SAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@AAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@I@Z ?allocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@I@Z @@ -2664,6 +2825,7 @@ ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAUTransitionType@cctz@time_internal@absl@@XZ ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEAAUViableSubstitution@strings_internal@absl@@XZ + ?base@?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__1@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ ?base@?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@__1@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ ?base@?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__1@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ ?base@?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QBEPBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ @@ -2684,6 +2846,7 @@ ?begin@?$initializer_list@Vstring_view@absl@@@std@@QBEPBVstring_view@absl@@XZ ?begin@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QBEPBW4FormatConversionCharSet@absl@@XZ ?begin@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE?AV?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@XZ + ?begin@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@23@XZ ?begin@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBE?AV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@XZ ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2694,17 +2857,23 @@ ?capacity@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?capacity@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?capacity@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IBEIXZ + ?capacity@?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IBEIXZ + ?capacity@?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IBEIXZ ?capacity@?$__vector_base@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@IBEIXZ ?capacity@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IBEIXZ ?capacity@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IBEIXZ ?capacity@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IBEIXZ ?capacity@?$__vector_base@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@IBEIXZ ?capacity@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?capacity@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?capacity@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ @@ -2716,11 +2885,15 @@ ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAEXXZ ?clear@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@?$__split_buffer@PAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEXXZ + ?clear@?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXXZ + ?clear@?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@?$__vector_base@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@IAEXXZ + ?clear@?$__vector_base@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEXXZ + ?clear@?$__vector_base@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@IAEXXZ ?clear@?$__vector_base@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAEXXZ ?clear@?$__vector_base@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAEXXZ ?clear@?$__vector_base@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@IAEXXZ @@ -2730,7 +2903,6 @@ ?clear@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?clear@InlineRep@Cord@absl@@QAEPAUCordRep@cord_internal@3@XZ ?clear_cordz_info@InlineData@cord_internal@absl@@QAEXXZ - ?clear_cordz_info@InlineRep@Cord@absl@@QAEXXZ ?code@Status@absl@@QBE?AW4StatusCode@2@XZ ?compare_exchange_weak@?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QAE_NAAPAUHashtablezInfo@container_internal@absl@@PAU456@W4memory_order@23@2@Z ?concat@CordRep@cord_internal@absl@@QAEPAUCordRepConcat@23@XZ @@ -2738,6 +2910,9 @@ ?consumed@CordRepRingReader@cord_internal@absl@@QBEIXZ ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QBE?AW4FormatConversionChar@3@XZ ?cord_ring_buffer_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A + ?cordz_info@InlineData@cord_internal@absl@@QBEPAVCordzInfo@23@XZ + ?cordz_info@InlineRep@Cord@absl@@QBEPAVCordzInfo@cord_internal@3@XZ + ?cordz_should_profile@cord_internal@absl@@YA_NXZ ?count@FILERawSink@str_format_internal@absl@@QBEIXZ ?data@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAEPAPAUCordRep@cord_internal@2@XZ ?data@?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QAEPAHXZ @@ -2752,6 +2927,8 @@ ?data@?$Span@I@absl@@QBEPAIXZ ?data@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QBEPAVFormatArgImpl@str_format_internal@2@XZ ?data@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEPBQAUCordRep@cord_internal@absl@@XZ + ?data@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEPBQAVCordzHandle@cord_internal@absl@@XZ + ?data@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEPBQBVCordzHandle@cord_internal@absl@@XZ ?data@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBEPBUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ ?data@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEPBUTransition@cctz@time_internal@absl@@XZ ?data@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEPBUTransitionType@cctz@time_internal@absl@@XZ @@ -2772,7 +2949,9 @@ ?deallocate@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z ?deallocate@?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@I@Z ?deallocate@?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPAUCordRep@cord_internal@absl@@I@Z + ?deallocate@?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@I@Z ?deallocate@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPBUCordRep@cord_internal@absl@@I@Z + ?deallocate@?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@I@Z ?deallocate@?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEXPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z ?deallocate@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QAEXPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@I@Z ?deallocate@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z @@ -2787,7 +2966,9 @@ ?deallocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@I@Z ?deallocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@PAPAUCordRep@cord_internal@absl@@I@Z ?deallocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@2@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@PAPAVCordzHandle@cord_internal@absl@@I@Z ?deallocate@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@2@I@Z + ?deallocate@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@PAPBVCordzHandle@cord_internal@absl@@I@Z ?deallocate@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@PAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@SAXAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@I@Z ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z @@ -2801,7 +2982,9 @@ ?description@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ ?destroy@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z ?destroy@?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPAUCordRep@cord_internal@absl@@@Z + ?destroy@?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@@Z ?destroy@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPBUCordRep@cord_internal@absl@@@Z + ?destroy@?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@@Z ?destroy@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?destroy@?$allocator@UPayload@status_internal@absl@@@__1@std@@QAEXPAUPayload@status_internal@absl@@@Z ?destroy@?$allocator@USubRange@absl@@@__1@std@@QAEXPAUSubRange@absl@@@Z @@ -2841,6 +3024,7 @@ ?end@?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@QBEPBU?$pair@Vstring_view@absl@@V12@@__1@2@XZ ?end@?$initializer_list@Vstring_view@absl@@@std@@QBEPBVstring_view@absl@@XZ ?end@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE?AV?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@XZ + ?end@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@23@XZ ?end@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBE?AV?$__wrap_iter@PBUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@XZ ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@XZ @@ -2892,6 +3076,14 @@ ?first@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPAUCordRep@cord_internal@absl@@XZ ?first@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPAUCordRep@cord_internal@absl@@XZ ?first@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPAUCordRep@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPAVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAPAPBVCordzHandle@cord_internal@absl@@XZ + ?first@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABQAPBVCordzHandle@cord_internal@absl@@XZ ?first@?$__compressed_pair@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QAEAAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ ?first@?$__compressed_pair@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QBEABQAPBVImpl@time_zone@cctz@time_internal@absl@@XZ ?first@?$__compressed_pair@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@@__1@std@@QAEAAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@XZ @@ -2929,7 +3121,6 @@ ?fixed_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@ABV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z ?flat@CordRep@cord_internal@absl@@QAEPAUCordRepFlat@23@XZ ?flat@CordRep@cord_internal@absl@@QBEPBUCordRepFlat@23@XZ - ?force_tree@InlineRep@Cord@absl@@QAEPAUCordRep@cord_internal@3@I@Z ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABV567@ABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@ABV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@ABVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AANW4chars_format@1@@Z @@ -2961,6 +3152,7 @@ ?get@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@@__1@std@@QBEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@XZ ?get@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QBEPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@XZ ?get@?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEPAVZoneInfoSource@cctz@time_internal@absl@@XZ + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ ?get_deleter@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QAEAAV?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@23@XZ ?get_deleter@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@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@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QBEABV?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@23@XZ ?get_deleter@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@@__1@std@@QAEAAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@XZ @@ -2990,6 +3182,9 @@ ?is_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QBE_NXZ ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z ?is_length@ConvTag@str_format_internal@absl@@QBE_NXZ + ?is_profiled@InlineData@cord_internal@absl@@QBE_NXZ + ?is_profiled@InlineRep@Cord@absl@@QBE_NXZ + ?is_snapshot@CordzHandle@cord_internal@absl@@QBE_NXZ ?is_tree@InlineData@cord_internal@absl@@QBE_NXZ ?is_tree@InlineRep@Cord@absl@@QBE_NXZ ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAEAAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ @@ -2998,6 +3193,8 @@ ?length@string_view@absl@@QBEIXZ ?load@?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QBEP6AXABUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z ?load@?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QBEPAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QBEPAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?load@?$__atomic_base@PAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QBEPAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z ?load@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QBE?AW4OnDeadlockCycle@absl@@W4memory_order@23@@Z ?load@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QBE?AW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?load_time_zone@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PAVtime_zone@123@@Z @@ -3013,7 +3210,9 @@ ?max_size@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QBEIXZ ?max_size@?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@QBEIXZ ?max_size@?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QBEIXZ + ?max_size@?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@QBEIXZ ?max_size@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QBEIXZ + ?max_size@?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@QBEIXZ ?max_size@?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QBEIXZ ?max_size@?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@QBEIXZ ?max_size@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QBEIXZ @@ -3024,6 +3223,8 @@ ?max_size@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QBEIXZ ?max_size@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QBEIXZ ?max_size@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?max_size@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?max_size@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?max_size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?max_size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?max_size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ @@ -3087,6 +3288,8 @@ ?push_back@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXABQAPBVImpl@time_zone@cctz@time_internal@absl@@@Z ?push_back@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXABQBVImpl@time_zone@cctz@time_internal@absl@@@Z ?push_back@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEXABQAUCordRep@cord_internal@absl@@@Z + ?push_back@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXABQAVCordzHandle@cord_internal@absl@@@Z + ?push_back@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEXABQBVCordzHandle@cord_internal@absl@@@Z ?push_back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAEX$$QAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z ?push_back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXABUTransition@cctz@time_internal@absl@@@Z ?push_front@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXABQAPBVImpl@time_zone@cctz@time_internal@absl@@@Z @@ -3145,6 +3348,12 @@ ?second@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PAPAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEABV?$allocator@PAUCordRep@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PAPAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ + ?second@?$__compressed_pair@PAPBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEABV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@XZ ?second@?$__compressed_pair@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@@__1@std@@QAEAAV?$__allocator_destructor@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@XZ ?second@?$__compressed_pair@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@@__1@std@@QAEAAV?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@XZ ?second@?$__compressed_pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QAEAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@XZ @@ -3171,6 +3380,8 @@ ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ ?set_arg@BoundConversion@str_format_internal@absl@@QAEXPBVFormatArgImpl@23@@Z + ?set_cordz_info@InlineData@cord_internal@absl@@QAEXPAVCordzInfo@23@@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z ?set_data@InlineRep@Cord@absl@@QAEPADI@Z ?set_data@InlineRep@Cord@absl@@QAEXPBDI_N@Z ?set_depth@CordRepConcat@cord_internal@absl@@QAEXE@Z @@ -3205,6 +3416,8 @@ ?size@?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@QBEIXZ ?size@?$initializer_list@W4FormatConversionCharSet@absl@@@std@@QBEIXZ ?size@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?size@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ + ?size@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?size@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?size@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ ?size@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ @@ -3218,6 +3431,8 @@ ?status@BadStatusOrAccess@absl@@QBEABVStatus@2@XZ ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Uday_tag@1234@U51234@_J@Z ?step@detail@cctz@time_internal@absl@@YA?AUfields@1234@Usecond_tag@1234@U51234@_J@Z + ?store@?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QAEXPAVCordzHandle@cord_internal@absl@@W4memory_order@23@@Z + ?store@?$__atomic_base@PAVCordzInfo@cord_internal@absl@@$0A@@__1@std@@QAEXPAVCordzInfo@cord_internal@absl@@W4memory_order@23@@Z ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QAEXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QAEXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QBE?AVstring_view@3@XZ
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def index 4d1f6f6e..e816caa 100644 --- a/third_party/abseil-cpp/symbols_x86_rel.def +++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -109,6 +109,8 @@ ??0Condition@absl@@QAE@P6A_NPAX@Z0@Z ??0Condition@absl@@QAE@PB_N@Z ??0Cord@absl@@QAE@Vstring_view@1@@Z + ??0CordzHandle@cord_internal@absl@@IAE@_N@Z + ??0CordzInfo@cord_internal@absl@@AAE@PAUCordRep@12@PBV012@W4MethodIdentifier@CordzUpdateTracker@12@@Z ??0GraphCycles@synchronization_internal@absl@@QAE@XZ ??0HashtablezInfo@container_internal@absl@@QAE@XZ ??0HashtablezSampler@container_internal@absl@@QAE@XZ @@ -129,6 +131,8 @@ ??0uint128@absl@@QAE@O@Z ??1BadStatusOrAccess@absl@@UAE@XZ ??1CondVar@absl@@QAE@XZ + ??1CordzHandle@cord_internal@absl@@MAE@XZ + ??1CordzInfo@cord_internal@absl@@EAE@XZ ??1GraphCycles@synchronization_internal@absl@@QAE@XZ ??1HashtablezInfo@container_internal@absl@@QAE@XZ ??1HashtablezSampler@container_internal@absl@@QAE@XZ @@ -205,12 +209,14 @@ ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXVstring_view@3@@Z ?Append@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAE_NVstring_view@4@@Z - ?AppendArray@InlineRep@Cord@absl@@QAEXPBDI@Z + ?AppendArray@InlineRep@Cord@absl@@QAEXVstring_view@3@W4MethodIdentifier@CordzUpdateTracker@cord_internal@3@@Z ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@II@Z ?AppendPack@str_format_internal@absl@@YAAAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z ?AppendPieces@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z ?AppendSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z - ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@@Z + ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?AppendTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?ApplySubstitutions@strings_internal@absl@@YAHVstring_view@2@PAV?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@56@@Z ?AsciiStrToLower@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z ?AsciiStrToUpper@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z @@ -288,6 +294,7 @@ ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@XZ ?DefaultStackUnwinder@absl@@YAHPAPAXPAHHHPBX1@Z ?Delete@CordRepRing@cord_internal@absl@@CAXPAV123@@Z + ?Delete@CordzHandle@cord_internal@absl@@SAXPAV123@@Z ?DeleteArena@LowLevelAlloc@base_internal@absl@@SA_NPAUArena@123@@Z ?Demangle@debugging_internal@absl@@YA_NPBDPADH@Z ?Description@TimeZoneInfo@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ @@ -297,6 +304,9 @@ ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEXXZ ?DestroyCordSlow@Cord@absl@@AAEXXZ + ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QAE?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ + ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QBE_NPBV123@@Z ?Digits10@?$BigUnsigned@$03@strings_internal@absl@@SAHXZ ?Digits10@?$BigUnsigned@$0FE@@strings_internal@absl@@SAHXZ ?DummyFunction@?$AtomicHook@P6A?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@Vstring_view@2@ABVCord@2@@Z@base_internal@absl@@CA?AV?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@3@Vstring_view@3@ABVCord@3@@Z @@ -336,6 +346,7 @@ ?FastIntToBuffer@numbers_internal@absl@@YAPAD_JPAD@Z ?FastIntToBuffer@numbers_internal@absl@@YAPAD_KPAD@Z ?Fer@Mutex@absl@@AAEXPAUPerThreadSynch@base_internal@2@@Z + ?FillParentStack@CordzInfo@cord_internal@absl@@CAHPBV123@PAPAX@Z ?Find@ByAnyChar@absl@@QBE?AVstring_view@2@V32@I@Z ?Find@ByChar@absl@@QBE?AVstring_view@2@V32@I@Z ?Find@ByLength@absl@@QBE?AVstring_view@2@V32@I@Z @@ -398,17 +409,19 @@ ?FromUniversal@absl@@YA?AVTime@1@_J@Z ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@_J@Z ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QAEXPAPADPAI@Z - ?GetAppendRegion@InlineRep@Cord@absl@@QAEXPAPADPAII@Z ?GetCachedTID@base_internal@absl@@YAIXZ ?GetCharacter@CordRepRing@cord_internal@absl@@QBEDI@Z + ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QBE?AUCordzStatistics@23@XZ ?GetCurrentTimeNanos@absl@@YA_JXZ ?GetFlatAux@Cord@absl@@CA_NPAUCordRep@cord_internal@2@PAVstring_view@2@@Z ?GetId@GraphCycles@synchronization_internal@absl@@QAE?AUGraphId@23@PAX@Z + ?GetParentMethod@CordzInfo@cord_internal@absl@@CA?AW4MethodIdentifier@CordzUpdateTracker@23@PBV123@@Z + ?GetParentStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ ?GetPayload@Status@absl@@QBE?AV?$optional@VCord@absl@@@2@Vstring_view@2@@Z ?GetPrependBuffer@CordRepRing@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z ?GetProgramCounter@debugging_internal@absl@@YAPAXPAX@Z ?GetSkipCount@ExponentialBiased@base_internal@absl@@QAE_J_J@Z + ?GetStack@CordzInfo@cord_internal@absl@@QBE?AV?$Span@QAX@3@XZ ?GetStackFrames@absl@@YAHPAPAXPAHHH@Z ?GetStackFramesWithContext@absl@@YAHPAPAXPAHHHPBX1@Z ?GetStackTrace@GraphCycles@synchronization_internal@absl@@QAEHUGraphId@23@PAPAPAX@Z @@ -427,6 +440,7 @@ ?HasBeenNotifiedInternal@Notification@absl@@CA_NPBU?$atomic@_N@__1@std@@@Z ?HasEdge@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z ?HasNode@GraphCycles@synchronization_internal@absl@@QAE_NUGraphId@23@@Z + ?Head@CordzInfo@cord_internal@absl@@SAPAV123@ABVCordzSnapshot@23@@Z ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?IDivDuration@time_internal@absl@@YA_J_NVDuration@2@1PAV32@@Z ?In@Time@absl@@QBE?AUBreakdown@12@VTimeZone@2@@Z @@ -471,6 +485,7 @@ ?LoadTimeZone@Impl@time_zone@cctz@time_internal@absl@@SA_NABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PAV2345@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransition@234@@Z ?LocalTime@TimeZoneInfo@cctz@time_internal@absl@@ABE?AUabsolute_lookup@time_zone@234@_JABUTransitionType@234@@Z + ?Lock@CordzInfo@cord_internal@absl@@QAEXW4MethodIdentifier@CordzUpdateTracker@23@@Z ?Lock@Mutex@absl@@QAEXXZ ?LockSlow@Mutex@absl@@AAEXPBUMuHowS@2@PBVCondition@2@H@Z ?LockSlowLoop@Mutex@absl@@AAEXPAUSynchWaitParams@2@H@Z @@ -504,6 +519,7 @@ ?New@CordRepRing@cord_internal@absl@@CAPAV123@II@Z ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z ?Next@CordRepRingReader@cord_internal@absl@@QAE?AVstring_view@3@XZ + ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z @@ -545,7 +561,9 @@ ?Prepend@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@II@Z ?PrependSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z - ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@@Z + ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z + ?PrependTreeToTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z ?PrevTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z ?PrevTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z ?PrevTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z @@ -705,6 +723,9 @@ ?ToUnixMillis@absl@@YA_JVTime@1@@Z ?ToUnixNanos@absl@@YA_JVTime@1@@Z ?ToUnixSeconds@absl@@YA_JVTime@1@@Z + ?Track@CordzInfo@cord_internal@absl@@AAEXXZ + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z + ?TrackCord@CordzInfo@cord_internal@absl@@SAXAAVInlineData@23@W4MethodIdentifier@CordzUpdateTracker@23@@Z ?Trans@Mutex@absl@@AAEXPBUMuHowS@2@@Z ?Trunc@absl@@YA?AVDuration@1@V21@0@Z ?TryLock@Mutex@absl@@QAE_NXZ @@ -715,6 +736,7 @@ ?UnavailableError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnimplementedError@absl@@YA?AVStatus@1@Vstring_view@1@@Z ?UnknownError@absl@@YA?AVStatus@1@Vstring_view@1@@Z + ?Unlock@CordzInfo@cord_internal@absl@@QAEXXZ ?Unlock@Mutex@absl@@QAEXXZ ?UnlockSlow@Mutex@absl@@AAEXPAUSynchWaitParams@2@@Z ?UnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VDuration@1@@Z @@ -723,6 +745,8 @@ ?UnrefTree@InlineRep@Cord@absl@@AAEXXZ ?Unregister@HashtablezSampler@container_internal@absl@@QAEXPAUHashtablezInfo@23@@Z ?UnsampleSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@@Z + ?Untrack@CordzInfo@cord_internal@absl@@QAEXXZ + ?UpdateCordzStatisticsSlow@InlineRep@Cord@absl@@QAEXXZ ?UpdateStackTrace@GraphCycles@synchronization_internal@absl@@QAEXUGraphId@23@HP6AHPAPAXH@Z@Z ?Utf8SafeCEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z ?Utf8SafeCHexEscape@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z @@ -779,6 +803,7 @@ ?format@detail@cctz@time_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABV567@ABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@ABV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@967@ABVtime_zone@234@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AAMW4chars_format@1@@Z ?from_chars@absl@@YA?AUfrom_chars_result@1@PBD0AANW4chars_format@1@@Z + ?get_cordz_mean_interval@cord_internal@absl@@YAHXZ ?load_time_zone@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PAVtime_zone@123@@Z ?local_time_zone@cctz@time_internal@absl@@YA?AVtime_zone@123@XZ ?lookup@time_zone@cctz@time_internal@absl@@QBE?AUabsolute_lookup@1234@ABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@@Z @@ -822,6 +847,8 @@ ?safe_strtou128_base@numbers_internal@absl@@YA_NVstring_view@2@PAVuint128@2@H@Z ?safe_strtou32_base@numbers_internal@absl@@YA_NVstring_view@2@PAIH@Z ?safe_strtou64_base@numbers_internal@absl@@YA_NVstring_view@2@PA_KH@Z + ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z + ?set_tree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@@Z ?shallow_subcords_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A ?shrink_to_fit@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXXZ ?size@?$BigUnsigned@$03@strings_internal@absl@@QBEHXZ
diff --git a/third_party/blink/renderer/core/frame/csp/conversion_util_fuzzer.cc b/third_party/blink/renderer/core/frame/csp/conversion_util_fuzzer.cc index 1ff0754..eba92aee 100644 --- a/third_party/blink/renderer/core/frame/csp/conversion_util_fuzzer.cc +++ b/third_party/blink/renderer/core/frame/csp/conversion_util_fuzzer.cc
@@ -27,6 +27,13 @@ // Not much point in going on with an empty CSP string. return EXIT_SUCCESS; } + if (it - data > 250) { + // Origins should not be too long. The origin of size 'N' is copied into 'M' + // policies. The fuzzer can send an input of size N+M and use O(N*M) memory. + // Due to this quadratic behavior, we must limit the size of the origin to + // prevent the fuzzer from triggering OOM crash. Note that real domain names + // are limited to 253 characters. + } String url = String(data, it - 1 - data); String header = String(it, size - (it - data));
diff --git a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc index db108ee..ca5ec22d 100644 --- a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc +++ b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
@@ -128,12 +128,9 @@ // TODO(mkwst): We only have status code information for Documents. It would // be nice to get them for Workers as well. - // TODO(crbug.com/1153336) Use network::IsUrlPotentiallyTrustworthy(). Document* document = GetDocument(); - if (document && !SecurityOrigin::IsSecure(document->Url()) && - document->Loader()) { + if (document && document->Loader()) status_code = document->Loader()->GetResponse().HttpStatusCode(); - } return status_code; }
diff --git a/third_party/blink/renderer/core/html/html_slot_element.cc b/third_party/blink/renderer/core/html/html_slot_element.cc index 16931300..a57d517 100644 --- a/third_party/blink/renderer/core/html/html_slot_element.cc +++ b/third_party/blink/renderer/core/html/html_slot_element.cc
@@ -307,6 +307,7 @@ children_context.next_sibling = nullptr; children_context.next_sibling_valid = true; } + children_context.use_previous_in_flow = true; for (auto& node : AssignedNodes()) node->AttachLayoutTree(children_context);
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index a8daff81..ce3980b6 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -623,6 +623,7 @@ TransformPaintPropertyNode::State state{new_translation}; state.flags.flattens_inherited_transform = context_.current.should_flatten_inherited_transform; + state.rendering_context_id = context_.current.rendering_context_id; state.direct_compositing_reasons = full_context_.direct_compositing_reasons & CompositingReason::kDirectReasonsForPaintOffsetTranslationProperty; @@ -670,6 +671,7 @@ state.compositor_element_id = CompositorElementIdFromUniqueObjectId( box_model.UniqueId(), CompositorElementIdNamespace::kStickyTranslation); + state.rendering_context_id = context_.current.rendering_context_id; auto* layer = box_model.Layer(); const auto* scroller_properties = layer->AncestorScrollContainerLayer() @@ -858,6 +860,7 @@ CompositingReasonsForTransformProperty(); state.flags.flattens_inherited_transform = context_.current.should_flatten_inherited_transform; + state.rendering_context_id = context_.current.rendering_context_id; state.flags.is_for_svg_child = true; state.compositor_element_id = GetCompositorElementId( CompositorElementIdNamespace::kPrimaryTransform); @@ -1956,6 +1959,7 @@ SetTransformNodeStateFromAffineTransform(state, content_to_parent_space); state.flags.flattens_inherited_transform = context_.current.should_flatten_inherited_transform; + state.rendering_context_id = context_.current.rendering_context_id; // TODO(crbug.com/1189428): Should this set state.rendering_context_id ? OnUpdate(properties_->UpdateReplacedContentTransform( *context_.current.transform, std::move(state))); @@ -2128,6 +2132,7 @@ TransformPaintPropertyNode::State state{-ToFloatSize(scroll_position)}; state.flags.flattens_inherited_transform = context_.current.should_flatten_inherited_transform; + state.rendering_context_id = context_.current.rendering_context_id; state.direct_compositing_reasons = full_context_.direct_compositing_reasons & CompositingReason::kDirectReasonsForScrollTranslationProperty;
diff --git a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc index 91665cd..ed91994 100644 --- a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc +++ b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/core/speculation_rules/speculation_rule_set.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "third_party/blink/renderer/platform/json/json_parser.h" #include "third_party/blink/renderer/platform/json/json_values.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index 9357012..10b8eeb2 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -113,21 +113,21 @@ break; \ } -#define DEFINE_RESOURCE_HISTOGRAM(prefix) \ - switch (factory.GetType()) { \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, CSSStyleSheet) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Font) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Image) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, LinkPrefetch) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Manifest) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Audio) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Video) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Mock) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Raw) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Script) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, SVGDocument) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, TextTrack) \ - DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \ +#define DEFINE_RESOURCE_HISTOGRAM(prefix) \ + switch (factory.GetType()) { \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, CSSStyleSheet) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Font) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Image) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, LinkPrefetch) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Manifest) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Audio) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Video) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Mock) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Raw) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, Script) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, SVGDocument) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, TextTrack) \ + DEFINE_SINGLE_RESOURCE_HISTOGRAM(prefix, XSLStyleSheet) \ } ResourceLoadPriority TypeToPriority(ResourceType type) { @@ -985,8 +985,8 @@ resource_request.Url()); SCOPED_BLINK_UMA_HISTOGRAM_TIMER_THREAD_SAFE( "Blink.Fetch.RequestResourceTime"); - TRACE_EVENT1("blink", "ResourceFetcher::requestResource", "url", - params.Url().GetString().Utf8()); + TRACE_EVENT1("blink,blink.resource", "ResourceFetcher::requestResource", + "url", params.Url().GetString().Utf8()); // |resource_request|'s origin can be null here, corresponding to the "client" // value in the spec. In that case client's origin is used.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 4461bbd..ed7f199f 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2175,6 +2175,7 @@ { name: "WebAppLinkCapturing", origin_trial_feature_name: "WebAppLinkCapturing", + origin_trial_os: ["chromeos"], }, { name:"WebAppsLockScreen",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index ce22197d..f1a1127 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -6442,6 +6442,9 @@ # COOP access reporting: crbug.com/1090273 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html [ Timeout ] +# COOP top navigation: +crbug.com/1153648 external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html [ Failure ] + # Stale revalidation shouldn't be blocked: crbug.com/1079188 external/wpt/fetch/stale-while-revalidate/revalidate-not-blocked-by-csp.html [ Timeout ] @@ -7127,6 +7130,7 @@ crbug.com/476553 virtual/scroll-unification/scrollbars/hidden-scrollbars-invisible.html [ Pass Failure Timeout Crash ] crbug.com/476553 virtual/scroll-unification/fast/scrolling/overflow-scrollability.html [ Pass Failure Timeout Crash ] crbug.com/476553 virtual/scroll-unification/fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Pass Failure Timeout Crash ] +crbug.com/476553 virtual/scroll-unification/fast/events/drag-and-drop-autoscroll-mainframe.html [ Pass Failure Timeout Crash ] # Sheriff 2021-04-01 crbug.com/1167679 accessibility/aom-focus-action.html [ Pass Failure Timeout Crash ] @@ -7274,3 +7278,19 @@ crbug.com/1203345 [ Mac ] external/wpt/websockets/Send-unicode-data.any.html?wpt_flags=h2 [ Pass Failure Timeout ] crbug.com/1203345 [ Mac ] external/wpt/websockets/Send-unicode-data.any.worker.html?wpt_flags=h2 [ Pass Failure Timeout ] crbug.com/1203345 [ Mac ] external/wpt/websockets/Send-unpaired-surrogates.any.html?wpt_flags=h2 [ Pass Failure Timeout ] + +# Sheriff 2021-04-29 +crbug.com/1203963 [ Mac10.14 ] external/wpt/css/css-paint-api/idlharness.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/css/css-shapes/parsing/shape-outside-computed.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/css/css-sizing/aspect-ratio/grid-aspect-ratio-021.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/css/cssom-view/idlharness.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/fetch/api/idlharness.any.sharedworker.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/gamepad/idlharness.https.window.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/html/dom/idlharness.worker.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/input-device-capabilities/idlharness.window.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/periodic-background-sync/idlharness.https.any.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/storage/idlharness.https.any.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/storage/idlharness.https.any.worker.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/url/url-constructor.any.worker.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/webusb/idlharness.https.any.html [ Pass Failure Timeout ] +crbug.com/1203963 [ Mac10.14 ] external/wpt/xhr/idlharness.any.sharedworker.html [ Pass Failure Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/report-to-directive-allowed-in-meta.https.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/report-to-directive-allowed-in-meta.https.sub.html index 8b95b49..ffdebe0 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/report-to-directive-allowed-in-meta.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/report-to-directive-allowed-in-meta.https.sub.html
@@ -37,7 +37,7 @@ assert_equals(reports[0].body.sourceFile, document_url); assert_equals(reports[0].body.sample, ""); assert_equals(reports[0].body.disposition, "enforce"); - assert_equals(reports[0].body.statusCode, 0); + assert_equals(reports[0].body.statusCode, 200); assert_equals(reports[0].body.lineNumber, 54); assert_equals(reports[0].body.columnNumber, 0); });
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html index ba4df62..94f14d94 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html
@@ -36,7 +36,7 @@ assert_equals(reports[0].body.sourceFile, document_url); assert_equals(reports[0].body.sample, ""); assert_equals(reports[0].body.disposition, "enforce"); - assert_equals(reports[0].body.statusCode, 0); + assert_equals(reports[0].body.statusCode, 200); assert_equals(reports[0].body.lineNumber, 53); assert_equals(reports[0].body.columnNumber, 0); });
diff --git a/third_party/blink/web_tests/external/wpt/css/css-display/display-contents-slot-attach-whitespace.html b/third_party/blink/web_tests/external/wpt/css/css-display/display-contents-slot-attach-whitespace.html new file mode 100644 index 0000000..867f1f0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-display/display-contents-slot-attach-whitespace.html
@@ -0,0 +1,11 @@ +<!doctype html> +<title>Attaching shadow slot with assigned whitespace separated inline elements</title> +<link rel="help" href="https://drafts.csswg.org/css-display-3/#valdef-display-contents"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-rules"> +<link rel="match" href="../reference/pass_if_two_words.html"> +<p>There should be a space between "two" and "words" below.</p> +<div id="host"><span>two</span> <span>words</span></div> +<script> + host.offsetTop; + host.attachShadow({mode:"open"}).innerHTML = "<slot />"; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-001.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-001.html new file mode 100644 index 0000000..aec3b44 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-001.html
@@ -0,0 +1,52 @@ +<!DOCTYPE HTML> +<title>CSS Test (Transforms): position:sticky on an element in a preserve-3d scene</title> +<link rel="author" title="L. David Baron" href="https://dbaron.org/"> +<link rel="author" title="Google" href="http://www.google.com/"> +<link rel="help" href="https://www.w3.org/TR/css-transforms-2/#3d-transform-rendering"> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#stickypos-insets"> +<meta name="assert" content="3D scene intersection is done correctly in the presence of position: sticky."> +<link rel="match" href="3dtransform-and-position-sticky-ref.html"> + +<style> + +div, img { + height: 100px; + width: 100px; +} + +#outer { + transform-style: preserve-3d; + perspective: 300px; +} + +#middle { + transform-style: preserve-3d; + position: relative; +} + +#inner1 { + background: aqua; + /* isn't really sticky because of the containing block established by transform and by transform-style */ + position: sticky; + top: 0; + transform: translateZ(0); +} + +#inner2 { + background: olive; + position: absolute; + top: 0; + left: 0; + transform: rotateX(30deg); +} + +</style> + +<div id="outer"> + <div id="middle"> + <div id="inner1"> + </div> + <div id="inner2"> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-002.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-002.html new file mode 100644 index 0000000..bde8e27 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-002.html
@@ -0,0 +1,53 @@ +<!DOCTYPE HTML> +<title>CSS Test (Transforms): position:sticky on an element in a preserve-3d scene</title> +<link rel="author" title="L. David Baron" href="https://dbaron.org/"> +<link rel="author" title="Google" href="http://www.google.com/"> +<link rel="help" href="https://www.w3.org/TR/css-transforms-2/#3d-transform-rendering"> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#stickypos-insets"> +<meta name="assert" content="3D scene intersection is done correctly in the presence of position: sticky."> +<link rel="match" href="3dtransform-and-position-sticky-ref.html"> + +<style> + +div, img { + height: 100px; + width: 100px; +} + +#outer { + transform-style: preserve-3d; + perspective: 300px; +} + +#middle { + transform-style: preserve-3d; + position: relative; +} + +#inner1 { + background: aqua; + /* isn't really sticky because of the containing block established by transform and by transform-style */ + position: sticky; + top: 0; + transform: translateZ(0); + transform-style: preserve-3d; +} + +#inner2 { + background: olive; + position: absolute; + top: 0; + left: 0; + transform: rotateX(30deg); +} + +</style> + +<div id="outer"> + <div id="middle"> + <div id="inner1"> + </div> + <div id="inner2"> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-ref.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-ref.html new file mode 100644 index 0000000..a12ce72 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/3dtransform-and-position-sticky-ref.html
@@ -0,0 +1,39 @@ +<!DOCTYPE HTML> +<title>CSS Test Reference (Transforms): position:sticky on an element in a preserve-3d scene</title> +<link rel="author" title="L. David Baron" href="https://dbaron.org/"> +<link rel="author" title="Google" href="http://www.google.com/"> + +<style> + +div, img { + height: 100px; + width: 100px; +} + +#outer { + transform-style: preserve-3d; + perspective: 300px; +} + +#middle { + transform-style: preserve-3d; + position: relative; + background: aqua; +} + +#inner2 { + background: olive; + position: absolute; + top: 0; + left: 0; + transform: rotateX(30deg); +} + +</style> + +<div id="outer"> + <div id="middle"> + <div id="inner2"> + </div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/blob-popup.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/blob-popup.https.html index a26520d8..eda150e 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/blob-popup.https.html +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/blob-popup.https.html
@@ -14,7 +14,6 @@ assert_equals(data.name.length, 0); assert_false(data.opener); assert_true(furtherPopup.closed); - assert_equals(furtherPopup.document.URL, "about:blank"); }); const blobContents = `<script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https-expected.txt deleted file mode 100644 index 70a6a02..0000000 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -PASS Navigate to about:blank from iframe with opener.top COOP: |header(Cross-Origin-Opener-Policy,same-origin), iframe origin: https://web-platform.test:8444, openee COOP: |header(Cross-Origin-Opener-Policy,same-origin), openee origin: https://web-platform.test:8444. -PASS Navigate to about:blank from iframe with opener.top COOP: |header(Cross-Origin-Opener-Policy,same-origin-allow-popups), iframe origin: https://web-platform.test:8444, openee COOP: |header(Cross-Origin-Opener-Policy,same-origin-allow-popups), openee origin: https://web-platform.test:8444. -FAIL Navigate to about:blank from iframe with opener.top COOP: |header(Cross-Origin-Opener-Policy,same-origin-allow-popups), iframe origin: https://web-platform.test:8444, openee COOP: |header(Cross-Origin-Opener-Policy,unsafe-none), openee origin: https://www1.web-platform.test:8444. assert_equals: expected "true" but got "false" -PASS Navigate to about:blank from iframe with opener.top COOP: |header(Cross-Origin-Opener-Policy,same-origin-allow-popups), iframe origin: https://www1.web-platform.test:8444, openee COOP: |header(Cross-Origin-Opener-Policy,unsafe-none), openee origin: https://www1.web-platform.test:8444. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https.html index 77de5a0..4aa39e3 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https.html +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-to-aboutblank.https.html
@@ -30,6 +30,10 @@ const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN; const coop_same_origin_header = '|header(Cross-Origin-Opener-Policy,same-origin)'; +const coep_require_corp_header = + '|header(Cross-Origin-Embedder-Policy,require-corp)'; +const coop_same_origin_plus_coep_header = + coop_same_origin_header + coep_require_corp_header; const coop_same_origin_allow_popups_header = '|header(Cross-Origin-Opener-Policy,same-origin-allow-popups)'; const coop_unsafe_none_header = @@ -40,6 +44,7 @@ iframe_origin, openee_COOP_header, openee_origin, + iframe_header, expect_openee_closed ){ return promise_test(async t => { @@ -52,7 +57,7 @@ `&uuid=${opener_token}`; const openee_url = openee_origin + executor_path + openee_COOP_header + `&uuid=${openee_token}`; - const iframe_url = iframe_origin + executor_path + `&uuid=${iframe_token}`; + const iframe_url = iframe_origin + executor_path + iframe_header + `&uuid=${iframe_token}`; t.add_cleanup(() => { send(openee_token, "window.close()"); @@ -104,7 +109,6 @@ `); assert_equals(await receive(this_window_token), "about:blank loaded"); - // 6. Retrieve and check the results. send(iframe_token, ` send("${this_window_token}", window.openee.closed); @@ -126,6 +130,19 @@ same_origin, coop_same_origin_header, same_origin, + "", + false +); + +// Since all navigations of openee are within same-origin pages with the +// same COOP value, there are no browsing context group switches. +// Test with both COOP and COEP. +navigateToAboutBlankTest( + coop_same_origin_plus_coep_header, + same_origin, + coop_same_origin_plus_coep_header, + same_origin, + coep_require_corp_header, false ); @@ -136,6 +153,7 @@ same_origin, coop_same_origin_allow_popups_header, same_origin, + "", false ); @@ -151,6 +169,7 @@ same_origin, coop_unsafe_none_header, cross_origin, + "", true ); @@ -169,6 +188,7 @@ cross_origin, coop_unsafe_none_header, cross_origin, + "", false ); </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https-expected.txt deleted file mode 100644 index ccad4dea..0000000 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Navigate top to about:blank from iframe with opener COOP: |header(Cross-Origin-Opener-Policy,same-origin), iframe origin: https://web-platform.test:8444 -FAIL Navigate top to about:blank from iframe with opener COOP: |header(Cross-Origin-Opener-Policy,same-origin), iframe origin: https://www1.web-platform.test:8444 assert_equals: expected "true" but got "false" -PASS Navigate top to about:blank from iframe with opener COOP: |header(Cross-Origin-Opener-Policy,same-origin-allow-popups), iframe origin: https://www1.web-platform.test:8444 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html index 1dd65fc..c4bbe150 100644 --- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html +++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/navigate-top-to-aboutblank.https.html
@@ -6,6 +6,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="/common/get-host-info.sub.js"></script> <script src="/common/utils.js"></script> +<script src="/html/cross-origin-opener-policy/resources/common.js"></script> <script src="/html/cross-origin-opener-policy/resources/dispatcher.js"></script> @@ -64,12 +65,9 @@ let opener_window_proxy = window.open(opener_url, opener_token); // 2. Create the iframe. - // The allow-top-navigation sandbox flags disables the intervention - // requiring a user gesture to navigate top. send(opener_token, ` iframe = document.createElement('iframe'); iframe.src = "${iframe_url}"; - iframe.sandbox = "allow-top-navigation allow-scripts"; document.body.appendChild(iframe); `); @@ -84,10 +82,19 @@ send(openee_token, `send("${this_window_token}", "Ack");`); assert_equals(await receive(this_window_token), "Ack"); - // 5. The iframe navigates its top-level document to about:blank. - send(iframe_token, ` - top.location.href = "about:blank"; - `); + // 5. The iframe navigates its top-level document to about:blank. It needs + // to receive a user action as it may be cross-origin and it navigates top + // to a cross-origin document. + // https://github.com/WICG/interventions/issues/16 + send(iframe_token, addScriptAndTriggerOnload( + "/resources/testdriver.js", + `${addScriptAndTriggerOnload("/resources/testdriver-vendor.js", + ` + test_driver.bless('navigate top to about:blank', () => { + open("about:blank", "_top"); + }); + `)} + `)); // 6. Ensure opener is fully loaded and then retrieve the results. send(openee_token, `
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-flex-expected.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-flex-ref.html similarity index 96% rename from third_party/blink/web_tests/html/details_summary/summary-display-flex-expected.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-flex-ref.html index 69301654..083dba87 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-flex-expected.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-flex-ref.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> <style> .flex-container { background: #333;
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-flex.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-flex.html similarity index 84% rename from third_party/blink/web_tests/html/details_summary/summary-display-flex.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-flex.html index 328715b..c495516 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-flex.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-flex.html
@@ -1,4 +1,10 @@ <!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: summary with 'display: flex'</title> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> +<link rel="match" href="summary-display-flex-ref.html"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements"> +<meta name="assert" content="Checks that styling a <summary> with 'display: flex' makes it a flex container."> <style> .flex-container { background: #333;
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-grid-expected.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-grid-ref.html similarity index 94% rename from third_party/blink/web_tests/html/details_summary/summary-display-grid-expected.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-grid-ref.html index b37e2254..a7c4c4c0 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-grid-expected.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-grid-ref.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> <style> .grid-container { display: grid;
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-grid.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-grid.html similarity index 75% rename from third_party/blink/web_tests/html/details_summary/summary-display-grid.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-grid.html index 94d2527..934b4ff 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-grid.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-grid.html
@@ -1,4 +1,10 @@ <!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: summary with 'display: grid'</title> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> +<link rel="match" href="summary-display-grid-ref.html"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements"> +<meta name="assert" content="Checks that styling a <summary> with 'display: grid' makes it a grid container."> <style> .grid-container { display: grid;
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-inline-flex-expected.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-flex-ref.html similarity index 96% rename from third_party/blink/web_tests/html/details_summary/summary-display-inline-flex-expected.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-flex-ref.html index 1c5be6f..25a9b315f 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-inline-flex-expected.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-flex-ref.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> <style> .flex-container { background: #333;
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-inline-flex.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-flex.html similarity index 84% rename from third_party/blink/web_tests/html/details_summary/summary-display-inline-flex.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-flex.html index da4d31d..2c935e4 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-inline-flex.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-flex.html
@@ -1,4 +1,10 @@ <!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: summary with 'display: inline-flex'</title> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> +<link rel="match" href="summary-display-inline-flex-ref.html"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements"> +<meta name="assert" content="Checks that styling a <summary> with 'display: inline-flex' makes it a flex container."> <style> .flex-container { background: #333;
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-inline-grid-expected.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-grid-ref.html similarity index 94% rename from third_party/blink/web_tests/html/details_summary/summary-display-inline-grid-expected.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-grid-ref.html index fc7add0..f6a8b04 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-inline-grid-expected.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-grid-ref.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> <style> .grid-container { display: inline-grid;
diff --git a/third_party/blink/web_tests/html/details_summary/summary-display-inline-grid.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-grid.html similarity index 74% rename from third_party/blink/web_tests/html/details_summary/summary-display-inline-grid.html rename to third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-grid.html index 11d32be..3578f05 100644 --- a/third_party/blink/web_tests/html/details_summary/summary-display-inline-grid.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-inline-grid.html
@@ -1,4 +1,10 @@ <!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Test: summary with 'display: inline-grid'</title> +<link rel="author" title="Xing Xu" href="mailto:xing.xu@intel.com"> +<link rel="match" href="summary-display-inline-grid-ref.html"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements"> +<meta name="assert" content="Checks that styling a <summary> with 'display: inline-grid' makes it a grid container."> <style> .grid-container { display: inline-grid;
diff --git a/third_party/blink/web_tests/external/wpt/reporting/path-absolute-endpoint.https.sub.html b/third_party/blink/web_tests/external/wpt/reporting/path-absolute-endpoint.https.sub.html index 6abc5ee5..ecd44c35 100644 --- a/third_party/blink/web_tests/external/wpt/reporting/path-absolute-endpoint.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/reporting/path-absolute-endpoint.https.sub.html
@@ -37,7 +37,7 @@ assert_equals(reports[0].body.sourceFile, location.href); assert_equals(reports[0].body.sample, ""); assert_equals(reports[0].body.disposition, "enforce"); - assert_equals(reports[0].body.statusCode, 0); + assert_equals(reports[0].body.statusCode, 200); assert_equals(reports[0].body.lineNumber, 61); assert_equals(reports[0].body.columnNumber, 0); });
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index d8737e4e..12adf3a 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -6799,6 +6799,9 @@ <int value="46" label="Foreground cache limit"/> <int value="47" label="Browsing instance not swapped"/> <int value="48" label="Disabled for delegate"/> + <int value="49" + label="BFCache-Opt-In header not present, or does not include `unload` + token, and an experimental config which requires it is active"/> </enum> <enum name="BackForwardCacheReloadsAfterHistoryNavigation"> @@ -38285,6 +38288,27 @@ label="Search canceled because the search backend isn't available"/> </enum> +<enum name="HermesResponseStatus"> + <summary> + Statuses returned by Hermes, the Chrome OS daemon process which configures + eSIM profiles a device's hardware. + </summary> + <int value="0" label="Success"/> + <int value="1" label="Error: Already disabled"/> + <int value="2" label="Error: Already enabled"/> + <int value="3" label="Error: Invalid activation code"/> + <int value="4" label="Error: Invalid ICCID"/> + <int value="5" label="Error: Invalid parameter"/> + <int value="6" label="Error: Need confirmation code"/> + <int value="7" label="Error: Send notification failure"/> + <int value="8" label="Error: Test profile in prod"/> + <int value="9" label="Error: Unknown"/> + <int value="10" label="Error: Unsupported"/> + <int value="11" label="Error: Wrong state"/> + <int value="12" label="Error: Invalid response"/> + <int value="13" label="Error: No response"/> +</enum> + <enum name="HIDContinueScenarioType"> <summary>Possible detected devices combination on leaving dialog</summary> <int value="0" label="Pointing device only detected."/> @@ -45813,6 +45837,7 @@ <int value="-793383355" label="StrictOriginIsolation:enabled"/> <int value="-792785226" label="TemporaryUnexpireFlagsM78:disabled"/> <int value="-792079435" label="EnableAppsGridGapFeature:disabled"/> + <int value="-791778534" label="LauncherQueryHighlighting:enabled"/> <int value="-790900615" label="NtpShoppingTasksModule:disabled"/> <int value="-790036192" label="overscroll-start-threshold"/> <int value="-787969387" label="HTTPSServerPreviewsUsingURLLoader:enabled"/> @@ -47012,6 +47037,7 @@ label="AutofillImportNonFocusableCreditCardForms:enabled"/> <int value="313253630" label="AutofillRefreshStyleAndroid:enabled"/> <int value="313303258" label="WebPaymentsModifiers:disabled"/> + <int value="315602034" label="LauncherQueryHighlighting:disabled"/> <int value="316182183" label="MediaDocumentDownloadButton:disabled"/> <int value="317432596" label="DisplayLocking:disabled"/> <int value="317889969" label="AutofillAddressProfileSavePrompt:disabled"/>
diff --git a/tools/metrics/histograms/histograms_xml/apps/histograms.xml b/tools/metrics/histograms/histograms_xml/apps/histograms.xml index e226a09..26f0820 100644 --- a/tools/metrics/histograms/histograms_xml/apps/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/apps/histograms.xml
@@ -1355,6 +1355,31 @@ </summary> </histogram> +<histogram name="Apps.AppsCount.{AppType}" units="Apps" + expires_after="2021-10-28"> + <owner>dominickn@chromium.org</owner> + <owner>nancylingwang@chromium.org</owner> + <summary> + The total number of installed {AppType} for each app type in Chrome OS. This + is logged when more than 24 hours pass after last log, or during the system + startup phase if more than 24 hours passed after last log. This histogram is + capped at 1000; values above this go into the overflow bucket. + </summary> + <token key="AppType"> + <variant name="Arc" summary="Android apps"/> + <variant name="Borealis" summary="Borealis apps"/> + <variant name="BuiltIn" summary="BuiltIn apps"/> + <variant name="ChromeApp" summary="Chrome apps"/> + <variant name="Crostini" summary="Crostini apps"/> + <variant name="MacOs" summary="MacOs apps"/> + <variant name="PluginVm" summary="Plugin VM app"/> + <variant name="RemoteApp" summary="Remote apps"/> + <variant name="StandaloneBrowser" summary="Standalone browser"/> + <variant name="SystemWebApp" summary="System web apps"/> + <variant name="WebApp" summary="Web apps"/> + </token> +</histogram> + <histogram name="Apps.AppShimErrorVersion" units="units" expires_after="M78"> <owner>jackhou@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/ash/histograms.xml b/tools/metrics/histograms/histograms_xml/ash/histograms.xml index 9224abb3..749c9603 100644 --- a/tools/metrics/histograms/histograms_xml/ash/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/ash/histograms.xml
@@ -611,6 +611,8 @@ <token key="NudgeType"> <variant name="NewFeatureBadge" summary="new feature badge"/> <variant name="OnboardingNudge" summary="onboarding nudge"/> + <variant name="ScreenshotNotificationNudge" + summary="screenshot notification nudge"/> <variant name="ZeroStateNudge" summary="zero state nudge"/> </token> </histogram> @@ -627,6 +629,8 @@ <token key="NudgeType"> <variant name="NewFeatureBadge" summary="new feature badge"/> <variant name="OnboardingNudge" summary="onboarding nudge"/> + <variant name="ScreenshotNotificationNudge" + summary="screenshot notification nudge"/> <variant name="ZeroStateNudge" summary="zero state nudge"/> </token> <token key="Action">
diff --git a/tools/metrics/histograms/histograms_xml/network/histograms.xml b/tools/metrics/histograms/histograms_xml/network/histograms.xml index 7ffa43c..60e8892 100644 --- a/tools/metrics/histograms/histograms_xml/network/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/network/histograms.xml
@@ -130,6 +130,39 @@ </summary> </histogram> +<histogram name="Network.Cellular.ESim.InstallPendingProfile.Result" + enum="HermesResponseStatus" expires_after="2022-03-01"> + <owner>azeemarshad@chromium.org</owner> + <owner>khorimoto@chromium.org</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Tracks the success rate of installing a "pending" eSIM profile + found via SM-DS. SM-DS provides all profiles which a carrier has associated + with a device's EID; once this occurs, the user has the chance to install + one of these pending profiles via the UI. The installation process involves + making a network request to the cellular carrier and downloading a profile + to the device. + + Emitted once the operation completes. + </summary> +</histogram> + +<histogram name="Network.Cellular.ESim.InstallViaQrCode.Result" + enum="HermesResponseStatus" expires_after="2022-03-01"> + <owner>azeemarshad@chromium.org</owner> + <owner>khorimoto@chromium.org</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Tracks the success rate of installing an eSIM profile via a QR code. During + this process, the user can either scan a QR code by using the device's + webcam or can enter the QR code's decoded contents into a text field + manually. Once this occurs, the device contacts the cellular carrier and + downloads a profile to the device. + + Emitted once the operation completes. + </summary> +</histogram> + <histogram name="Network.Cellular.ESim.ProfileDiscovery.Latency" units="ms" expires_after="2022-03-01"> <owner>azeemarshad@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index ccec1c0f7..bfd35a6 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,16 +1,16 @@ { "trace_processor_shell": { "win": { - "hash": "420daabcb280c424a32d12a86da6dfb0bee3040f", - "remote_path": "perfetto_binaries/trace_processor_shell/win/eabc2f4aab92456471eaea253c0d6d9cc2bb5b3b/trace_processor_shell.exe" + "hash": "4b81d55c6b8006ceb165784d1105c8ac1deba9ef", + "remote_path": "perfetto_binaries/trace_processor_shell/win/ea617741a1bcc0951495c6f8fcee219e1fc563d0/trace_processor_shell.exe" }, "mac": { - "hash": "ae04e80011f5918c2c3ec673c3c553d8a4698f18", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/e01ad9a6a83bd8df88dc01bc86fd0ec9080296c7/trace_processor_shell" + "hash": "e5775e335deac073cfa3ddfb0d86952f9852801f", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/ea617741a1bcc0951495c6f8fcee219e1fc563d0/trace_processor_shell" }, "linux": { - "hash": "cbb9056ab2d4559ed050b53b175b17370db1429c", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/ee1e7359d1d243b3f4059a659c2bb0684c2b3fd0/trace_processor_shell" + "hash": "1b561da8a652ea547a1e9373542a1a88af9d4de4", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/ea617741a1bcc0951495c6f8fcee219e1fc563d0/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/core/shard_maps/android-pixel2-perf-fyi_map.json b/tools/perf/core/shard_maps/android-pixel2-perf-fyi_map.json index d496112..3836755d9 100644 --- a/tools/perf/core/shard_maps/android-pixel2-perf-fyi_map.json +++ b/tools/perf/core/shard_maps/android-pixel2-perf-fyi_map.json
@@ -4,6 +4,9 @@ "system_health.common_mobile": { "abridged": false }, + "system_health.memory_mobile": { + "abridged": false + }, "jetstream": { "abridged": false }, @@ -11,7 +14,20 @@ "abridged": false }, "rendering.mobile": { - "end": 176, + "sections": [ + { + "begin": 0, + "end": 32 + }, + { + "begin": 46, + "end": 47 + }, + { + "begin": 86, + "end": 87 + } + ], "abridged": false }, "speedometer2": { @@ -24,19 +40,18 @@ "system_health.common_mobile": { "abridged": false }, + "system_health.memory_mobile": { + "abridged": false + }, "rendering.mobile": { "sections": [ { - "begin": 46, - "end": 47 + "begin": 32, + "end": 67 }, { "begin": 86, "end": 87 - }, - { - "begin": 176, - "end": 347 } ], "abridged": false @@ -51,6 +66,29 @@ "system_health.common_mobile": { "abridged": false }, + "system_health.memory_mobile": { + "abridged": false + }, + "rendering.mobile": { + "sections": [ + { + "begin": 46, + "end": 47 + }, + { + "begin": 67, + "end": 103 + } + ], + "abridged": false + }, + "speedometer2": { + "abridged": false + } + } + }, + "3": { + "benchmarks": { "rendering.mobile": { "sections": [ { @@ -62,7 +100,7 @@ "end": 87 }, { - "begin": 347, + "begin": 103, "end": 419 } ], @@ -74,48 +112,23 @@ "startup.mobile": { "abridged": false }, - "system_health.memory_mobile": { - "end": 25, - "abridged": false - } - } - }, - "3": { - "benchmarks": { - "system_health.memory_mobile": { - "begin": 25, - "abridged": false - }, "system_health.scroll_jank_mobile": { "abridged": false }, "v8.browsing_mobile": { "abridged": false - }, - "rendering.mobile": { - "sections": [ - { - "begin": 46, - "end": 47 - }, - { - "begin": 86, - "end": 87 - } - ], - "abridged": false } } }, "extra_infos": { - "num_stories": 775, - "predicted_min_shard_time": 8180.0, - "predicted_min_shard_index": 2, - "predicted_max_shard_time": 8370.0, + "num_stories": 925, + "predicted_min_shard_time": 12396.0, + "predicted_min_shard_index": 0, + "predicted_max_shard_time": 12465.0, "predicted_max_shard_index": 3, - "shard #0": 8286.0, - "shard #1": 8294.0, - "shard #2": 8180.0, - "shard #3": 8370.0 + "shard #0": 12396.0, + "shard #1": 12416.0, + "shard #2": 12418.0, + "shard #3": 12465.0 } } \ No newline at end of file
diff --git a/tools/perf/cross_device_test_config.py b/tools/perf/cross_device_test_config.py index 0ad6419..49bf646 100644 --- a/tools/perf/cross_device_test_config.py +++ b/tools/perf/cross_device_test_config.py
@@ -29,6 +29,7 @@ 'canvas_animation_no_clear': 4 }, 'system_health.common_mobile': 3, + 'system_health.memory_mobile': 3, }, 'android-pixel2-perf': { 'system_health.common_mobile': {
diff --git a/tools/perf/page_sets/rendering/motionmark.py b/tools/perf/page_sets/rendering/motionmark.py index ac39b626..5eae753 100644 --- a/tools/perf/page_sets/rendering/motionmark.py +++ b/tools/perf/page_sets/rendering/motionmark.py
@@ -23,6 +23,9 @@ shared_page_state_class=shared_page_state_class, name_suffix=name_suffix, extra_browser_args=['--report-silk-details', '--disable-top-sites']) + self._score = 0 + self._scoreLowerBound = 0 + self._scoreUpperBound = 0 def RunNavigateSteps(self, action_runner): action_runner.Navigate(self.url) @@ -32,12 +35,33 @@ def RunPageInteractions(self, action_runner): action_runner.Wait(3) with action_runner.CreateInteraction('Filter'): - action_runner.Wait(5) + action_runner.Wait(20) + action_runner.WaitForJavaScriptCondition( + 'window.benchmarkRunnerClient.results._results') + [score, lower, upper] = action_runner.EvaluateJavaScript( + '''[window.benchmarkRunnerClient.results.score, + window.benchmarkRunnerClient.results.scoreLowerBound, + window.benchmarkRunnerClient.results.scoreUpperBound]''') + self._score = score + self._scoreLowerBound = lower + self._scoreUpperBound = upper # Navigate to about:blank to stop rendering frames and let the device # cool down while the trace data for the story is processed. action_runner.Navigate('about:blank') + @property + def score(self): + return self._score + + @property + def scoreLowerBound(self): + return self._scoreLowerBound + + @property + def scoreUpperBound(self): + return self._scoreUpperBound + @classmethod def GetUrl(cls, suite_name, test_name, complexity): # Strip unwanted characters from names
diff --git a/tools/perf/page_sets/rendering/rendering_shared_state.py b/tools/perf/page_sets/rendering/rendering_shared_state.py index b642290..48b8a94 100644 --- a/tools/perf/page_sets/rendering/rendering_shared_state.py +++ b/tools/perf/page_sets/rendering/rendering_shared_state.py
@@ -59,6 +59,15 @@ self._EnsureScreenOn() def DidRunStory(self, results): + if (self.current_page.TAGS + and story_tags.MOTIONMARK in self.current_page.TAGS): + unit = 'unitless_biggerIsBetter' + results.AddMeasurement('motionmark', unit, [self.current_page.score]) + results.AddMeasurement('motionmarkLower', unit, + [self.current_page.scoreLowerBound]) + results.AddMeasurement('motionmarkUpper', unit, + [self.current_page.scoreUpperBound]) + if (self.current_page.TAGS and story_tags.KEY_IDLE_POWER in self.current_page.TAGS): try:
diff --git a/ui/gl/gl_surface_egl_x11.cc b/ui/gl/gl_surface_egl_x11.cc index 8b48842..d85d999 100644 --- a/ui/gl/gl_surface_egl_x11.cc +++ b/ui/gl/gl_surface_egl_x11.cc
@@ -4,7 +4,7 @@ #include "ui/gl/gl_surface_egl_x11.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" #include "ui/base/x/x11_util.h" #include "ui/base/x/x11_xrandr_interval_only_vsync_provider.h" #include "ui/gfx/x/xproto.h"
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc index f593877..8c612b66 100644 --- a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc +++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
@@ -89,7 +89,7 @@ bool status = drm_->plane_manager()->Commit(std::move(commit_request), DRM_MODE_ATOMIC_ALLOW_MODESET); - for (const ui::CrtcCommitRequest& crtc_request : commit_request) + for (const ui::CrtcCommitRequest& crtc_request : request_for_update) controller->UpdateState(crtc_request); return status;
diff --git a/ui/ozone/platform/drm/host/drm_cursor.cc b/ui/ozone/platform/drm/host/drm_cursor.cc index 93c99fdf..d0fded5 100644 --- a/ui/ozone/platform/drm/host/drm_cursor.cc +++ b/ui/ozone/platform/drm/host/drm_cursor.cc
@@ -72,7 +72,7 @@ } gfx::Point DrmCursor::GetBitmapLocationLocked() { - return gfx::ToFlooredPoint(location_) - bitmap_->hotspot().OffsetFromOrigin(); + return gfx::ToFlooredPoint(location_) - cursor_->hotspot().OffsetFromOrigin(); } void DrmCursor::SetCursor(gfx::AcceleratedWidget window, @@ -84,10 +84,10 @@ base::AutoLock lock(lock_); - if (window_ != window || bitmap_ == platform_cursor) + if (window_ != window || cursor_ == platform_cursor) return; - bitmap_ = platform_cursor; + cursor_ = platform_cursor; SendCursorShowLocked(); } @@ -209,7 +209,7 @@ bool DrmCursor::IsCursorVisible() { base::AutoLock lock(lock_); - return bitmap_ != nullptr && bitmap_->type() != CursorType::kNone; + return cursor_ != nullptr && cursor_->type() != CursorType::kNone; } gfx::PointF DrmCursor::GetLocation() { @@ -242,13 +242,13 @@ } void DrmCursor::SendCursorShowLocked() { - if (!bitmap_ || bitmap_->type() == CursorType::kNone) { + if (!cursor_ || cursor_->type() == CursorType::kNone) { SendCursorHideLocked(); return; } - CursorSetLockTested(window_, bitmap_->bitmaps(), GetBitmapLocationLocked(), - bitmap_->frame_delay()); + CursorSetLockTested(window_, cursor_->bitmaps(), GetBitmapLocationLocked(), + cursor_->frame_delay()); } void DrmCursor::SendCursorHideLocked() { @@ -257,7 +257,7 @@ } void DrmCursor::SendCursorMoveLocked() { - if (!bitmap_ || bitmap_->type() == CursorType::kNone) + if (!cursor_ || cursor_->type() == CursorType::kNone) return; MoveLockTested(window_, GetBitmapLocationLocked());
diff --git a/ui/ozone/platform/drm/host/drm_cursor.h b/ui/ozone/platform/drm/host/drm_cursor.h index a8e91bcb..3562826 100644 --- a/ui/ozone/platform/drm/host/drm_cursor.h +++ b/ui/ozone/platform/drm/host/drm_cursor.h
@@ -102,7 +102,7 @@ gfx::Point GetBitmapLocationLocked(); // The current cursor bitmap (immutable). - scoped_refptr<BitmapCursorOzone> bitmap_; + scoped_refptr<BitmapCursorOzone> cursor_; // The window under the cursor. gfx::AcceleratedWidget window_;
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index 9ab376b..dfbd68f 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -170,8 +170,8 @@ // Whenever the window gets the pointer focus back, the cursor shape must be // updated. Otherwise, it is invalidated upon wl_pointer::leave and is not // restored by the Wayland compositor. - if (has_pointer_focus_ && bitmap_) - UpdateCursorShape(bitmap_); + if (has_pointer_focus_ && cursor_) + UpdateCursorShape(cursor_); } bool WaylandWindow::StartDrag(const ui::OSExchangeData& data, @@ -315,7 +315,7 @@ void WaylandWindow::SetCursor(scoped_refptr<PlatformCursor> platform_cursor) { DCHECK(platform_cursor); - if (bitmap_ == platform_cursor) + if (cursor_ == platform_cursor) return; UpdateCursorShape(BitmapCursorOzone::FromPlatformCursor(platform_cursor)); @@ -886,7 +886,7 @@ } // The new cursor needs to be stored last to avoid deleting the old cursor // while it's still in use. - bitmap_ = cursor; + cursor_ = cursor; } } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index c87c288..b375127 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -296,7 +296,7 @@ std::list<WaylandSubsurface*> subsurface_stack_below_; // The current cursor bitmap (immutable). - scoped_refptr<BitmapCursorOzone> bitmap_; + scoped_refptr<BitmapCursorOzone> cursor_; // Current bounds of the platform window. This is either initialized, or the // requested size by the Wayland compositor. When this is set in SetBounds(),
diff --git a/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc b/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc index bab2f73..f1ccb840 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
@@ -372,11 +372,8 @@ // Update current cursor position, so it can be retrieved later on through // |Screen::GetCursorScreenPoint| API. - int32_t scale = dragged_window_->buffer_scale(); - gfx::PointF scaled_location = - gfx::ScalePoint(event->location_f(), scale, scale); connection_->wayland_cursor_position()->OnCursorPositionChanged( - gfx::ToFlooredPoint(scaled_location)); + event->location()); // Notify listeners about window bounds change (i.e: re-positioning) event. // To do so, set the new bounds as per the motion event location and the drag
diff --git a/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc index b145ebef..71ed0e52 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
@@ -726,6 +726,73 @@ EXPECT_EQ(State::kIdle, drag_controller()->state()); } +// Test that cursor position is using DIP coordinates and is updated correctly +// on DragMotion event. +TEST_P(WaylandWindowDragControllerTest, CursorPositionIsUpdatedOnMotion) { + // Creating an output with scale 1. + wl::TestOutput* output1 = server_.CreateAndInitializeOutput(); + output1->SetRect(gfx::Rect(0, 0, 1920, 1080)); + output1->SetScale(1); + Sync(); + + // Creating an output with scale 2. + wl::TestOutput* output2 = server_.CreateAndInitializeOutput(); + output2->SetRect(gfx::Rect(0, 0, 1920, 1080)); + output2->SetScale(2); + Sync(); + + std::vector<wl::TestOutput*> outputs = {output1, output2}; + + // Start a window drag session. + SendPointerEnter(window_.get(), &delegate_); + SendPointerPress(window_.get(), &delegate_, BTN_LEFT); + SendPointerMotion(window_.get(), &delegate_, {10, 10}); + EXPECT_EQ(gfx::Point(10, 10), screen_->GetCursorScreenPoint()); + + auto* wayland_extension = GetWaylandExtension(*window_); + wayland_extension->StartWindowDraggingSessionIfNeeded(); + EXPECT_EQ(State::kAttached, drag_controller()->state()); + + auto* move_loop_handler = GetWmMoveLoopHandler(*window_); + ASSERT_TRUE(move_loop_handler); + auto test = [](WaylandWindowDragControllerTest* self, WaylandScreen* screen, + wl::TestWaylandServerThread* server, WaylandWindow* window, + std::vector<wl::TestOutput*>* outputs, + WmMoveLoopHandler* move_loop_handler) { + for (auto* output : *outputs) { + // Resetting cursor to the initial position. + self->SendDndMotion({10, 10}); + self->Sync(); + EXPECT_EQ(gfx::Point(10, 10), screen->GetCursorScreenPoint()); + + // Send the window to |output|. + wl::MockSurface* surface = server->GetObject<wl::MockSurface>( + window->root_surface()->GetSurfaceId()); + ASSERT_TRUE(surface); + wl_surface_send_enter(surface->resource(), output->resource()); + self->Sync(); + EXPECT_EQ(output->GetScale(), window->buffer_scale()); + + self->SendDndMotion({20, 20}); + self->Sync(); + + // GetCursorScreenPoint should return the same value regardless of buffer + // scale. + EXPECT_EQ(gfx::Point(20, 20), screen->GetCursorScreenPoint()); + wl_surface_send_leave(surface->resource(), output->resource()); + } + + move_loop_handler->EndMoveLoop(); + }; + + ScheduleTestTask(base::BindOnce( + test, base::Unretained(this), base::Unretained(screen_.get()), + base::Unretained(&server_), base::Unretained(window_.get()), + base::Unretained(&outputs), base::Unretained(move_loop_handler))); + EXPECT_CALL(delegate(), DispatchEvent(_)).Times(::testing::AtLeast(1)); + move_loop_handler->RunMoveLoop({}); +} + INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest, WaylandWindowDragControllerTest, ::testing::Values(kXdgShellStable));
diff --git a/ui/ozone/platform/wayland/test/test_output.h b/ui/ozone/platform/wayland/test/test_output.h index a44c0157..f7a5033e 100644 --- a/ui/ozone/platform/wayland/test/test_output.h +++ b/ui/ozone/platform/wayland/test/test_output.h
@@ -22,6 +22,7 @@ const gfx::Rect GetRect() { return rect_; } void SetRect(const gfx::Rect& rect); + int32_t GetScale() const { return scale_; } void SetScale(int32_t factor); void Flush();
diff --git a/ui/views/accessibility/widget_ax_tree_id_map.cc b/ui/views/accessibility/widget_ax_tree_id_map.cc index e62dfa3..617b771 100644 --- a/ui/views/accessibility/widget_ax_tree_id_map.cc +++ b/ui/views/accessibility/widget_ax_tree_id_map.cc
@@ -4,7 +4,7 @@ #include "ui/views/accessibility/widget_ax_tree_id_map.h" -#include "base/stl_util.h" +#include "base/containers/contains.h" namespace views {
diff --git a/ui/views/controls/views_text_services_context_menu_base.cc b/ui/views/controls/views_text_services_context_menu_base.cc index ba7f725a..62fac34 100644 --- a/ui/views/controls/views_text_services_context_menu_base.cc +++ b/ui/views/controls/views_text_services_context_menu_base.cc
@@ -54,8 +54,11 @@ *accelerator = ui::Accelerator(ui::VKEY_SPACE, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN); return true; +#elif BUILDFLAG(IS_CHROMEOS_ASH) + *accelerator = ui::Accelerator(ui::VKEY_SPACE, + ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN); + return true; #else - // TODO(crbug.com/887660): Add accelerator key for Chrome OS. return false; #endif }
diff --git a/ui/views/corewm/tooltip_controller.cc b/ui/views/corewm/tooltip_controller.cc index 1d61935f..da39df7 100644 --- a/ui/views/corewm/tooltip_controller.cc +++ b/ui/views/corewm/tooltip_controller.cc
@@ -192,8 +192,22 @@ return; } switch (event->type()) { - case ui::ET_MOUSE_CAPTURE_CHANGED: case ui::ET_MOUSE_EXITED: + // TODO(bebeaudr): Keyboard-triggered tooltips that show up right where + // the cursor currently is are hidden as soon as they show up because of + // this event. Handle this case differently to fix the issue. + // + // Whenever a tooltip is closed, an ET_MOUSE_EXITED event is fired, even + // if the cursor is not in the tooltip's window. Make sure that these + // mouse exited events don't interfere with keyboard triggered tooltips by + // returning early. + if (state_manager_->tooltip_parent_window() && + state_manager_->tooltip_trigger() == TooltipTrigger::kKeyboard) { + return; + } + SetObservedWindow(nullptr); + break; + case ui::ET_MOUSE_CAPTURE_CHANGED: case ui::ET_MOUSE_MOVED: case ui::ET_MOUSE_DRAGGED: { last_mouse_loc_ = event->location();
diff --git a/ui/views/corewm/tooltip_controller_unittest.cc b/ui/views/corewm/tooltip_controller_unittest.cc index a28a232..e014678f 100644 --- a/ui/views/corewm/tooltip_controller_unittest.cc +++ b/ui/views/corewm/tooltip_controller_unittest.cc
@@ -684,6 +684,52 @@ EXPECT_EQ(nullptr, helper_->GetTooltipParentWindow()); } +TEST_F(TooltipControllerTest, + KeyboardTriggeredTooltipStaysVisibleOnMouseExitedEvent) { + std::u16string expected_tooltip = u"Tooltip Text"; + + wm::SetTooltipText(GetWindow(), &expected_tooltip); + view_->set_tooltip_text(expected_tooltip); + EXPECT_EQ(std::u16string(), helper_->GetTooltipText()); + EXPECT_EQ(nullptr, helper_->GetTooltipParentWindow()); + + // For this test to execute properly, make sure that the cursor location is + // somewhere out of the |view_|, different than (0, 0). This shouldn't show + // the tooltip. + gfx::Point off_view_point = view_->bounds().bottom_right(); + off_view_point.Offset(1, 1); + generator_->MoveMouseRelativeTo(widget_->GetNativeWindow(), off_view_point); + EXPECT_FALSE(helper_->IsTooltipVisible()); + + // Trigger the tooltip from the keyboard. + helper_->controller()->UpdateTooltipFromKeyboard( + view_->ConvertRectToWidget(view_->bounds()), GetWindow()); + + EXPECT_EQ(expected_tooltip, wm::GetTooltipText(GetWindow())); + EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); + EXPECT_EQ(GetWindow(), helper_->GetTooltipParentWindow()); + EXPECT_TRUE(helper_->IsTooltipVisible()); + EXPECT_EQ(helper_->state_manager()->tooltip_trigger(), + TooltipTrigger::kKeyboard); + + // Sending a mouse exited event shouldn't hide a keyboard triggered tooltip. + generator_->SendMouseExit(); + EXPECT_TRUE(helper_->IsTooltipVisible()); + + helper_->HideAndReset(); + expected_tooltip = u"Tooltip Text 2"; + EXPECT_FALSE(helper_->IsTooltipVisible()); + + // However, a cursor triggered tooltip should still be hidden by a mouse + // exited event. + generator_->MoveMouseRelativeTo(widget_->GetNativeWindow(), + view_->bounds().CenterPoint()); + EXPECT_TRUE(helper_->IsTooltipVisible()); + + generator_->SendMouseExit(); + EXPECT_FALSE(helper_->IsTooltipVisible()); +} + namespace { // Returns the index of |window| in its parent's children.
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index 8bb2131..4952fbd 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -929,6 +929,9 @@ void Widget::ThemeChanged() { root_view_->ThemeChanged(); + + for (WidgetObserver& observer : observers_) + observer.OnWidgetThemeChanged(this); } void Widget::DeviceScaleFactorChanged(float old_device_scale_factor,
diff --git a/ui/views/widget/widget_observer.h b/ui/views/widget/widget_observer.h index 51adacf..4050dd33 100644 --- a/ui/views/widget/widget_observer.h +++ b/ui/views/widget/widget_observer.h
@@ -49,6 +49,8 @@ virtual void OnWidgetBoundsChanged(Widget* widget, const gfx::Rect& new_bounds) {} + virtual void OnWidgetThemeChanged(Widget* widget) {} + protected: ~WidgetObserver() override = default; };
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn index 9ee094d..3c00db3 100644 --- a/weblayer/BUILD.gn +++ b/weblayer/BUILD.gn
@@ -277,8 +277,6 @@ "browser/ssl_error_controller_client.h", "browser/stateful_ssl_host_state_delegate_factory.cc", "browser/stateful_ssl_host_state_delegate_factory.h", - "browser/subresource_filter_client_impl.cc", - "browser/subresource_filter_client_impl.h", "browser/subresource_filter_profile_context_factory.cc", "browser/subresource_filter_profile_context_factory.h", "browser/system_network_context_manager.cc", @@ -299,6 +297,8 @@ "browser/url_bar/url_bar_controller_impl.h", "browser/web_contents_view_delegate_impl.cc", "browser/web_contents_view_delegate_impl.h", + "browser/web_data_service_factory.cc", + "browser/web_data_service_factory.h", "browser/weblayer_browser_interface_binders.cc", "browser/weblayer_browser_interface_binders.h", "browser/weblayer_features.cc", @@ -490,6 +490,7 @@ "//components/web_cache/browser", "//components/webapps/browser", "//components/webapps/renderer", + "//components/webdata_services", "//components/webrtc", "//content:content_resources", "//content:dev_ui_content_resources",
diff --git a/weblayer/browser/DEPS b/weblayer/browser/DEPS index abfd830..0085849 100644 --- a/weblayer/browser/DEPS +++ b/weblayer/browser/DEPS
@@ -88,6 +88,7 @@ "+components/variations", "+components/version_info", "+components/web_cache/browser", + "+components/webdata_services", "+components/webapps/browser", "+components/webrtc", "+content/public",
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/AutofillTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/AutofillTest.java index e62d5f0..8e3e2c08 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/AutofillTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/AutofillTest.java
@@ -56,8 +56,15 @@ mEventsObserved = new ArrayList<>(); mHelper = new CallbackHelper(); mActivity = mActivityTestRule.launchShell(new Bundle()); + // There is no way to talk to TestWebLayer before the WebLayer is created. + // TestAutofillManagerWrapper can only replace AutofillProvider's AutofillMangerWrapper + // after initialization is done. So this test can't be used to test AutofillProvider's + // initialization. As WebLayer doesn't have specific code in AutofillProvider + // initialization, the AutofillProvider initialization is sufficiently tested via + // AwAutofillTest. TestWebLayer.getTestWebLayer(mActivity.getApplicationContext()) - .notifyOfAutofillEvents(null, () -> mHelper.notifyCalled(), mEventsObserved); + .notifyOfAutofillEvents( + mActivity.getBrowser(), () -> mHelper.notifyCalled(), mEventsObserved); mWebServer = TestWebServer.start(); } @@ -93,7 +100,7 @@ // Load the test page. mActivityTestRule.navigateAndWait(url); - + int callCount = mHelper.getCallCount(); // Select the "text1" element. mActivityTestRule.executeScriptSync("document.getElementById('text1').select();", false); // Press "a" to trigger Autofill. @@ -108,7 +115,7 @@ // Wait for Autofill events. mHelper.waitForCallback( - /* currentCallCount */ 0, /* numberOfCallsToWaitFor */ expected.size(), + /* currentCallCount */ callCount, /* numberOfCallsToWaitFor */ expected.size(), CallbackHelper.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS); Assert.assertEquals(expected, mEventsObserved);
diff --git a/weblayer/browser/browser_main_parts_impl.cc b/weblayer/browser/browser_main_parts_impl.cc index c53a9514..3674755 100644 --- a/weblayer/browser/browser_main_parts_impl.cc +++ b/weblayer/browser/browser_main_parts_impl.cc
@@ -44,6 +44,7 @@ #include "weblayer/browser/subresource_filter_profile_context_factory.h" #include "weblayer/browser/translate_accept_languages_factory.h" #include "weblayer/browser/translate_ranker_factory.h" +#include "weblayer/browser/web_data_service_factory.h" #include "weblayer/browser/webui/web_ui_controller_factory.h" #include "weblayer/grit/weblayer_resources.h" #include "weblayer/public/main.h" @@ -132,6 +133,7 @@ MediaRouterFactory::GetInstance(); } #endif + WebDataServiceFactory::GetInstance(); } void StopMessageLoop(base::OnceClosure quit_closure) {
diff --git a/weblayer/browser/java/BUILD.gn b/weblayer/browser/java/BUILD.gn index cc149c5..95f8540 100644 --- a/weblayer/browser/java/BUILD.gn +++ b/weblayer/browser/java/BUILD.gn
@@ -275,6 +275,7 @@ "//mojo/public/java:bindings_java", "//mojo/public/java:system_java", "//net/android:net_java", + "//services/data_decoder/public/cpp/android:safe_json_java", "//services/network/public/mojom:cookies_mojom_java", "//services/network/public/mojom:mojom_java", "//services/network/public/mojom:url_loader_base_java",
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java index eb8e5c0..d9ec7326 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
@@ -55,10 +55,12 @@ import org.chromium.components.browser_ui.contacts_picker.ContactsPickerDialog; import org.chromium.components.browser_ui.photo_picker.DecoderServiceHost; import org.chromium.components.browser_ui.photo_picker.ImageDecoder; +import org.chromium.components.browser_ui.photo_picker.PhotoPickerDelegateBase; import org.chromium.components.browser_ui.photo_picker.PhotoPickerDialog; import org.chromium.components.embedder_support.application.ClassLoaderContextWrapperFactory; import org.chromium.components.embedder_support.application.FirebaseConfig; import org.chromium.components.embedder_support.util.Origin; +import org.chromium.components.payments.PaymentDetailsUpdateService; import org.chromium.content_public.browser.BrowserStartupController; import org.chromium.content_public.browser.ChildProcessCreationParams; import org.chromium.content_public.browser.ChildProcessLauncherHelper; @@ -68,7 +70,6 @@ import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.net.NetworkChangeNotifier; import org.chromium.ui.base.PhotoPicker; -import org.chromium.ui.base.PhotoPickerDelegate; import org.chromium.ui.base.PhotoPickerListener; import org.chromium.ui.base.ResourceBundle; import org.chromium.ui.base.SelectFileDialog; @@ -326,21 +327,16 @@ }); DecoderServiceHost.setIntentSupplier(() -> { return createImageDecoderServiceIntent(); }); - SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegate() { + SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegateBase() { @Override public PhotoPicker showPhotoPicker(WindowAndroid windowAndroid, PhotoPickerListener listener, boolean allowMultiple, List<String> mimeTypes) { PhotoPickerDialog dialog = new PhotoPickerDialog(windowAndroid, windowAndroid.getContext().get().getContentResolver(), listener, - allowMultiple, /* animatedThumbnailsSupported = */ false, mimeTypes); + allowMultiple, mimeTypes); dialog.show(); return dialog; } - - @Override - public boolean supportsVideos() { - return false; - } }); performDexFixIfNecessary(packageInfo); @@ -482,6 +478,12 @@ } @Override + public IObjectWrapper createPaymentDetailsUpdateService() { + StrictModeWorkaround.apply(); + return ObjectWrapper.wrap(new PaymentDetailsUpdateService()); + } + + @Override public void enumerateAllProfileNames(IObjectWrapper valueCallback) { StrictModeWorkaround.apply(); final ValueCallback<String[]> callback =
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebLayer.aidl b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebLayer.aidl index 14c7880..feb14c0 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebLayer.aidl +++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebLayer.aidl
@@ -114,9 +114,12 @@ in IRemoteFragmentClient remoteFragmentClient, in IObjectWrapper fragmentArgs) = 25; - // Creates an instance of GooglePayDataCallbacksService. + // Creates an instance of GooglePayDataCallbacksService. Added in Version 92. IObjectWrapper createGooglePayDataCallbacksService() = 26; + // Creates an instance of PaymentDetailsUpdateService. Added in Version 92. + IObjectWrapper createPaymentDetailsUpdateService() = 27; + // WARNING: when choosing next value make sure you look back for the max, as // merges may mean the last function does not have the max value. }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/payments/test_support/WebLayerPaymentRequestBuilder.java b/weblayer/browser/java/org/chromium/weblayer_private/payments/test_support/WebLayerPaymentRequestBuilder.java index a2b0eae..34d5319 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/payments/test_support/WebLayerPaymentRequestBuilder.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/payments/test_support/WebLayerPaymentRequestBuilder.java
@@ -13,6 +13,7 @@ import org.chromium.components.payments.BrowserPaymentRequest; import org.chromium.components.payments.JourneyLogger; import org.chromium.components.payments.MojoPaymentRequestGateKeeper; +import org.chromium.components.payments.PaymentAppFactoryInterface; import org.chromium.components.payments.PaymentRequestService; import org.chromium.components.payments.PaymentRequestSpec; import org.chromium.content_public.browser.RenderFrameHost; @@ -195,4 +196,9 @@ Mockito.doReturn(weakContext).when(window).getContext(); return window; } + + @Override + public PaymentAppFactoryInterface createAndroidPaymentAppFactory() { + return null; + } }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/test/TestAutofillManagerWrapper.java b/weblayer/browser/java/org/chromium/weblayer_private/test/TestAutofillManagerWrapper.java index c1f934f..b6dd414 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/test/TestAutofillManagerWrapper.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/test/TestAutofillManagerWrapper.java
@@ -9,6 +9,7 @@ import android.view.View; import android.view.autofill.AutofillValue; +import org.chromium.base.Log; import org.chromium.components.autofill.AutofillManagerWrapper; import org.chromium.weblayer_private.test_interfaces.AutofillEventType; @@ -18,9 +19,13 @@ * A test AutofillManagerWrapper for AutofillTest */ public class TestAutofillManagerWrapper extends AutofillManagerWrapper { + public static final boolean DEBUG = false; + public static final String TAG = "AutofillTest"; + public TestAutofillManagerWrapper( Context context, Runnable onNewEvents, ArrayList<Integer> eventsObserved) { super(context); + if (DEBUG) Log.i(TAG, "TestAutofillManagerWrapper"); mOnNewEvents = onNewEvents; mEventsObserved = eventsObserved; } @@ -37,42 +42,49 @@ @Override public void notifyVirtualViewEntered(View parent, int childId, Rect absBounds) { + if (DEBUG) Log.i(TAG, "notifyVirtualViewEntered"); mEventsObserved.add(AutofillEventType.VIEW_ENTERED); mOnNewEvents.run(); } @Override public void notifyVirtualViewExited(View parent, int childId) { + if (DEBUG) Log.i(TAG, "notifyVirtualViewExited"); mEventsObserved.add(AutofillEventType.VIEW_EXITED); mOnNewEvents.run(); } @Override public void notifyVirtualValueChanged(View parent, int childId, AutofillValue value) { + if (DEBUG) Log.i(TAG, "notifyVirtualValueChanged"); mEventsObserved.add(AutofillEventType.VALUE_CHANGED); mOnNewEvents.run(); } @Override public void commit(int submissionSource) { + if (DEBUG) Log.i(TAG, "commit"); mEventsObserved.add(AutofillEventType.COMMIT); mOnNewEvents.run(); } @Override public void cancel() { + if (DEBUG) Log.i(TAG, "cancel"); mEventsObserved.add(AutofillEventType.CANCEL); mOnNewEvents.run(); } @Override public void notifyNewSessionStarted(boolean hasServerPrediction) { + if (DEBUG) Log.i(TAG, "notifyNewSessionStarted"); mEventsObserved.add(AutofillEventType.SESSION_STARTED); mOnNewEvents.run(); } @Override public void onQueryDone(boolean success) { + if (DEBUG) Log.i(TAG, "onQueryDone " + success); mEventsObserved.add(AutofillEventType.QUERY_DONE); mOnNewEvents.run(); }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/test/TestWebLayerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/test/TestWebLayerImpl.java index c449af7..c345011 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/test/TestWebLayerImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/test/TestWebLayerImpl.java
@@ -4,7 +4,6 @@ package org.chromium.weblayer_private.test; -import android.content.Context; import android.os.IBinder; import android.os.RemoteException; import android.view.View; @@ -17,8 +16,6 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.UsedByReflection; -import org.chromium.components.autofill.AutofillManagerWrapper; -import org.chromium.components.autofill.AutofillProvider; import org.chromium.components.autofill.AutofillProviderTestHelper; import org.chromium.components.infobars.InfoBarAnimationListener; import org.chromium.components.infobars.InfoBarUiItem; @@ -298,14 +295,11 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { AutofillProviderTestHelper.disableDownloadServerForTesting(); - AutofillProvider.setAutofillManagerWrapperFactoryForTesting( - new AutofillProvider.AutofillManagerWrapperFactoryForTesting() { - @Override - public AutofillManagerWrapper create(Context context) { - return new TestAutofillManagerWrapper( - context, unwrappedOnNewEvents, unwrappedEventsObserved); - } - }); + BrowserImpl browserImpl = (BrowserImpl) browser; + TabImpl tab = browserImpl.getActiveTab(); + tab.getAutofillProviderForTesting().replaceAutofillManagerWrapperForTesting( + new TestAutofillManagerWrapper(browserImpl.getContext(), unwrappedOnNewEvents, + unwrappedEventsObserved)); }); }
diff --git a/weblayer/browser/subresource_filter_client_impl.cc b/weblayer/browser/subresource_filter_client_impl.cc deleted file mode 100644 index 6b57d3b0..0000000 --- a/weblayer/browser/subresource_filter_client_impl.cc +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "weblayer/browser/subresource_filter_client_impl.h" - -#include <string> - -#include "base/macros.h" -#include "build/build_config.h" -#include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" -#include "components/subresource_filter/content/browser/ruleset_service.h" -#include "components/subresource_filter/core/browser/subresource_filter_features.h" -#include "components/subresource_filter/core/common/activation_decision.h" -#include "components/subresource_filter/core/common/activation_scope.h" -#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" -#include "content/public/browser/navigation_handle.h" -#include "content/public/browser/render_frame_host.h" -#include "weblayer/browser/browser_process.h" -#include "weblayer/browser/safe_browsing/safe_browsing_service.h" -#include "weblayer/browser/subresource_filter_profile_context_factory.h" - -#if defined(OS_ANDROID) -#include "components/safe_browsing/android/remote_database_manager.h" -#include "weblayer/browser/infobar_service.h" -#endif - -namespace safe_browsing { -class SafeBrowsingDatabaseManager; -} - -namespace weblayer { - -namespace { - -// Returns a scoped refptr to the SafeBrowsingService's database manager, if -// available. Otherwise returns nullptr. -const scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> -GetDatabaseManagerFromSafeBrowsingService() { -#if defined(OS_ANDROID) - SafeBrowsingService* safe_browsing_service = - BrowserProcess::GetInstance()->GetSafeBrowsingService(); - return safe_browsing_service - ? scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>( - safe_browsing_service->GetSafeBrowsingDBManager()) - : nullptr; -#else - return nullptr; -#endif -} - -} // namespace - -SubresourceFilterClientImpl::SubresourceFilterClientImpl() = default; -SubresourceFilterClientImpl::~SubresourceFilterClientImpl() = default; - -// static -void SubresourceFilterClientImpl::CreateThrottleManagerWithClientForWebContents( - content::WebContents* web_contents) { - subresource_filter::RulesetService* ruleset_service = - BrowserProcess::GetInstance()->subresource_filter_ruleset_service(); - subresource_filter::VerifiedRulesetDealer::Handle* dealer = - ruleset_service ? ruleset_service->GetRulesetDealer() : nullptr; - subresource_filter::ContentSubresourceFilterThrottleManager:: - CreateForWebContents( - web_contents, std::make_unique<SubresourceFilterClientImpl>(), - SubresourceFilterProfileContextFactory::GetForBrowserContext( - web_contents->GetBrowserContext()), - // Infobars are supported only on Android in WebLayer. This is not a - // problem as the subresource filter shows the infobar only on Android - // as well. -#if defined(OS_ANDROID) - InfoBarService::FromWebContents(web_contents), -#else - nullptr, -#endif - GetDatabaseManagerFromSafeBrowsingService(), dealer); -} - -} // namespace weblayer
diff --git a/weblayer/browser/subresource_filter_client_impl.h b/weblayer/browser/subresource_filter_client_impl.h deleted file mode 100644 index 0330b82..0000000 --- a/weblayer/browser/subresource_filter_client_impl.h +++ /dev/null
@@ -1,52 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WEBLAYER_BROWSER_SUBRESOURCE_FILTER_CLIENT_IMPL_H_ -#define WEBLAYER_BROWSER_SUBRESOURCE_FILTER_CLIENT_IMPL_H_ - -#include <memory> -#include <utility> - -#include "components/subresource_filter/content/browser/subresource_filter_client.h" -#include "url/gurl.h" - -namespace content { -class WebContents; -} // namespace content - -namespace subresource_filter { -class ContentSubresourceFilterThrottleManager; -} // namespace subresource_filter - -namespace weblayer { - -// WebLayer implementation of SubresourceFilterClient. Instances are associated -// with and owned by ContentSubresourceFilterThrottleManager instances. -class SubresourceFilterClientImpl - : public subresource_filter::SubresourceFilterClient { - public: - SubresourceFilterClientImpl(); - ~SubresourceFilterClientImpl() override; - - SubresourceFilterClientImpl(const SubresourceFilterClientImpl&) = delete; - SubresourceFilterClientImpl& operator=(const SubresourceFilterClientImpl&) = - delete; - - // Creates a ContentSubresourceFilterThrottleManager and attaches it to - // |web_contents|, passing it an instance of this client and other - // embedder-level state. - static void CreateThrottleManagerWithClientForWebContents( - content::WebContents* web_contents); - - // SubresourceFilterClient: - void OnNotificationShown() override {} - - private: - std::unique_ptr<subresource_filter::ContentSubresourceFilterThrottleManager> - throttle_manager_; -}; - -} // namespace weblayer - -#endif // WEBLAYER_BROWSER_SUBRESOURCE_FILTER_CLIENT_IMPL_H_
diff --git a/weblayer/browser/tab_impl.cc b/weblayer/browser/tab_impl.cc index a752023..38ffa81 100644 --- a/weblayer/browser/tab_impl.cc +++ b/weblayer/browser/tab_impl.cc
@@ -34,6 +34,8 @@ #include "components/permissions/permission_result.h" #include "components/prefs/pref_service.h" #include "components/sessions/content/session_tab_helper.h" +#include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" +#include "components/subresource_filter/content/browser/ruleset_service.h" #include "components/translate/core/browser/translate_manager.h" #include "components/ukm/content/source_url_recorder.h" #include "components/webapps/browser/installable/installable_manager.h" @@ -78,7 +80,8 @@ #include "weblayer/browser/persistence/browser_persister.h" #include "weblayer/browser/popup_navigation_delegate_impl.h" #include "weblayer/browser/profile_impl.h" -#include "weblayer/browser/subresource_filter_client_impl.h" +#include "weblayer/browser/safe_browsing/safe_browsing_service.h" +#include "weblayer/browser/subresource_filter_profile_context_factory.h" #include "weblayer/browser/translate_client_impl.h" #include "weblayer/browser/weblayer_features.h" #include "weblayer/common/isolated_world_ids.h" @@ -104,6 +107,7 @@ #include "components/embedder_support/android/contextmenu/context_menu_builder.h" #include "components/embedder_support/android/delegate/color_chooser_android.h" #include "components/javascript_dialogs/tab_modal_dialog_manager.h" // nogncheck +#include "components/safe_browsing/android/remote_database_manager.h" #include "components/translate/core/browser/translate_manager.h" #include "ui/android/view_android.h" #include "ui/gfx/android/java_bitmap.h" @@ -253,6 +257,46 @@ : content::WebContentsObserver(web_contents) {} }; +// Returns a scoped refptr to the SafeBrowsingService's database manager, if +// available. Otherwise returns nullptr. +const scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> +GetDatabaseManagerFromSafeBrowsingService() { +#if defined(OS_ANDROID) + SafeBrowsingService* safe_browsing_service = + BrowserProcess::GetInstance()->GetSafeBrowsingService(); + return safe_browsing_service + ? scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>( + safe_browsing_service->GetSafeBrowsingDBManager()) + : nullptr; +#else + return nullptr; +#endif +} + +// Creates a ContentSubresourceFilterThrottleManager for |web_contents|, passing +// it the needed embedder-level state. +void CreateContentSubresourceFilterThrottleManagerForWebContents( + content::WebContents* web_contents) { + subresource_filter::RulesetService* ruleset_service = + BrowserProcess::GetInstance()->subresource_filter_ruleset_service(); + subresource_filter::VerifiedRulesetDealer::Handle* dealer = + ruleset_service ? ruleset_service->GetRulesetDealer() : nullptr; + subresource_filter::ContentSubresourceFilterThrottleManager:: + CreateForWebContents( + web_contents, + SubresourceFilterProfileContextFactory::GetForBrowserContext( + web_contents->GetBrowserContext()), + // Infobars are supported only on Android in WebLayer. This is not a + // problem as the subresource filter shows the infobar only on Android + // as well. +#if defined(OS_ANDROID) + InfoBarService::FromWebContents(web_contents), +#else + nullptr, +#endif + GetDatabaseManagerFromSafeBrowsingService(), dealer); +} + } // namespace #if defined(OS_ANDROID) @@ -327,7 +371,7 @@ InfoBarService::CreateForWebContents(web_contents_.get()); #endif - SubresourceFilterClientImpl::CreateThrottleManagerWithClientForWebContents( + CreateContentSubresourceFilterThrottleManagerForWebContents( web_contents_.get()); sessions::SessionTabHelper::CreateForWebContents(
diff --git a/weblayer/browser/web_data_service_factory.cc b/weblayer/browser/web_data_service_factory.cc new file mode 100644 index 0000000..e3214cf --- /dev/null +++ b/weblayer/browser/web_data_service_factory.cc
@@ -0,0 +1,56 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "weblayer/browser/web_data_service_factory.h" + +#include "base/bind.h" +#include "base/files/file_path.h" +#include "base/notreached.h" +#include "components/webdata_services/web_data_service_wrapper.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "weblayer/browser/i18n_util.h" + +namespace weblayer { + +namespace { + +// Callback to show error dialog on profile load error. +void ProfileErrorCallback(WebDataServiceWrapper::ErrorType error_type, + sql::InitStatus status, + const std::string& diagnostics) { + NOTIMPLEMENTED(); +} + +} // namespace + +WebDataServiceFactory::WebDataServiceFactory() = default; + +WebDataServiceFactory::~WebDataServiceFactory() = default; + +// static +WebDataServiceFactory* WebDataServiceFactory::GetInstance() { + static base::NoDestructor<WebDataServiceFactory> instance; + return instance.get(); +} + +content::BrowserContext* WebDataServiceFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + return context; +} + +KeyedService* WebDataServiceFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + const base::FilePath& profile_path = context->GetPath(); + return new WebDataServiceWrapper(profile_path, i18n::GetApplicationLocale(), + content::GetUIThreadTaskRunner({}), + base::BindRepeating(&ProfileErrorCallback)); +} + +bool WebDataServiceFactory::ServiceIsNULLWhileTesting() const { + return true; +} + +} // namespace weblayer
diff --git a/weblayer/browser/web_data_service_factory.h b/weblayer/browser/web_data_service_factory.h new file mode 100644 index 0000000..99e1d793 --- /dev/null +++ b/weblayer/browser/web_data_service_factory.h
@@ -0,0 +1,39 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBLAYER_BROWSER_WEB_DATA_SERVICE_FACTORY_H_ +#define WEBLAYER_BROWSER_WEB_DATA_SERVICE_FACTORY_H_ + +#include "base/no_destructor.h" +#include "components/webdata_services/web_data_service_wrapper_factory.h" + +namespace weblayer { + +// Singleton that owns all WebDataServiceWrappers and associates them with +// Profiles. +class WebDataServiceFactory + : public webdata_services::WebDataServiceWrapperFactory { + public: + WebDataServiceFactory(const WebDataServiceFactory&) = delete; + WebDataServiceFactory& operator=(const WebDataServiceFactory&) = delete; + + static WebDataServiceFactory* GetInstance(); + + private: + friend class base::NoDestructor<WebDataServiceFactory>; + + WebDataServiceFactory(); + ~WebDataServiceFactory() override; + + // |BrowserContextKeyedServiceFactory| methods: + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* profile) const override; + bool ServiceIsNULLWhileTesting() const override; +}; + +} // namespace weblayer + +#endif // WEBLAYER_BROWSER_WEB_DATA_SERVICE_FACTORY_H_
diff --git a/weblayer/public/java/AndroidManifest.xml b/weblayer/public/java/AndroidManifest.xml index 8b2b7f6..df5a0db 100644 --- a/weblayer/public/java/AndroidManifest.xml +++ b/weblayer/public/java/AndroidManifest.xml
@@ -115,15 +115,25 @@ </intent-filter> </service> + <!-- GooglePay payment app support --> + <meta-data + android:name="com.google.android.gms.wallet.api.enabled" + android:value="true" /> + + <!-- Service used by payment apps to notify the browser about changes in user selected + payment method, shipping address, or shipping option. --> + <service + android:name="org.chromium.weblayer.PaymentDetailsUpdateServiceWrapper" + android:exported="true"> + <intent-filter> + <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS"/> + </intent-filter> + </service> + <!-- Cast support --> <!-- TODO(crbug.com/1148410): remove this. --> <meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="org.chromium.components.media_router.caf.CastOptionsProvider"/> - - <!-- GooglePay payment app support --> - <meta-data - android:name="com.google.android.gms.wallet.api.enabled" - android:value="true" /> </application> </manifest>
diff --git a/weblayer/public/java/BUILD.gn b/weblayer/public/java/BUILD.gn index 3d23bdf..2308b18f 100644 --- a/weblayer/public/java/BUILD.gn +++ b/weblayer/public/java/BUILD.gn
@@ -87,6 +87,7 @@ "org/chromium/weblayer/ObserverList.java", "org/chromium/weblayer/OpenUrlCallback.java", "org/chromium/weblayer/Page.java", + "org/chromium/weblayer/PaymentDetailsUpdateServiceWrapper.java", "org/chromium/weblayer/PrerenderController.java", "org/chromium/weblayer/Profile.java", "org/chromium/weblayer/RemoteFragment.java",
diff --git a/weblayer/public/java/org/chromium/weblayer/PaymentDetailsUpdateServiceWrapper.java b/weblayer/public/java/org/chromium/weblayer/PaymentDetailsUpdateServiceWrapper.java new file mode 100644 index 0000000..da5659e5 --- /dev/null +++ b/weblayer/public/java/org/chromium/weblayer/PaymentDetailsUpdateServiceWrapper.java
@@ -0,0 +1,78 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.weblayer; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.os.RemoteException; + +import androidx.annotation.Nullable; + +import org.chromium.weblayer_private.interfaces.APICallException; +import org.chromium.weblayer_private.interfaces.IObjectWrapper; +import org.chromium.weblayer_private.interfaces.IWebLayer; +import org.chromium.weblayer_private.interfaces.ObjectWrapper; + +/** + * A client-side service that wraps the impl-side PaymentDetailsUpdateService. WebLayer embedders + * export this service via //weblayer/public/java/AndroidManifest.xml so external payment apps can + * notify WebLayer of any updates to the selected payment details. + * + * @since 92 + */ +public class PaymentDetailsUpdateServiceWrapper extends Service { + /** The impl-side of PaymentDetailsUpdateService. Can be null if WebLayer wasn't loaded yet. */ + @Nullable + private Service mService; + + @Override + public void onCreate() { + ThreadCheck.ensureOnUiThread(); + Service service = createService(); + if (service == null) { + stopSelf(); + return; + } + mService = service; + mService.onCreate(); + } + + @Nullable + private Service createService() { + if (WebLayer.getSupportedMajorVersionInternal() < 92) { + throw new UnsupportedOperationException(); + } + + // WebLayer started the calling app so we assume WebLayer is still running. This service is + // not supposed to be started when WebLayer isn't running so we can safely ignore requests + // in that case. + if (!WebLayer.hasWebLayerInitializationStarted()) return null; + WebLayer webLayer = WebLayer.getLoadedWebLayer(this); + if (webLayer == null) return null; + IWebLayer iWebLayer = webLayer.getImpl(); + if (iWebLayer == null) return null; + + IObjectWrapper objectWrapper; + try { + objectWrapper = iWebLayer.createPaymentDetailsUpdateService(); + } catch (RemoteException e) { + throw new APICallException(e); + } + if (objectWrapper == null) return null; + return ObjectWrapper.unwrap(objectWrapper, Service.class); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + if (mService == null) return null; + try { + return mService.onBind(intent); + } catch (Exception e) { + throw new APICallException(e); + } + } +}
diff --git a/weblayer/test/subresource_filter_browser_test_harness.cc b/weblayer/test/subresource_filter_browser_test_harness.cc index b7f7859..8bcb7e61 100644 --- a/weblayer/test/subresource_filter_browser_test_harness.cc +++ b/weblayer/test/subresource_filter_browser_test_harness.cc
@@ -14,7 +14,6 @@ #include "testing/gtest/include/gtest/gtest.h" #include "weblayer/browser/browser_process.h" #include "weblayer/browser/heavy_ad_service_factory.h" -#include "weblayer/browser/subresource_filter_client_impl.h" #include "weblayer/browser/tab_impl.h" #include "weblayer/shell/browser/shell.h" #include "weblayer/test/weblayer_browser_test_utils.h"
diff --git a/weblayer/test/weblayer_browser_test_utils.cc b/weblayer/test/weblayer_browser_test_utils.cc index 68e0b428..8774984 100644 --- a/weblayer/test/weblayer_browser_test_utils.cc +++ b/weblayer/test/weblayer_browser_test_utils.cc
@@ -11,7 +11,6 @@ #include "components/subresource_filter/content/browser/fake_safe_browsing_database_manager.h" #include "url/gurl.h" #include "weblayer/browser/browser_process.h" -#include "weblayer/browser/subresource_filter_client_impl.h" #include "weblayer/browser/tab_impl.h" #include "weblayer/public/navigation_controller.h" #include "weblayer/public/tab.h"